MFC阶段一


消息机制


消息数据结构

typedef struct tagMSG{

    HWND  hwnd ;         //消息所指窗口句柄

   UINT       message;  //消息的名称

   WPARAM  wParam;   // 32位消息的特定附加信息

   LPARAM   lParam ;   //32位消息的特定附加信息

  DWORD   time ;       //消息创建时的时间

  POINT  pt;                 //消息创建时的鼠标位置

}MSG;


从Windows应用程序的角度来看,Windows程序的进行依靠外部发生的事件来驱动,就是说,程序不断的等待操作系统发来的属于自己的消息通知,然后进行程序的消息处理,完成相应的功能。这就是消息机制,Windows就靠这种机制来运行。


常用的Windows消息

消息                                              对应的事件

WM_CHAR                                       从键盘输入字符

WM_XOMMAND                              用户选择菜单内的某项,或是控件给父类发送一个通知

WM_CREATE                                  生成窗口

WM_DESTROY                                撤销窗口

WM_LBUTTONDOWN                    按下鼠标左键

WM_LBUTTONUP                           彩旗鼠标左键

WM_MOUSEMOVE                           移动鼠标指针

WM_PAINT                                        窗口需要重新绘制

WM_QUIT                                          应用程序结束

WM_SIZE                                          窗口尺寸被调整


在Windows系统中, 消息都是系统来捕获的, 并放在系统队列中,  等待用户应用程序来获取。


对应用程序可以获取的各种程序分类,,

可分由硬件装置所产生的消息(鼠标,键盘。。。),这些消息放在系统队列中。


以及Windows系统或其他Windows程序传送过来 的消息,放在程序队列中。


消息中的窗口句柄指定了消息所属的应用程序窗口

应用程序可以调用系统的API函数GetMessage来从两大队列中获取属于自己的消息,并通过API函数TranslateMessage和DispatchMessage将获取的消息传递给自己的窗口过程函数(一般是WinProc)处理。


每个Windows程序都应该有一个如下的循环:

MSG msg;

While  ( GetMessage(&msg , NULL , NULL , NULL )) {

   TranslateMessage( &msg );

   DispatchMessage( &msg );

}

同时每一个Windows程序也都应该有一个窗口过程函数

WndProc()

{

switch(msg){

case WM_CREATE:

case WM_CLOSE:

default: return DefWindowProc();

}

return  0 ;

}


消息的种类:


(1)输入消息

(2)控制消息

(3)系统消息

(4)用户消息


消息映射

消息映射是一张将消息和成员函数相互关联的表,或者是地图。

它诉应用程序和Windows系统每一个消息由哪一个处理函数来处理。


可能通过如下步骤将MFC的消息映射机制添加到类中:

(1)将DECLARE_MESSAGE_MAP()添加到类的声明文件中,声明消息映射。

(2)在程序的实现文件中放置标志消息的宏来执行消息映射。

BEGIN_MESSAGE_MAP(CHelloWorldDlg, CDialog)  //消息映射宏开始

END_MESSAGE_MAP()                 消息映射宏结束

(3)在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP之间添加成员函数来处理消息。例 如ON_WM_PAINT()宏来为WM_PAINT消息作映射


消息映射宏

(1)AFX_MSGMAP 数据结构

struct AFX_MSGMAP

{

AFX_MSGMAP*  pBaseMessageMap ;      //指向基类消息映射表的指针

AFX_MSGMAP_ENTRY*  lpEntries;                 //自己消息映射表的首地址

}


(2)AFX_MSGMAP_ENTRY  数据结构

struct  AFX_MSGMAP_ENTRY     //消息映射表项结构体

{

UINT nMessage;

UINT nCode ;

UINT nID;

UINT nLastID;

UINT nSig;

AFX_PMSG pfn;

}

AFX_PMSG 定义为函数指针:

typedef void  (ccmdTarget::*AFX_PMSG) (void ) ;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值