EVC/VC添加自定义消息的两种方法

 

VC的ClassWizard不允许增加用户自定义消息,所以你必须手工进行添加。当你添加了自定义的消息以后,ClassWizard就可以像处理其它消息一样处理你定义的消息了。

一、VC6添加自定义消息

    1、定义消息。在Windows中,所有的消息都用一个特定的整数值来表示,为了避免自定义消息与已存在的其他消息发生冲突,应该利用Windows提供的一个常量:WM_USER,小于这个常量的是系统保留的。即用户自定义的消息至少为WM_USER+1,注意最后表示的消息的数值不要超过0x7FFF。在开发Windows95应用程序时,Microsoft推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。

    #define UM_PROGRESS WM_USER + 100

    2、在类头文件的AFX_MSG块中声明消息处理函数:

    class CMainFrame:public CFrameWnd{

    protected:

    //{{AFX_MSG(CMainFrame)

    afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);

    afx_msg void OnTimer(UINT nIDEvent);

    afx_msg LRESULT OnProgress(WPARAM wParam, LPARAM lParam);

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

    3、在类的实现文件中,使用ON_MESSAGE宏指令将消息映射到消息处理表中。

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)

    //{{AFX_MSG_MAP(CMainFrame)

        ON_WM_CREATE()

        ON_WM_TIMER()

        ON_MESSAGE(UM_PROGRESS, OnProgress)//注意这条语句的后面没有分号

    //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

    4、实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。

    LPESULT CMainFrame::OnProgress(WPARAM wParam,LPARAM lParam){

       CRect rect;

       m_wndStatusBar.GetItemRect(2,&rect); //获得窗格区域

       //创建进度栏,注意第三个参数为CWnd* pParentWnd,根据情况选择父窗体

       m_progress.Create(WS_CHILD|WS_VISIBLE|PBS_VERTICAL,rect,this,123);

       m_progress.SetPos(50);

       return 0;

    }

    5、在适当的时候发送自定义消息,进行消息处理。需要注意使用SendMessage还是PostMessage进行处理:SendMessage是消息处理完毕后再返回;而PostMessage则是把消息放到消息队列后立即返回。

    SendMessage(UM_PROGRESS);

    PostMessage(UM_PROGRESS);    

    如果用户需要整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。

二、VC2003添加自定义消息

    在VC2003中添加自定义消息和VC6基本一致。需要注意的是VC6处理的消息可以没有参数,但VC2003消息处理的函数必须带有两个参数wParam和lParam,并且其返回值类型为LRESULT。这里,还有另一种方法可以实现地定义消息的处理(VC6和VC2003均适用):

    1、定义消息:#define UM_PROGRESS WM_USER + 100

    2、重载CMainFrame的DefWindowProc函数,然后添加对用户自定义消息处理:

    LRESULT CMainFrame::DefWindowProc(UINT message, WPARAM wParam,

                                      LPARAM lParam){

        switch(message){

       case UM_PROGRESS:{

            //通过指定资源ID获得相应的索引

            int index = m_wndStatusBar.CommandToIndex(IDS_PROGRESS);

           CRect rect;

          m_wndStatusBar.GetItemRect(index,&rect);

           m_progress.Create(WS_CHILD|WS_VISIBLE,rect,&m_wndStatusBar

                              ,123);

           m_progress.SetPos(50);

           break;

        }

        default:

            break;

……

转载于:https://www.cnblogs.com/zd_ad/archive/2010/11/17/1879853.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值