文档库 最新最全的文档下载
当前位置:文档库 › MFC中用户界面元素更新原理(UPDATE_COMMAND_UI)

MFC中用户界面元素更新原理(UPDATE_COMMAND_UI)

MFC中用户界面元素更新原理(UPDATE_COMMAND_UI)
MFC中用户界面元素更新原理(UPDATE_COMMAND_UI)

大家在编程的过程中一定遇到过这种情况:需要根据某个变量的值来设定菜单项是否被选中,设置工具栏按钮是否被按下或者在状态栏中显示一些信息。MFC提供了一种机制来帮助我们完成这项工作:只要用ClassWizard给相应的菜单项或者工具栏按钮添加一个UPDATE_COMMAND_UI处理函数,在其中用CcmdUI::SetCheck等函数来设置这些用户界面元素的状态就可以了。但是MFC 是怎么实现这个功能的呢?

首先让我们来看看菜单状态更新的实现方法。首先要知道,当你点现了一个有子菜单的菜单项时(比如菜单栏上的“文件”),系统会向拥有这个菜单的窗口发送一个WM_INITMENUPOPUP,下面是MFC对这个消息的默认处理:void CFrameWnd::OnInitMenuPopup(CMenu* pMenu, UINT nIndex, BOOL bSysMenu){

//为了说明问题,我省略了很多代码

CCmdUI state;

state.m_pMenu = pMenu;

state.m_nIndexMax = pMenu->GetMenuItemCount();

for (state.m_nIndex = 0; state.m_nIndex <

state.m_nIndexMax;state.m_nIndex++){

state.m_nID = pMenu->GetMenuItemID(state.m_nIndex);

if (state.m_nID == (UINT)-1)

{

//m_nID==-1表示它下面还有popup menu(就那种带右箭头的菜单项),

//它是不会自动deisable的

}

else

{

state.m_pSubMenu = NULL;

state.DoUpdate(this, m_bAutoMenuEnable && state.m_nID < 0xF000);

}

}

下面是CCmdUI::DoUpdate的代码:

BOOL CCmdUI::DoUpdate(CCmdTarget* pTarget, BOOL bDisableIfNoHndler){

m_bEnableChanged = FALSE;

BOOL bResult=pTarget->OnCmdMsg(m_nID,CN_UPDATE_COMMAND_UI,

this, NULL);

if (bDisableIfNoHndler && !m_bEnableChanged){

AFX_CMDHANDLERINFO info;

info.pTarget = NULL;

BOOL bHandler = pTarget->OnCmdMsg(m_nID, CN_COMMAND, this, &info);

Enable(bHandler);

}

return bResult;

}

DoUpdate的流程就是:先向你的菜单项发一个CN_UPDATE_COMMAND_UI命令消息,让你的菜单项来进行显示前的更新,这就是你在classwizard中可以看到的UPDATE_COMMADN_UI消息,你加的处理函数就是在这个时候被调用的。如果你处理了CN_UPDATE_COMMAND_UI,那么m_bEnableChanged就变成true,接下来就直接返回了。否则,如果bDisableIfNoHndler也为true,那么就向菜单项发一个CN_COMMAND消息,如果你不响应这个消息,说明这个菜单项还没有处理函数,那么,bnHandler就是flase,然后Enable(false)就把你的菜单项变灰了。注意在CFrameWnd::OnInitMenuPopup中调用DoUpdate时的参数是

m_bAutoMenuEnable && state.m_nID<0xF000,这说如果你一开始就把

m_bAutoMenuEnable设为false的话,实际上就关闭了MFC自动diable没有处理函数的菜单项的功能。

工具栏的更新用的是另外一套方法。首先需要知道当你的的程序变得空闲,没有消息需要处理的时候,MFC会调用CWinApp::OnIdle函数利用这个时间进行一些特殊的工作,其中之一就是更新你的工具栏和状态栏。下面来看相关的代码:

BOOL CWinThread::OnIdle(LONG lCount){

if (lCount <= 0){

//依次向main window及其所有子窗口发送WM_IDLEUPDATECMDUI消息,这个消息指示接收窗口进行更新操作

CWnd* pMainWnd = m_pMainWnd;

if (pMainWnd != NULL && pMainWnd->m_hWnd != NULL &&

pMainWnd->IsWindowVisible())

{

AfxCallWndProc(pMainWnd, pMainWnd->m_hWnd,

WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0);

pMainWnd->SendMessageToDescendants

(WM_IDLEUPDATECMDUI,(WPARAM)TRUE, 0, TRUE, TRUE);

}

//接下来向本线程创建的所有frame window发送WM_IDLEUPDATECMDUI消息

AFX_MODULE_THREAD_STATE* pState=

_AFX_CMDTARGET_GETSTATE()->m_thread;

CFrameWnd* pFrameWnd = pState->m_frameList;

while (pFrameWnd != NULL){

if

(pFrameWnd->IsWindowVisible()||pFrameWnd->m_nShowDelay >= 0){

AfxCallWndProc(pFrameWnd, pFrameWnd->m_hWnd,

WM_IDLEUPDATECMDUI, (WPARAM)TRUE, 0);

pFrameWnd->SendMessageToDescendants(WM_IDLEUPDA TECMDUI,

(WPARAM)TRUE, 0, TRUE, TRUE);

}

}

}

}

你的toolbar或者statusbar总是某个frame window的子窗口(包括子窗口的子窗口…),所以它肯定能收到WM_IDLEUPDATECMDUI消息。CToolBar和CStatusBar 都是从CControlBar派生的,下面是CControlBar对这个消息的处理:

LRESULT CControlBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)

{

if ((GetStyle() & WS_VISIBLE) )

{

//将pTarget指向离this最近的父frame window

CFrameWnd* pTarget = (CFrameWnd*)GetOwner();

if (pTarget == NULL || !pTarget->IsFrameWnd())

pTarget = GetParentFrame();

//调用虚成员函数OnUpdateCmdUI

if (pTarget != NULL)

OnUpdateCmdUI(pTarget, (BOOL)wParam);

}

return 0L;

}

OnUpdateCmdUI是CControlBar类的一个纯虚函数,CToolBar中对这个函数进行了定义:

