形形色色的自定义消息(上)

来源:互联网 发布:淘宝2手交易平台 编辑:程序博客网 时间:2024/05/20 14:15

     摘要:自从发了5篇关于消息的文章,有的网友来信希望我讲一些比较实用的消息机制用法,这里我想就用户的自定义消息做一个全面的论述,希望能够解除你心头的困惑。

     一、普通的自定义消息方法。
        根据我在前面的几篇文章中提到的消息值的范围,我向大家都很清楚用户自定义消息的范围,不过,虽然说用会自定义消息从WM_USER开始,但是由于我们的工程里面一般还有很多其他的控件,他们也要占用一部分WM_USER消息范围,所以我们必须为他们留出一部分范围,这里,我们保留100个消息,一般情况下,这可以满足我们的要求。
        (1)定义消息的值。在我们要发生消息的地方(例如CMyView.cpp的开始部分)进行如下定义#define WM_MSG_1  (WM_USER+100)
        接下来的工作其实很简单,我们在前面说了,消息正常工作有3个部分必须协调:消息声明、消息映射、消息体。我们就一次进行手工加入。
        (2)首先在AFX_MSG块中加入消息声明:在CMyView.h中,找到如下部分,并加入消息声明:
         protected:       
            // {{AFX_MSG(CMyView)
            ......
            afx_msg LRESULT OnMyMsg(WPARAM wParam,LPARAM lParam);
            file://}}AFX_MSG
        (3)在MESSAGE_MAP块中添加ON_MESSAGE宏指令:
           BEGIN_MESSAGE_MAP(CMyView, CView)
              file://{{AFX_MSG_MAP(CMyView)
               .....
              ON_MESSAGE(WM_MSG_1, OnMyMsg)
             file://}}AFX_MSG_MAP
           END_MESSAGE_MAP()
        (4)添加消息函数体:
          LPESULT CMyView::OnMyMsg(WPARAM wParam, LPARAM lParam)
          {
             AfxMessageBox("消息已经收到!");
             return 0;
          }
        消息至此就已经定义完毕,接下来我们就可以激活消息了,就可以用我们前面所说的PostMessage/SendMessage,一切OK!
 
    二、自定义消息块
        消息块就以一个Range,主要是用来一次处理多个消息,不过对消息有一个要求:消息的值必须是连续的。这样做的好处就是:简化类,可以通过一个函数来完成一组消息的处理工作。
        通常,消息块有4个:ON_CONTROL_RANGE、ON_NOTIFY_RANGE、ON_COMMAND_RANGE和ON_UPDATE_COMMAND_UI_RANGE,他们的使用方法差不多,我就找个比较常用的来谈谈吧:ON_COMMAND_RANGE和ON_UPDATE_COMMAND_UI_RANGE
        步骤如下:
        1. 使用命令范围宏
           ON_COMMAND_RANGE宏接收所有ID在某一范围之内的命令消息(WM_COMMAND消息)。使用这个宏可以在一个函数中处理多条命令。
           1) 在类的. h 文件的{{ }}之后定义命令处理函数,以便不受Cl0assWizard的干扰。
              protected:
                 file://{{AFX_MSG(CTestView)
                 file://}}AFX_MSG
                afx_msg void OnTestCommandRange(UINT nID);
             DECLARE_MESSAGE_MAP()
           2) 同样在{{ }}之后,加入ON_COMMAND_RANGE宏到类的消息映像。头两个参数定义了要处理的命令ID的范围。这些ID有序列大小,且最后一个ID比第一个大。最后一个参数是在第一步中定义的消息处理函数的名称。
             BEGIN_MESSAGE_MAP(CTestView,CView)
                file://{{AFX_MSG_MAP(CTestView)
                file://}}AFX_MSG_MAP
                ON_COMMAND_RANGE(ID_TEST_1,ID_TEST_4,OnTestCommandRange)
             END_MESSAGE_MAP()
            3) 用下面的语句添加消息处理函数。参数nID是要处理命令的ID。
               void CTestView::OnTestCommandRange(UINT nID)
               {
  switch (nID)
  {
   case ID_TEST_1: break ;
   case ID_TEST_2: break ;
   case ID_TEST_3: break ;
   case ID_TEST_4: break ;
  }
       }
      2. 使用用户界面命令范围宏
         ON_UPDATE_COMMAND_UI_RANGE宏截取一定范围内的消息中更新用户界面的请求。使用这个宏,可以启用所有的菜单命令或者处理一组工具栏按钮。
         1) 在类的.h 文件映像的{{ }}之后定义用户界面命令处理函数,以便不受ClassWizard 的干扰。
            protected:
                 file://{{AFX_MSG(CTestView)
                 file://}}AFX_MSG
                afx_msg void OnUpdateTestCommandRange(CCmdUI* pCCmdUI);
         2) 同样,在{{ }}之后,加入ON_UPDATE_COMMAND_UI_RANGE宏到用户类的命令映像中。头两个参数定义了要处理的消息I D 的范围。这些ID有序列大小,最后一个ID值比第一个大。最后一个参数是第一步中定义的用户界面命令处理函数的名字。
             BEGIN_MESSAGE_MAP(CTestView,CView)
                file://{{AFX_MSG_MAP(CTestView)
                file://}}AFX_MSG_MAP
                ON_UPDATE_COMMAND_UI_RANGE(ID_TEST_1,ID_TEST_4,OnUpdateTestCommandRange)
             END_MESSAGE_MAP()
         3) 处理界面命令消息的语句如下:
            void CTestView::OnUpdateTestCommandRange(CCmdUI *pCmdUI)
           {
              switch (pCmdUI->m_nID)
             {
                  case ID_TEST_1: break ;
                  case ID_TEST_2:   pCmdUI->SetRadio();break ;
                  case ID_TEST_3:   break ;
                  case ID_TEST_4:   break ;
             }
           }

