zoukankan      html  css  js  c++  java
  • 创建自己的窗口消息

    步骤
    1. 创建一个新的窗口消息
    使用以下方式定义一个新的消息。若想定义多个消息,只要使用WM_USER的更大增量
    即可。
    # define WM_WZD_MESSAGE WM_USER+1
    2. 发送一个新的窗口消息
    利用SendMessage( )发送新消息:

    AfxGetMainWnd( )-> SendMessage (WM_WZD_MESSAGE, wParam, lParam);

    也可以自己定义存储在参数w P a r a m和l P a r a m中的值,二者都是DWORD变量。有两种方法来接收这个新窗口消息:第一种方法是增加ONMESSAGE宏和消息处理函数本身到接收消息类的消息映像中;第二种方法是为此新消息创建自己的消息映像宏。第一种的好处是快而且简单,第二种方法的好处是在消息进行处理之前用户可以定制wParam和lParam参数。如果想在整个应用程序中使用这个消息,这一点很重要。这两种方法都不能利用ClassWizard所提供的便利,因为新消息并不在ClassWizard的列表中。
    3. 使用ON_MESSAGE( )接收新窗口消息
    1) 使用文本编辑器,在接收消息的类中加入消息处理函数的定义。利用如下语法,并保
    证是在ClassWizard的{{ }}框架之后,以防止ClassWizard删去这里所做的工作。
    / / { { A F X M S G ( C M a i n F r a m e )
    / / } } A F X M S G
    afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<<<<
    DECLARE_MESSAGE_MAP( )
    2) 然后,在实现文件中,添加消息映像宏到消息映像中。
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)
    / / { { A F X M S G M A P ( C M a i n F r a m e )
    / / } } A F X M S G M A P
    ON_MESSAGE ( WM_WZD_MES
    SAGE , OnMyMessage) < < < < <

    END_MESSAGE_MAP( )
    3) 最后,加入消息处理函数。
    LRESULT CMainFrame::OnWzdMessage(WPARAM wParam, LPARAM lParam)
    {
    / / p r o c e s s
    return 0;
    }
    正如传送的w P a r a m和l P a r a m的值由你决定一样,该处理函数返回什么仍由你来决定。
    4. 创建新的消息映像宏

    1) 用如下方式为新消息定义一个新的消息映像宏,理想情况下,其定义在一个包含文件
    中,以便可被应用程序的所有文件共享。
    #define ON_WZD_MESSAGE()
    {WM_WZD_MESSAGE, 0, 0, 0, AfxSig_vW, (AFX_PMSG)(AFX_PMSGW)(void
    (AFX_MSG_CALL CWnd::*)(CWnd *))&OnWzdMessage},
    AfxSig_vW的值告诉MFC新消息带一个指向CWnd类的指针,且返回值是Void类型。然后,
    把正常情况下的w P a r a m和l P a r a m参数转换为调用参数。AfxSig _ vW的其他可用值,请参阅MFC子目录下AFXMSG . H文件。改变AfxSig_vW的值意味着改变这个宏定义的函数的调用参数。
    2) 使用文本编辑器添加新消息处理函数的定义到接收消息类中。使用以下语法并保证是
    在C l a s s Wi z a r d的{{ }}框架之后,以防止C l a s s Wi z a r d删去所做的工作。
    / / { { A F X M S G ( C M a i n F r a m e )
    / / } } A F X M S G
    afx_msg void OnMyMessage(CWnd *pWnd);<<<<
    D E C L A R E M E S S A G E M A P ( )
    3) 在实现文件中,加入新消息映像宏到消息映像中。
    BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)

    / / { { A F X M S G M A P ( C M a i n F r a m e )
    / / } } A F X M S G M A P
    ON_WZD_MESSAGE(WM_WZD_MESSAGE , OnMyMessage) < < < < <
    END_MESSAGEMAP( )
    4) 最后,加入新消息处理函数。
    void CMainFrame::OnWzdMessage(CWnd *pWnd)
    {
    / / p r o c e s s
    }
    记住,这里传递的参数不是通常的wParam和lParam,而是更友好的C W n d指针。
    说明
    ■ 窗口消息的主要目的是窗口之间的内部消息处理,而不是处理诸如来自菜单的命令消息。
    添加一个新的命令消息,则要定义一个新的命令I D,而不是使用W M C O M M A N D。
    ■ 添加任何内容到映像中时,应避免把代码放在{{ }}框架之间。否则C l a s s Wi z a r d会把它
    删去。
    / / { { A F X M S G M A P ( C M a i n F r a m e )
    <---- NOT HERE!!!
    / / } } A F X M S G M A P
    ON_WZD_MESSAGE() <---- HERE!!!!

    版权声明:

  • 相关阅读:
    oracle 11g jdbc jar包在哪个文件目录
    Java生成验证码
    Oracle 安装“权限不够”
    Linux新建文件、文件夹
    基于Java web技术文件上传和下载功能开发实战练习视频(fileupload)
    springmvc的xml文件位置
    oracle 11g的OEM(企业管理器),https://主机ip:1158/em/console网页无法显示
    常见的开源协议分析
    约瑟夫问题猴子选大王
    TOJ1036.Rails STL栈
  • 原文地址:https://www.cnblogs.com/walccott/p/4957046.html
Copyright © 2011-2022 走看看