void CToolBar::OnUpdateCmdUI(CFrameWnd* pTarget, BOOL bDisableIfNoHndler){

CToolCmdUI state;

state.m_pOther = this;

state.m_nIndexMax = DefWindowProc(TB_BUTTONCOUNT, 0, 0); //工具栏上的按钮数

for (state.m_nIndex=0; state.m_nIndex < state.m_nIndexMax; state.m_nIndex++){

//如果你派生了自己的CToolBar类,那么先让执行你定义的处理函数来进行状态更新

if (CWnd::OnCmdMsg(state.m_nID, CN_UPDATE_COMMAND_UI, &state, NULL))

continue;

//如果toolbar没有更新自己,让pTarget(也就是离它最近的父frame window)来更新它。比如对于MFC自动生成的SDI框架来说,pTarget会指向CMainFrame

state.DoUpdate(pTarget, bDisableIfNoHndler);

}

}

//如果CToolBar中有用户创建的控件,也一起更新

UpdateDialogControls(pTarget, bDisableIfNoHndler);

}

CCmdUI::DoUpdate的代码上面已经列出过了。至此,工具栏和状态栏也能顺利也进行更了。

有经验的朋友应该知道,如果你在一个基于对话框的程序里模仿doc/view结构中的方法使用UPDATE_COMMAND_UI来更新用户界面元素的话是不会有任何效果的。其原因是一个模态对话显示出来以后,程序就会进入这个对话框自己的消息循环(看看DoModal的源码就能了解这一点),此时不会再有WM_IDLEUPDATECMDUI 被发送到这些界面元素中。下面说说这种情况下的解决办法,你可以自己查看MFC的源码来弄清它的原理:首先加一个头文件afxpriv.h(其中定义了KICKIDLE

消息),然后添加一个消息映射来处理WM_KICKIDLE消息:

ON_MESSAGE(WM_KICKIDLE,OnKickIdle)。其中OnKickIdle定义如下:LRESULT CTabDialog::OnKickIdle(WPARAM wp, LPARAM lCount){ UpdateDialogControls(this, TRUE);

return 0;

}

完成这些工作以后,你就可以顺利地使用UPDATE_COMMAND_UI机制了。

---------------------------

CCmdUI

CCmdUI没有基类

它仅在一个CCmdTarget派生类的ON_UPDATE_COMMAND_UI处理程序中使用。

当用户在应用的下拉菜单时,要确定每个菜单项的显示状态——允许存取或禁止存取。菜单命令的目标通过实现一个ON_UPDATE_COMMAND_UI处理来提供这些信息。可以使用ClassWizard来浏览定位应用中的命令用户接口对象,然后为它建立一个消息映射入口,并为每个消息处理函数提供函数原型。

当菜单被下拉时,框架搜索并调用每个ON_UPDATE_COMMAND_UI处理,每个处理调用Enable和Check之类的成员函数,相应地,框架就可以正确地显示每个菜单项了。

菜单项可以用控件条按钮或者其它的命令用户接口对象替换,而在

ON_UPDATE_COMMAND_UI处理中的代码不需要改动。

下表列出了各种命令用户接口上的CCmdGUI的成员函数。

用户接口项 Enable SetCheck SetRadio SetText

菜单项允许或禁止存取该项选中(ⅹ)或未选中选中(有黑点)设置项的文本

工具条按钮允许或禁止存取该项选中、未选中或不定(不可用)与SetCheck 相同

状态条状态提示文本可见或不可见设置凸出或正常边框与SetCheck相同设置状态条的提示文本

CDialogBar中的普通按钮允许或禁止存取该项复选框选中或未选中与SetCheck相同设置按钮的文本

CDialogBar中的普通按钮允许或禁止存取该项(不可用)(不可用)设置窗口中的文本

有关使用类CCmdGUI的更详细信息,请参阅联机文档“Visual C++教程”中的“构造用户界面”部分和联机文档“Visual C++程序员指南”中的“如何更新用户界面对象”部分。

私募基金八大策略介绍

私募基金八大策略介绍 私募基金在国际金融市场上发展十分快速,并已占据十分重要的位置,几乎所有国际知名的金融控股公司都从事私募基金管理业务,同时也培育出了像索罗斯、巴菲特这样的投资大鳄。 而国内私募基金也驶入快车道,据中国基金业协会发布的最新数据显示,2016年4月,已登记私募基金管理人26045家;已备案私募基金31347只。国内的私募江湖也人才辈出,在这个战场里,我们见识过王亚伟、徐翔、刘世强、葛卫东、杨海等江山豪杰。 由于私募基金的信息透明度不高,其资金运作和收益状况,都不是公开进行的,投资者往往误认为私募基金运作风险大于收益。其实,私募基金成立时,都会选择稳定可靠、信誉好的合伙人,这点就迫使私募基金运作较为谨慎,自律加上内压式的管理模式,有利于规避风险,同时减少监管带来的巨大成本;而且,私募基金操作的高度灵活性和持仓品种的多样化,往往能抢得市场先机,赢得主动,使创造高额收益成为可能。 私募阳光化一直在曲折中艰难推进,直到2013年6月1日新《基金法》正式实施,把私募基金正式纳入监管范畴;2014年1月17日,基金业协会发布《私募投资基金管理人登记和基金备案办法(试行)》,私募行业的实质性监管政策才得以落地。 随着私募基金蓬勃发展,投资策略也逐渐多样化,基金投资策略可谓是百花齐放。为方便投资者更清晰的理解,经过精细梳理对目前私募行业所有的投资策略进行了细化,按投资策略分类主要分为:股票策略、事件驱动、管理期货、相对价值、宏观策略、债券基金、组合基金、复合策略等主要策略分类。以下将对各类型策略进行详细阐述。 股票策略 股票策略以股票为主要投资标的,是目前国内阳光私募行业最主流的投资策略,约有8成以上的私募基金采用该策略,内含股票多头、股票多空、股票市场中性三种子策略。目前国内的私募基金运作最多的投资策略即为股票策略。 1、股票多头

实验三 MFC 消息映射编程实验

