VC学习摘要3

1、 消息的分类:

       (1)标准消息 除了WM_COMMAND之外,所有以WM_开头的消息。此类消息能且只能被从CWnd派生的类接收。

       (2)命令消息 来自菜单、加速键或工具栏按钮的消息。这类消息都以WM_COMMAND呈现。在MFC中,通过菜单项的标识(ID)来区分不同的命令消息;在SDK程序中,通过消息的wParam参数识别。所有从CCmdTarget派生的类,都可以接收到这类消息。

       (3)通告消息 由控件产生的消息,例如,按钮的单击,列表框的选择等均产生此类消息,为的是向其父窗口(通常是对话框)通知事件的发生。这类消息也是以WM_COMMAND形式呈现,同样,从CCmdTarget派生的类,都可以接收到这类消息。

 

2、消息的路由:::AFxWndProc -> ::AFxCallWndProc -> CWnd::WindowProc -> CWnd::OnWndMsg(如果是标准消息,则查找其消息映射表,调用相应的消息处理函数完成这个消息处理) -> OnCommand(如果是命令消息);OnNotify(如果是通告消息) ->调用OnCmdTarget处理。具体详细的路径过程参看《深入浅出MFC》P147-P153

 
3、 关于菜单项的命令更新,菜单项状态的维护是依赖于CN_UPDATE_COMMAND_UI消息,谁捕获这个消息,MFC就在其中创建一个CCmdUI对象。我们可以通过手工或利用ClassWizard在消息映射中添加ON_UPDATE_COMMAND_UI宏来捕获CN_UPDATE_COMMAND_UI消息。在后台所做的工作是:操作系统发出WM_INITMENUPOPUP消息,然后由MFC的基类(如CFrameWnd)接管。它创建一个CCmdUI对象,并与第一个菜单项相关联,然后看该类中是否有ON_UPDATE_COMMAND_UI宏来捕获处理这条消息,最后调用对象的一个成员函数DoUpdate()。这个函数发出CN_UPDATE_COMMAND_UI消息,这条消息带有指向CCmdUI对象的指针,同一个CCmdUI对象就设置为与第二个菜单项相关联,这样顺序进行,直到完成所有菜单项。注意更新命令UI处理程序仅应用于弹出式菜单项上的项目,不能应用于永久显示的顶级菜单项目。
 

4、 一个应用程序在发展过程中常常需要不断的编译,Windows程序载入的标准.h文件非常巨大但内容不变,编译器浪费在这上面的时间非常多。而所谓Precompiled header就是将头文件(.h文件)第一次编译后的结果储存起来,第二次再编译时就可以直接从磁盘中取出来用。一般是插入STDAFX.H文件来作为Precompiled header。

 

5、 所谓callback函数是指由程序员设计而由windows系统调用的函数。这里引出一个问题,如果在某个类的成员函数中要调用某个windows API函数,而这个API函数要求以这个类的某个callback成员函数作为其参数,由于callback函数是给windows调用的,windows并不借助任何对象调用这个类成员callback函数,那么就不需要隐式传递的this指针,所以一般要把这个callback成员函数声明为static。(或者把这个类的成员callback函数作为全局函数来被这个API函数调用)

 
6、 MFC程序的生死因果:
(1)创建一个CWinApp派生类的对象代表程序本身,用CWinApp的缺省构造函数配置内存,设立初值;
       (2)链接器直接将AfxWinMain()函数加入到应用程序代码中:
a,AfxWinMain执行AfxWinInit函数,后者又调用AfxInitThread函数,把消息队列尽量加大到96。
b,AfxWinMain执行InitApplication函数,调用CWinApp::InitApplication,完成一些MFC为了内部管理而做的操作(Doc相关的操作)。
c,AfxWinMain执行InitInstance函数,调用CMyWinApp::InitInstance函数(程序员所改写),该函数内部一般通过new一个CMyFrameWnd对象调用其构造函数->Create->       CreateEx->PreCreateWindow->::CreateWindowEx,产生一个窗口,然后调用ShowWindow函数显示窗口,UpdateWindow函数发出WM_PAINT消息。
              d,回到AfxWinMain,执行Run函数,进入消息循环。
       (3)程序获得WM_PAINT消息(由CWinApp::Run中的::GetMessage循环);
       (4)WM_PAINT消息经由::DispatchMessage送到窗口函数CWnd::DefWindowProc中;
       (5)CWnd::DefWindowProc将消息传递到消息映射表(Message Map);
       (6)传递过程中发现有相符项目,就调用项目中相应的函数。此函数是应用程序通过
              BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间的宏来设立起来的;
       (7)使用者单击File/Close,于是发出WM_CLOSE;
       (8)CMyFrameWnd没有设置WM_CLOSE处理程序,于是交给默认的处理程序;
       (9)默认函数对于WM_CLOSE的处理方式是调用::DestroyWindow,并因而发出
              WM_DESTROY;
      (10)默认的WM_DESTROY处理方式是调用::PostQuitMessage,因而发出WM_QUIT;
       (11)CWinApp::Run收到WM_QUIT后会结束其内部消息循环,然后调用ExitInstance,
              这是CWinApp的一个虚拟函数;
       (12)最后回到AfxWinMain,执行AfxWinTerm,结束程序。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值