MFC中消息笔记

来源:互联网 发布:淘宝库存怎么填 编辑:程序博客网 时间:2024/06/01 10:59

在Class Wizard(类向导)中能管理类的相关信息,例如 commands 命令 message 消息 visual functions虚函数,member variable类的成员变量 Menthods重写的方法

在对应的类下面增减相关的信息:

一些例子相似的就不说了:在消息发送后运行对应的处理函数。

WM_LBUTTONUP:当鼠标左键点击弹起时候发送该信息。相似的海鸥左键点击按下时,双击。中键。

WM_KEEYDOWN:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags):nChar表示虚拟键码,nRepCnt是当按住一个键时的重复计算,nFlags表示击键消息标志,包含很多状态标识,可以表明是否同时按下了各种键,有CTRL,SHIFT等标志(nFlags&标识判断)。虚拟键代码是与设备无关的键如 F1 SHIT等。

注意:CDialog中响应键盘消息的OnKeyDown函数没反应。

经过仔细研究发现CDialog是相应对应消息的OnKeyDown函数的,只是这个消息在到达窗体之前,已经被它的子控件捕获了,如果将窗体中的所有控件都删除,窗体就会捕获到这个消息,但要注意的是,MFC为了实现在窗体上切换子控件的焦点,已经将 VK_TAB,VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN进行了处理,同时VK_RETURN也被系统捕获用来处理相应的确定事件,所以即使窗体中没控件,这几个键还是无法捕获,暂时只能用PreTranslateMessage解决。 

在visual function 中找到PreTranslateMessage(MSG* pMsg)

我们看看MSG的结构:

typedef struct tagMSG {
    HWND        hwnd;
    UINT        message;
    WPARAM      wParam;
    LPARAM      lParam;
    DWORD       time;
    POINT       pt;
#ifdef _MAC
    DWORD       lPrivate;
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

message就是在messages中的信息, wParam是信息传来的一些参数比如key的键值如VK_SHIT重写pretranslatemessage能实现目的。

对于一般控件来说wParem参数的地位字节含有控件标识符,高位字则为通知代码,lParam是指向控件的句柄

对于有些控件通知消息message是一条WM_NOTIFY,wParam是发送通知消息的控件的标识符,lParam是指向一个结构指针

WM_CHAR:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 这个是对应处理字符按键消息。

nChar表示ASCII码,nRepCnt表示按住一个键时的重复计算值。

同样OnChar也出现这种情况所以也是要从PreTranslatMessage中重写。

计数器消息

计时器消息是通过SetTime来设置启动计时器SetTimer(
             UINT_PTR nIDEvent,
             UINT nElapse,
             void (CALLBACK* lpfnTimer
      )(HWND,
          UINT,
          UINT_PTR,
          DWORD
       ) 
       );
参数nIDEvent指定一个非零的定时器ID;参数nElapse指定间隔时间,单位为毫秒;参数lpfnTimer指定一个回调函数的地址,如果该参数为NULL,则WM_TIMER消息被发送到应用程序的消息队列,并被CWnd对象处理。如果此函数成功则返回一个新的定时器的ID,我们可以使用此ID通过KillTimer成员函数来销毁该定时器,如果函数失败则返回0。
通过SetTimer成员函数我们可以看出,处理定时事件可以有两种方式,一种是通过WM_TIMER消息的消息响应函数,一种是通过回调函数
BOOL KillTimer(int nIDEvent )来停止使用定时器。

WM_CREAT消息,在窗口创建对象后Windows发送第一个消息。但是这时窗口还不可见所以不能调用那些已经激活的函数如绘图(OnInitDialog()呢?)
WM_CLOSE或WM_DESTORY是用户关闭窗口或父窗口被关闭时Windows发送的WM_DESTROY是在窗体消失时发送的所以他在CLOSE后。
WM_PAINT消失时重绘窗口,UpdataWindow或ReDrawWindos时发送 处理函数时OnPaint();

WM_COMMAND:还可以通过该消息来处理一个或多个控件的通用消息 
OnCommand(WPARAM wparam,LPARAM lParam),这个消息的wParam高字节接收通知消息,低字节接收控件ID
0 0
原创粉丝点击