实验三MFC 消息映射编程实验 一、实验目的 (1) 熟悉Visual Studio 开发环境; (2) 掌握消息映射机制的基本原理和手工添加消息映射的方法; (3) 熟练掌握在Visual Studio 开发环境调试程序的方法。 二、实验内容 设计MFC 应用程序,手工添加消息映射,实现下面的功能: (1) 按下CTRL 键,拖动鼠标绘制矩形; (2) 按下SHIFT 键,拖动鼠标绘制椭圆。 三、实验结果 (1)总结手工添加消息映射的基本步骤; 1、在BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间添加消息映射宏; BEGIN_MESSAGE_MAP(CDemoView, CView) ON_MESSAGE(WM_KEYDOWN, OnKeyDown) ON_COMMAND(ID_OPER_TEST, OnOperTest) END_MESSAGE_MAP( ) 2 、在类声明中声明成员函数; 3、在类的实现部分实现成员函数。列出鼠标绘图功能的实现代码; (2)列出鼠标绘图功能的实现代码; 头文件: #include "afxwin.h" class CDemoWnd:public CFrameWnd { public: CDemoWnd(); ~CDemoWnd(); public: LRESULT OnPaint(WPARAM wParam,LPARAM lParam); LRESULT OnLButtonDown(WPARAM wParam,LPARAM lParam); LRESULT OnMouseMove(WPARAM wParam,LPARAM lParam); DECLARE_MESSAGE_MAP() public: int m_nX0; int m_nY0; int m_nX1;

杨永兴:事件驱动交易策略

杨永兴:事件驱动交易策略(2012-10-28 13:22:19) 核心提示:成绩如此出色,少年私募英雄杨永兴究竟掌握了什么制胜法宝?4月2日,《每日经济新闻》专访了策略大师基金的管理团队,证通天下董事长杨永兴、证通天下总经理李世勇(以下统称为"策略大师")向记者透露了他们的宝贵经验。 在股市中把600万元变成一个亿,需要多少时间?有人会说5年、10年,也许更长,但有人只花了10个月。 在2007年朝阳永续的实盘大赛中,硅谷基金的投资经理杨永兴以高达1497%的收益率,完成了这个看似不可能完成的任务,其成绩远远超过当时参加评比的其他阳光私募和券商集合理财。当时,他只有25岁。 2009年3月2日,杨永兴再次带领他的团队扬帆起航,在重庆国投发行了一款名为"策略大师"的阳光私募信托计划。3月27日,经过短短20个交易日的运作,策略大师的单位净值已从1元猛增到1.467元,收益率高达46.7%,再次上演不可能完成的任务。成绩如此出色,少年私募英雄杨永兴究竟掌握了什么制胜法宝?4月2日,《每日经济新闻》专访了策略大师基金的管理团队,证通天下董事长杨永兴、证通天下总经理李世勇(以下统称为"策略大师")向记者透露了他们的宝贵经验。

制胜法宝快进快出只参与上涨趋势 NBD:你的阳光私募基金自3月2日成立以来,获取了46%的收益,成为2009年私募界的第一名。获胜的法宝是什么? 策略大师:我们最大的优势在于极强的风险控制意识和把握短期趋势的能力。首先,我们在投资前想的第一件事就是此次投资最大的风险在哪里?可能会有多大的亏损?有什么应对措施?在做好了最充分的准备之后,我们才会开始考虑潜在收益等因素。正是这种保守的风格,让策略大师的研究团队充分规避了2008年熊市的风险。其次,策略大师研究团队对中短期趋势的判断能力要远远强于对中长期趋势的判断。 当前中国A股市场游资和散户的力量相当强大,它们的交易偏好以及反映在盘面上的特征都很有规律,充分认识并利用这些规律,只参与其中风险最小、利润最大的几个时间阶段,就有可能实现持续复利。在操作上,我们基本不参与盘整和下跌,我们只参与上涨趋势。 NBD:策略大师主要的操作风格是快进快出、短线为主,在操作上具体有什么特点?

消息映射编程实验

MFC 消息映射编程实验 实 验 报 告 姓名:杨培培 班级:电气12级3班 12053307

【预备知识】 1、消息映射 消息映射本质上就是一个数组,MFC 使用消息映射建立消息和类的成员函数的对应关系。消息映射数组中存储的信息 (1) 所处理的消息; (2) 消息应用的控件ID,或者ID 范围; (3) 消息所传递的参数; (4) 消息所期望的返回值。 2、消息映射宏 下面介绍常用的两个消息映射宏: (1)ON_MESSAGE:处理任意消息 语法规则: ON_MESSAGE(ID,func) LRESULT func(WPARAM wParam, LPARAM lParam); 举例:映射鼠标左键按下消息 ON_MESSAGE(WM_LBUTTONDOWN, OnLButtonDown) LRESULT OnLButtonDown(WPARAM wParam, LPARAM lParam); (2)ON_COMMAND:处理WM_COMMAND 消息 语法规则: ON_COMMAND(ID,func) void func( ); 举例:映射菜单项命令消息

ON_COMMAND(ID_OPER_TEST, OnOperTest) void OnOperTest ( ); 3、消息映射步骤 MFC 中手工添加消息映射按照如下步骤进行: (1)在BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP 之间添加消息映射 宏; BEGIN_MESSAGE_MAP(CDemoView, CView) ON_MESSAGE(WM_KEYDOWN, OnKeyDown) ON_COMMAND(ID_OPER_TEST, OnOperTest) END_MESSAGE_MAP( ) (2) 在类声明中声明成员函数; (3) 在类的实现部分实现成员函数。 【实验目的】 (1) 熟悉Visual Studio 开发环境; (2) 掌握消息映射机制的基本原理和手工添加消息映射的方法; (3) 熟练掌握在Visual Studio 开发环境调试程序的方法。【实验内容】 设计 MFC 应用程序,手工添加消息映射,实现下面的功能: (1) 按下CTRL 键,拖动鼠标绘制矩形; (2) 按下SHIFT 键,拖动鼠标绘制椭圆。 【实验报告】 (1) 总结手工添加消息映射的基本步骤;

2021年事件驱动策略的因子化特征之欧阳学文创编