未完(待续...)

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝商让我修改追评叫我怎么办 红冲金额大于了当月的销售额怎么办 淘宝买家号虚假交易评价删除怎么办 淘宝卖的宝贝电话写错了怎么办 邮政快递都揽件了一直不运输怎么办 应用宝里面的安装包安装不了怎么办 苹果平板电脑充电接口坏了怎么办 读书郎平板电脑开不了机怎么办 平板电脑死机开不了机了怎么办 欧灵平板电脑忘记图密解锁怎么办 淘宝没货发给人被投诉了怎么办 淘宝店铺既不能开又不能注销怎么办 妻子被骗五万疑似被洗脑我该怎么办 奖虫账号和密码不匹配怎么办 开淘宝店余额宝里的钱怎么办 京东找不到所有宝贝的链接了怎么办 淘宝店链接改了标题没流量怎么办 淘宝手淘搜索自然流量少怎么办 4个月宝贝不食欲下降怎么办 淘宝商家预售时间到了不发货怎么办 淘宝修改类目被处置管控了怎么办 淘宝换手机号是已经注册了的怎么办 闲鱼违规把我淘宝店铺冻结了怎么办 开网店店主想买自己的东西怎么办 以前用微博登录头条的账号怎么办 公众号注册提示邮箱已被占用怎么办 学信网注册时出现邮箱被占用怎么办 手机淘宝店铺接不到买家消息怎么办 买了东西淘宝店铺没了怎么办 淘宝店铺直播间虚假交易违规怎么办 手机淘宝退款物流单号填错了怎么办 淘宝评价删除了卖家没有返现怎么办 想摆摊卖麻辣烫不知怎么摆怎么办 在淘宝卖东西买家退款不退货怎么办 在闲鱼网上买东西被骗了怎么办 开通花呗的手机号不用了怎么办 饿了么开业第一天没单量怎么办 淘宝新开店铺没有人来呀怎么办 刚开的淘宝店铺没有人买东西怎么办 开了一家龙虾店生意很淡怎么办? 新买的皮质小白鞋有点板脚怎么办