事件驱动策略的因子化特征 欧阳光明(2021.03.07) 2016-05-30 16:01:00 1. 引言 本篇报告旨在对若干类事件进行综合量化分析,使投资者更加深入的理解不同事件的发生对股票价格的影响。在此基础上,我们将构造基于多事件驱动的组合投资策略。本篇报告的最后一部分,我们将事件驱动策略与多因子策略在组合权重优化的框架下相结合,构建了基于多因子多事件驱动的最优中性投资组合。实证结果表明,增加了事件驱动后的多因子组合,收益显著提升。 事件驱动研究的本质问题在于事件发生是否会产生超额收益或亏损?若能产生,该收益是否可持续存在?对于该问题的解答不仅有利于我们构建事件驱动选股策略,更重要的是使得投资者了解事件信息对股票价格运行所产生的影响,进而更深入的理解股票价格波动的成因。 我们利用风险模型对个股收益的分解,定义了事件异常收益AR (Abnormal Return),并根据不同事件对个股异常收益的影响,对事件属性进行了分类。在此基础上,我们构建了基于多事件驱动的组合投资策略。实证结果表明,组合收益稳健有效,在过去6年时间内均可稳定战胜基准指数。 事件驱动研究的本质仍然是对市场参与者内心预期、相互博弈的投资心理研究。本篇报告通过数据建模等方法,对事件影响进行了一定的统计观察。但模型终究只是研究工具,最终我们希望通过事件研究,使得投资者更深入的理解股票价格运行的成因及规律,进而达到无招胜有招之最高境界。 2. 异常收益 2.1 异常收益定义

从逻辑上而言,我们通常会研究事件发生前后,股票价格收益的分布情况,进而判断事件对股价的影响。但是,由于股票价格的波动受各种不同的风险因素影响,因此简单的利用收益率或者超额收益很难分辨出事件本身对股票价格所产生的影响。 我们通常利用异常收益来检验事件发生对股票价格所产生的影响。所谓事件异常收益指的是:在事件发生前后,股票收益率中,无法用市场、行业、风格所解释的收益部分称为异常收益。 风险模型对股票收益的分解为事件研究提供了较大的便利,通过统计事件发生前后,股票收益中无法利用已知因子所解释的部分,即特质收益项,就可以观察事件发生所导致的股票价格异常收益,即: 换言之,我们利用风险模型回归方程中的残差项作为事件发生窗口期内的股票异常收益,由于残差部分不包含任意行业与风格收益,因此可以纯粹的反映事件本身对股票价格的影响,这与我们定义异常收益的初衷思路是一致的。 并且,由于A股市场的公司事件往往多发生于中小创的股票,而这类股票在规模因子的驱动下,具有显著的风格收益,所以利用风险模型剔除风格收益的影响,完整的剥离出股票价格的异常收益,显得尤为重要。 2.2 事件核心逻辑 在定义了异常收益后,我们就可以对各类事件发生前后,个股异常收益的分布特征进行观察统计。我们首先给出事件驱动异常收益显著性统计的一般流程: Step1: 定义事件逻辑,统计事件(公告)发生时间点; Step2: 统计事件发生前后股票收益率,计算对应行业因子及风格因子; Step3: 根据风险模型回归方程,计算事件发生前后个股异常收益CAR; Step4: 计算事件发生全部个股异常收益AR均值;

MFC的运行机制和消息响应机制

MFC的类层次结构与运行机制 MFC的类层次结构 如图所示(子类指向父类): 其中: CObject:是MFC提供的绝大多数类的基类。该类完成动态空间的分配与回收,支持一般的诊断、出错信息处理和文档序列化等。 CCmdTarget:主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息发送、等待和派遣调度等工作,实现应用程序的对象之间的协调运行。 CWinApp:是应用程序的主线程类,它是从CWinThread类派生而来的。CWinThread类用来完成对线程的控制,包括线程的创建、运行、终止和挂起等。 CDocument:是文档类,包含了应用程序在运行期间所用到的数据。 CWnd:是一个通用的窗口类,用来提供Windows中的所有通用特性、对话框和控件。 CFrameWnd是从CWnd类继承来的,并实现了标准的框架应用程序。 CDialog类用来控制对话框窗口。 CView:用于让用户通过窗口来访问文档。 CMDIFrameWnd和CMDIChildWnd:分别用于多文档应用程序的主框架窗口和文档子窗口的显示和管理。CMiniFrameWnd类是一种简化的框架窗口,它没有最大化和最小化窗口按钮,也没有窗口系统菜单,一般很少用到它。 MFC运行机制 在程序中,当定义一个类对象时,它会自动调用相应的构造函数。所谓"类对象",就是用该类定义的"变量",这个"变量"又称为类的一个实例。例如,theApp就是类CSimpApp的一个对象。 MFC正是利用类的这种"自动调用相应的构造函数"特性,使得WinMain()函数的调用变成了应用程序框架内部的调用,所以我们在代码中看不到每个Windows程序所必须有的WinMain()函数。 当应用程序运行到"CSimpApp theApp;"时,系统就会先调用基类CWinApp构造函数,进行一系列的内部初始化操作,然后自动调用CSimpApp的虚函数InitInstance(),该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。下面来看看上述程序中InitInstance的执行过程。 首先执行的是: m_pMainWnd = new CMainFrame; 该语句用来创建从CFrameWnd类派生而来的用户框架窗口CMainFrame类对象,继而调用该类的构造函数,使得Create函数被调用,完成了窗口创建工作。

私募基金八大策略介绍

股票策略以股票为主要投资标的,是目前国内阳光私募行业最主流的投资策略,约有八成以上的私募基金采用该策略,内含股票多头、股票多空两种子策略。由于资本市场发展的缘故,国内的私募基金运作最多的投资策略即为股票策略,持续披露净值的产品数量超过3200只,规模占全市场比重的85%左右。 纯股票多头是指基金经理基于对某些股票看好从而在低价买进股票,待股票上涨至某一价位时卖出以获取差额收益。该策略的投资盈利主要通过持有股票来实现,所持有股票组合的涨跌幅决定了基金的业绩。按选择股票的角度划分,主要分为价值投资、成长投资、趋势投资、行业投资。 随着我国金融市场的逐步完善与融资融券、股指期货等金融工具的推出,国内阳光私募基金正逐步走向真正意义上的对冲基金,在投资组合中加入对冲工具成为越来越多基金经理的选择,股票多空策略也应运而生。 代表机构:朱雀投资、民森投资 朱雀投资 自2007年运行以来,朱雀已陆续发行近50款私募产品,目前存续运作的产品数量达到46只,早期设立的4只产品累计收益率已经超过300%,为投资者实现资产的稳步增值。近几年朱雀投资还涉足新的产品类型,在量化对冲、股权投资等领域均有新的突破。尤其是在量化对冲方面,发行多只朱雀漂亮阿尔法产品,该系列产品引入股指期货对冲策略,将净值波动控制在较低水平。 投资策略分析: 稳健风格下的成长股投资。与单纯的选时型或选股型投资者不同,朱雀投资意在两者之间做出一种平衡。一方面,朱雀投资重视自上的仓位决策和行业配置;另一方面,朱雀投资也重视自下的个股选择。前者使得其业绩呈现出较为稳定的风格,后者使得其业绩在市场上行阶段保持一定程度的进攻性。 (1)仓位决策和行业配置。朱雀投资将组合的目标仓位分为高、中、低三个级别,分别对应三个不同风险等级的市场环境。在三个不同的市场环境中,组合目标仓位的运行空间分别为0-33%、33%-66%、66%-100%,具体产品的仓位由基金经理在目标仓位区间内确定。仓位确定后,通过对宏观经济运行趋势、行业景气度趋势等基本面因素的分析判断,确定投资组合中的行业配置比例。 (2)个股选择。朱雀投资在强调仓位决策的同时强调“像内部人一样理解公司”,做到投资的专注。公司长期看好与经济转型相关的行业,其核心是城镇化和内需,包括衣食住行、医疗、娱乐文化等内需产业,以及战略新兴产业等。公司区分周期类(强周期、弱周期)和非周期类(快速成长、稳定成长),并分别采取有不同的投资方法。 总结: 朱雀的管理业绩给人比较稳健的印象,这可能与核心人物李华轮券商背景有较大关系。一方面,公司会进行主动的仓位决策,另一方面也会执行被动的调仓策略,这使得其业绩可以避免因市场波动带来的大起大落。朱雀投资旗下产品两次最大的净值回撤来自2008年和2011年,但均大大低于市场整体跌幅。 债券策略 债券策略的私募基金主要以债券为投资对象,以绝对收益为目标。由于债券价格对利率变化较为敏感,基金经理需对债券组合的风险暴露进行调整,随着国债期货的推出,投资组

MFC消息映射机制

由于工作需要,这几天学了一点MFC,在AFX里看到很多熟悉的东西,如类型信息,序列化,窗口封装和消息分派。几乎每个界面库都必须提供这些基础服务,但提供的手法却千差万别。MFC大量地借用了宏,映射表来实现,而VCL则更多的在语言级别上给与支持。这其实是很容易理解的,因为C++是一个标准,不会因某个应用而随便扩展语言;相反Delphi完全由一个公司掌握,因此每支持一项新技术,变化最大的往往是语言本身。 学习MFC的代码,再对照VCL的实现,这真是一个很有意思的过程,其中可以看到两个框架在一些设计思想上是殊途同归的,所不同的是表现手法,以及封装的程度。我计划将这段时间阅读MFC的心得写成一系列文章,其中可能会穿插与VCL的对比,不管你熟悉VCL还是MFC,通过这些文章或许可从另一个角度来看待自己熟悉的框架。 这是第一篇:消息分派。 消息处理函数表 MFC和VCL在对消息进行封装的时候,都没有使用虚函数机制。原因是虚函数带来了不必要的空间开销。那么它们用什么来代替虚函数,即可减少空间浪费,也可实现类似虚函数的多态呢?让我们从一个例子开始。 假设父类ParentWnd处理了100个消息,并且将这100个处理函数声明为虚函数;此时有一个子类ChildWnd它只需要处理2个消息,另外98个交由ParentWnd默认处理,但是ChildWnd的虚表仍然占有100个函数指针,其中2个指向自己的实现,另外98个指向父类的实现,情况大概像下面这样: 指向父类实现的函数指针浪费了空间,当控件类非常多的时候,这种浪费就非常明显。因此必须走另一条路,将不必要的函数指针去掉,如下图所示:

ChildWnd去掉函数指针之后,当有一个消息需要Fun100处理时,ChildWnd就束手无策了。需要一个方法让ChildWnd能够找到父类的表,我们再对这个数据结构进行改进如下: 现在看来好多了,如果ChildWnd有一个消息需要Fun1处理,则查找ChildWnd的MsgHandlers,找到Fun1函数指针调用之;如果需要Fun100处理,发现ChildWnd的MsgHandlers没有Fun100,则通过ParentTable找到父类的MsgHandlers继续查找。如此一直查找,到最后再找不到,就调用DefWindowProc作默认处理。 MFC和VCL都是通过类似的方法实现消息分派的。只是VCL有编译器的支持,直接将这个表放到VMT中,因此实现起来非常简单,只需在控件类里作如下声明: procedure WMMButtonDown(var Message: TWMMButtonDown); message WM_MBUTTONDOWN; TObject.Dispatch会将WM_MBUTTONDOWN正确分派到WMMButtonDown。

MFC消息映射机制如何运用ClassWizard

M F C消息映射机制如何 运用C l a s s W i z a r d The Standardization Office was revised on the afternoon of December 13, 2020

画图的基本应用: Point的应用,在mfc中的很多的位置都要用到。只是当前点的信息,xy坐标,MoveToEx 移动位置函数The MoveToEx function updates the current position to the specified point and optionally returns the previous position. LineTo 画直线的函数 CDC类,作图相关的操作 GetDC,cwnd::getdc 以及cdc的释放(区别hdc),两者的范围不同,调用方式不同 CClientDC 不需要显示地调用getdc和releasedc,只需要声明类的定义和类的调用。 Cliendc对象里利用view指针构造,但是调用的时候用的是对象的点调用方式。 Cwnd::getparent 获得父窗口的指针,view的父窗口是frame。注意区别view 和framework的客户区域。 Cwindowdc类和clientdc一样自动调用getdc和releasedc。了解他的访问客户区的范围。 Getdesktopwindow 获得桌面窗口。 创建画笔: CPen 类,设置画笔的属性,包括一些类型宽度,颜色。 CDC::SelectObject 用的过程中要保存原来的画笔指针。 创建一个阴影线的笔只能是1或更小。(其他的注意情况看msdn)。

mfc原理和消息映射

MFC思想 win32程序中创建一个窗口的过程:设计窗口阶段(由WNDCLASS结构描述部分)、窗口的注册及创建显示过程、消息循环部分。win32用标准的C语言代码实现,是面向过程的。在MFC中采用了面向对象的思想,即用面向对象的C++思想对以上代码进行了封装,也就是说将一些对窗口进行操作的API的函数封装到了一个类中,以下我将用简短的代码来演示一下这个过程: class CWnd { public: HWND m_hWnd; BOOL Create(); BOOL ShowWindow(); }; BOOL CWnd::Create() { WNDCLASS wndClass; wndClass.style=CS_HREDRAW; wndClass.lpfnWndProc=(WNDPROC)DefWndProc; wndClass.cbClsExtra=0; wndClass.cbWndExtra=0; wndClass.hInstance=hInstance; wndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)); wndClass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1)); LOGBRUSH lgbr; lgbr.lbStyle=BS_SOLID; lgbr.lbColor=RGB(192,192,0); lgbr.lbHatch=0; wndClass.hbrBackground=CreateBrushIndirect(&lgbr); wndClass.lpszMenuName=NULL; wndClass.lpszClassName="mycls"; RegisterClass(&wndClass); HWND hWnd; m_hWnd=CreateWindow("mycls","窗口标题", WS_OVERLAPPEDWINDOW,0,NULL,NULL,hInstance,NULL); if(m_hWnd!=NULL) return true; else return false; } BOOL CWnd::ShowWindow() { return ShowWindow(hWnd,nCmdShow); } 为了保证代码和以前的执行方式一样,Winmain()函数可以写成如下形式:

MFC消息映射

消息映射的实现 Windows消息概述 Windows应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。 消息的分类 队列消息和非队列消息 从消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。 这里,对消息队列阐述如下: Windows维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。 鼠标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如 WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。线程消息队列接收送给该线程所创建窗口的消息。线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。 除了键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。 这些队列消息以外的绝大多数消息是非队列消息。 系统消息和应用程序消息 从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。 系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER (0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使 用::RegisterWindowMessage来得到该范围的消息ID。 消息结构和消息处理 消息的结构 为了从消息队列获取消息信息,需要使用MSG结构。例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息。 MSG结构的定义如下: typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG; 该结构包括了六个成员,用来描述消息的有关属性: 接收消息的窗口句柄、消息标识(ID)、第一个消息参数、第二个消息参数、消息产生的时间、消息产生时鼠标的位置。 应用程序通过窗口过程来处理消息 如前所述,每个“窗口类”都要登记一个如下形式的窗口过程: LRESULT CALLBACK MainWndProc (

4.MFC消息映射机制如何运用ClassWizard

. 画图的基本应用: Point的应用,在mfc中的很多的位置都要用到。只是当前点的信息,xy坐标,MoveToEx 移动位置函数The MoveToEx function updates the current position to the specified point and optionally returns the previous position. LineTo 画直线的函数 CDC类,作图相关的操作 GetDC,cwnd::getdc 以及cdc的释放(区别hdc),两者的范围不同,调用方式不同CClientDC 不需要显示地调用getdc和releasedc,只需要声明类的定义和类的调用。Cliendc对象里利用view指针构造,但是调用的时候用的是对象的点调用方式。Cwnd::getparent 获得父窗口的指针,view的父窗口是frame。注意区别view和framework 的客户区域。 Cwindowdc类和clientdc一样自动调用getdc和releasedc。了解他的访问客户区的范围。Getdesktopwindow 获得桌面窗口。 创建画笔: CPen 类,设置画笔的属性,包括一些类型宽度,颜色。 CDC::SelectObject 用的过程中要保存原来的画笔指针。 创建一个阴影线的笔只能是1或更小。(其他的注意情况看msdn)。 创建画刷: CBrush 类的方法 FillRect填充矩形的区域。 CRect类,几种不同的方法。 用位图填充画刷。CBitmap 的构造函数,没有参数。调用之前必需初始化。 透明画刷的创建: dc.Rectangle(); 画出矩形。 空画刷:GetStockObject CBrush::FromeHandle 空画刷的实现方法: CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH)); CBrush *oldbrush=dc.SelectObject(brush); dc.Rectangle(CRect(org,point)); dc.SelectObject(oldbrush); 理解 消息响应的知识: MouseMove 如有侵权请联系告知删除,感谢你们的配合! 精品

异常波动事件驱动策略量化研究

龙源期刊网 https://www.wendangku.net/doc/ca4323895.html, 异常波动事件驱动策略量化研究 作者:尚琳喆夏青桐 来源:《科学与财富》2020年第02期 摘要:异常波动事件是指上市公司在市场上发布股价异常波动公告的行为。从直观上讲,出现股价异常波动的股票可能存在获取超额收益的机会,本报告用量化的方法研究了出现股价异常波动的股票是否在后期存在获取超额收益的机会,发现异常波动事件对应公司股价存在一定超额收益。进一步我们构建了异常波动事件驱动选股策略,利用数据进行回测。 关键词:异常波动事件;事件驱动;超额收益;量化 一、异常波动事件综述 异常波动事件是指上市公司在市场上发布股价异常波动公告的行为。通常,某支股票股价在短期出现异常波动,原因可能有:公司经营情况和内外部经营环境发生重大变化、公司近期正在筹划重大事项和公共传媒报道了对公司股价产生影响的重大事件等。从直观上讲,出现股价异常波动的股票可能存在获取超额收益的机会。 1.1股价异常波动相关规定 股价异常波动,主要是为了规范股市,防止有人利用大量资金人为地在短期内操作股价。异常波动判定依据根据《上海证券交易所交易规则(2015年修订)》,主要指标为:收盘价 格涨跌幅偏离值、日均换手率和证监会规定其他情形。异常波动指标自复牌之日起重新计算。 当交易所察觉某只股票符合上述特征时,即要求上市公司做出示警声明,并就可能产生的原因做出说明,而交易所会在随后的一个交易日开市时对该股票实施停牌一小时。对于未能及时发布公告说明原因的股票,交易所会要求上市公司进行停牌自查,直到上市公司就异常波动做出说明并发布公告方可申请复牌。 1.2异常波动分布情况 我们将异常波动事件分为两类:发布异常波动公告后次日仍可以正常交易、发布异常波动公告后停牌一天及以上。我们从巨潮资讯爬取了沪深两市上市公司的所有股价异常波动公告,剔除冗余公告。统计区间为2002年1月1日到2017年7月4日,在此区间内共出现27320例股价异常波动事件,涉及到上市公司3272家。其中异常波动未停牌事件26258件,占事件总数的96.11%;异常波动停牌事件1062件,占事件总数的3.89%。

量化对冲策略及产品简介-专题研究

“量化对冲”是“量化”和“对冲”两个概念的结合。“量化”指借助统计方法、数学模型来指导投资,其本质是定性投资的数量化实践。“对冲”指通过管理并降低组合系统风险以应对金融市场变化,获取相对稳定的收益。实际中对冲基金往往采用量化投资方法,两者经常交替使用,但量化基金不完全等同于对冲基金。 过去的13年间全球对冲基金市场经历了快速增长、衰退、反弹三个阶段。08年金融危机前,全球对冲基金规模由2000年的3350亿美元上升至1.95万亿美元。受金融危机影响,全球对冲基金规模一度缩减。09年之后,在全球经济复苏背景下对冲基金规模又开始反弹,截至2013年11月底,全球对冲共基金管理着1.99万亿美元的资产。 从目前对冲基金的全球分布来看,北美地区(美国为主)是全球对冲基金市场发展最成熟的地区,且近年来占比有所扩大,截止2013年11月该地区对冲基金规模占据全球的67.5%。其次是欧洲地区,占比达22.2%;接着是亚太地区,占比达7.3%(日本+亚洲非日本) 常见的量化对冲策略包括:股票对冲(Equity Hedge)、事件驱动(Event Driven)、全球宏观(Macro)、相对价值套利(Relative Value)四种,任意一只对冲基金既可采取其中某一策略也可同时采取多种投资策略,目前全球使用占比最高的策略是股票多空策略,占比达32.5% 量化对冲产品有以下几方面特点:1、投资范围广泛,投资策略灵活;2、无论市场上涨还是下跌,均以获取绝对收益为目标;3、更好的风险调整收益,长期中对冲基金在获取稳定收益的同时提供了更好的防御性;4、与主要市场指数相关性低,具备资产配置价值。 一、什么是量化对冲投资? 近年来随着证券市场不断发展,金融衍生产品不断推出,做空工具不断丰富,投资的复杂程度也日益提高,其中以追求绝对收益为目标的量化对冲投资策略以其风险低、收益稳定的特性,成为机构投资者的主要投资策略之一。 所谓“量化对冲”其实是“量化”和“对冲”两个概念的结合。 其中“量化”投资是区别于传统“定性”投资而言的。量化投资通过借助统计学、数学方法,运用计算机从海量历史数据中寻找能够带来超额收益的多种“大概率”策略,并纪律严明地按照这些策略所构建的数量化模型来指导投资,力求取得稳定的、可持续的、高于平均的超额回报,其本质是定性投资的数量化实践。由此可见,所有采用量化投资策略的产品(包括普通公募基金、对冲基金等等)都可以纳入量化基金的范畴。量化投资的最大的特点是强调纪律性,即可以克服投资者主观情绪的影响。

MFC课后简答题(1~11章)

第一章 1、什么是Windows SDK程序? 使用SDK开发出来的Windows应用程序,叫做Windows SDK程序 2、什么是Windows API函数? 为了设计Windows 应用程序,Windows 提供了大量预定义的用C语言编写的函数 3、查看windows.h文件,说明Windows系统的句柄的类型。 整型 4、窗口句柄、当前程序应用实例句柄、设备环境句柄 5、什么是事件?试举例说明。 能触发程序作出相应反映的刺激叫做事件,例如在键盘上按下一个键 6、如何显示和更新窗口? 调用函数ShowWindow显示窗口,调用函数UpdateWindow更新窗口 7、什么是消息循环? 在创建了窗口的应用程序中,应用程序将要不断地从消息队列中获取消息,并将消息指派给指定的窗口处理函数来处理,然后再回来从消息队列中获取消息,这个不断重复的工作过程叫做消息循环 8、Windows应用程序的主函数有哪3个主要任务? 注册窗口类、创建应用程序的窗口和建立消息循环 (注:如果题目问有哪2个主要任务,应该答后两个) 9、说明Windows应用程序的主函数,窗口函数与Windows系统之间的关系。 主函数和窗口函数都是Windows系统调用的函数; 主函数是应用程序启动后,系统首先调用的函数; 窗口函数是主函数在消息循环中获得消息并把消息发送给系统之后,由系统调用函数。 第二章 1、在窗口类CFrameWnd中需要封装哪些成员? 窗口句柄,窗口类的定义,注册窗口类,创建窗口和显示更新窗口 (注:对应书上P16 //窗体类的声明这一段代码) 2、应用程序类CWinApp应该具备哪些主要功能? 注册、创建、显示应用程序的窗口;建立消息循环 3、在MFC程序设计中,如果要建立拥有自己的风格的主窗口,应该重写什么函数? 在CWinApp的派生类中重写InitInstance函数 4、什么是消息映射表? 在MFC中,能够根据消息取得消息处理函数的表,叫做消息映射表。(我自己概括的) ////消息映射就是消息与消息处理函数一对一的联系 第三章 1、CObject is the principal base class for the MFC Library. (最“基”的一个类) 2、功能: CObject类:为其派生类提供了支持序列化、调试信息、运行期类型消息等一些通用功能。 CCmdTArget类:支持消息处理。 CWnd类:为所有子窗口类提供通用属性和方法。

消息映射的实现

消息映射的实现 1.Windows消息概述 Windows 应用程序的输入由Windows系统以消息的形式发送给应用程序的窗口。这些窗口通过窗口过程来接收和处理消息,然后把控制返还给Windows。 1.消息的分类 1.队列消息和非队列消息 从消息的发送途径上看,消息分两种:队列消息和非队列消息。队列消息送到系统消息队列,然后到线程消息队 列;非队列消息直接送给目的窗口过程。 这里,对消息队列阐述如下: Windows 维护一个系统消息队列(System message queue),每个GUI线程有一个线程消息队列(Thread message queue)。 鼠 标、键盘事件由鼠标或键盘驱动程序转换成输入消息并把消息放进系统消息队列,例如WM_MOUSEMOVE、WM_LBUTTONUP、WM_KEYDOWN、WM_CHAR等等。Windows每次从系统消息队列移走一个消息,确定它是送给哪个窗口的和这个窗口是由哪个线程创建的,然后,把它放进窗口创建线程的线程消息队列。线程消息队列接收送给该线程所创建窗口的消息。线程从消息队列取出消息,通过Windows把它送给适当的窗口过程来处理。 除了键盘、鼠标消息以外,队列消息还有 WM_PAINT、WM_TIMER和WM_QUIT。 这些队列消息以外的绝大多数消息是非队列消息。 2.系统消息和应用程序消息 从消息的来源来看,可以分为:系统定义的消息和应用程序定义的消息。 系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或0XC000到 0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID 的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。 1.消息结构和消息处理 1.消息的结构 为了从消息队列获取消息信息,需要使用MSG结构。例如,::GetMessage函数(从消息队列得到消息并从队列中移走)和::PeekMessage函数(从消息队列得到消息但是可以不移走)都使用了该结构来保存获得的消息信息。 MSG 结构的定义如下: typedef struct tagMSG { // msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt;

事件驱动策略的因子化特征

事件驱动策略的因子化特征 2016-05-30 16:01:00 1. 引言 本篇报告旨在对若干类事件进行综合量化分析,使投资者更加深入的理解不 同事件的发生对股票价格的影响。在此基础上,我们将构造基于多事件驱动的组合投资策略。本篇报告的最后一部分,我们将事件驱动策略与多因子策略在组合权 重优化的框架下相结合,构建了基于多因子多事件驱动的最优中性投资组合。实证结果表明,增加了事件驱动后的多因子组合,收益显著提升。 事件驱动研究的本质问题在于事件发生是否会产生超额收益或亏损?若能产生,该收益是否可持续存在?对于该问题的解答不仅有利于我们构建事件驱动选股策略,

更重要的是使得投资者了解事件信息对股票价格运行所产生的影响,进而更深入的理解股票价格波动的成因。 我们利用风险模型对个股收益的分解,定义了事件异常收益AR(Abnormal Return),并根据不同事件对个股异常收益的影响,对事件属性进行了分类。在 此基础上,我们构建了基于多事件驱动的组合投资策略。实证结果表明,组合收 益稳健有效,在过去6年时间内均可稳定战胜基准指数。 事件驱动研究的本质仍然是对市场参与者内心预期、相互博弈的投资心理研究。本篇报告通过数据建模等方法,对事件影响进行了一定的统计观察。但模型终究只是研究工具,最终我们希望通过事件研究,使得投资者更深入的理解股票价 格运行的成因及规律,进而达到无招胜有招之最高境界。 2. 异常收益 2.1 异常收益定义 从逻辑上而言,我们通常会研究事件发生前后,股票价格收益的分布情况,进而判断事件对股价的影响。但是,由于股票价格的波动受各种不同的风险因素影响,因此简单的利用收益率或者超额收益很难分辨出事件本身对股票价格所产生的影响。 我们通常利用异常收益来检验事件发生对股票价格所产生的影响。所谓事件异常收益指的是:在事件发生前后,股票收益率中,无法用市场、行业、风格所解释的收益部分称为异常收益。 风险模型对股票收益的分解为事件研究提供了较大的便利,通过统计事件发生前后,股票收益中无法利用已知因子所解释的部分,即特质收益项,就可以观察事件发生所导致的股票价格异常收益,即:

MFC中的消息发送与响应

MFC中的消息发送与响应 1. 主窗口向子窗口发送消息: https://www.wendangku.net/doc/ca4323895.html,/phenixyf/article/details/9300425 从主窗口向子窗口发送消息,可以在子窗口中添加自定义的消息,然后在主窗口中需要地方呼叫该消息。 呼叫方法: 1.将子窗口添加为主窗口的成员变量; 2.主窗口呼叫该消息,成员变量名.SendMessage(UM_PROGRESS); 子窗口添加自定义消息步骤如下: 1、定义消息。 在Windows中,所有的消息都用一个特定的整数值来表示,为了避免自定义消息与已存在的其他消息发生冲突,应该利用Windows提供的一个常量:WM_USER,小于这个常量的是系统保留的。即用户自定义的消息至少为WM_USER+1,注意最后表示的消息的数值不要超过0x7FFF。在开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。 #define UM_PROGRESS WM_USER + 100 将上句添加到子窗口类的头文件(.h)中。 2、在子窗口类头文件的AFX_MSG块中声明消息处理函数:

class CMainFrame:public CFrameWnd{ protected: //{{AFX_MSG(CMainFrame) afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnTimer(UINT nIDEvent); afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam); //}}AFX_MSG DECLARE_MESSAGE_MAP() 3、在子窗口类的实现文件(.cpp)中,使用ON_MESSAGE宏指令将消息映射到消息处理表中。 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() ON_WM_TIMER() ON_MESSAGE(UM_PROGRESS, OnProgress)//注意这条语句的后面没有分号 //}}AFX_MSG_MAP END_MESSAGE_MAP() 4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。 LRESULT CMainFrame::OnProgress(WPARAM wParam,LPARAM lParam){ CRect rect; m_wndStatusBar.GetItemRect(2,&rect); //获得窗格区域 //创建进度栏,注意第三个参数为CWnd* pParentWnd,根据情况选择父窗体 m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,rect,this,123); m_progress.SetPos(50); return 0; } 5、在适当的时候发送自定义消息,进行消息处理。需要注意使用SendMessage还是PostMessage进行处理:SendMessage是消息处理完毕后再返回;而PostMessage则是把消息放到消息队列后立即返回。 SendMessage(UM_PROGRESS); PostMessage(UM_PROGRESS); 如果用户需要整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。 2. 子窗口向主窗口发送消息:

相关文档
相关文档 最新文档