自定义消息处理示例

来源:互联网 发布:蔡家坡广电网络 编辑:程序博客网 时间:2024/05/17 04:21
 我们在前两篇中简单介绍了MFC程序的消息处理,并简单了解了鼠标和
键盘消息。今天我们自定义一个消息并处理之~~

【预备知识】(参考:《MFC扩展编程实例》一书)
[1]怎样使用MFC发送一个消息
可以用下列目标窗口的句柄直接调用Windows API:
LRESULT Res=::SendMessage(HWND hWnd ,     //hWnd是目标窗口的句柄
              UINT Msg ,    //变量Msg是消息,
             WPARAM wParam ,//wParam和lParam变量包含消息的参
            LPARAM lParam);//数,如鼠标单击哪里或选择了什么菜单项    
目标窗口返回的消息结果放在变量Res中。

[2]怎样用MFC寄送一个消息
用MFC寄送一个消息与发送一个消息几乎相同,但寄送时用BOOL PostMessage( ) ,而不是用SendMessage( );返回值Res也不一样,Res不是一个由目标窗口返回的值,而是一个布尔值
,用来表示消息是否成功地放到消息队列中。一旦消息被寄送后,应用程序在后台发送它,
通过GetMessage()或PeekMessage()获取。

[3]自定义消息的ID(标识符)
Windows保留了0和WM_USER-1之间的整数范围,作为系统定义的窗口消息;还有一个
从WM_USER一直到OX7fff的整数范围,留给自定义消息用。可以用一个简单的#define语句
定义消息:
#define WM_MYMESSAGE1 WM_USER
#define WM_MYMESSAGE2 WM_USER+1
: : :
然后,可以像处理任何其他窗口消息一样用SendMessage(WM_MYMESSAGE1, wParam, lParam)

PostMessage(WM_MYMESSAGE1, wParam, lParam).发送或寄送这些消息。

可以用下面的宏在消息映像中获取这些新消息:
ON_MESSAGE(WM_MYMESSAGE1, Handler)
(ON_MESSAGE是系统定义的"用户自定义消息映射宏",这里我们不讨论定义自己的消息映射宏)
在这里,处理函数将具有如下格式:
LRESULT Handler(WPARAM, LPA R A M )
{
}

【完成程序】
[1]生成单文档应用程序MyDefMsg,其余均默认。

[2]定义用户消息
将"const WM_USERMSG = WM_USER + 10"加入到" MyDefMsgView.h"中CMyDefMsgView类的声名的上面

const WM_USERMSG = WM_USER + 10

class CMyDefMsgView : public CView
{
protected: // create from serialization only
    CMyDefMsgView();
    DECLARE_DYNCREATE(CMyDefMsgView) 
    ......
};

为什么要"WM_USER + 10"?——"+其它数行不行"?——可以,只要满足"从WM_USER一直到OX7fff的整数范围"即可!!!!!

[3]声名用户消息响应函数
在CMyDefMsgView类的声名中加入消息响应函数OnMyFunction():

const WM_USERMSG = WM_USER + 10
class CMyDefMsgView : public CView
{
    ......
// Operations
public:
    void OnMyFunction();//用户消息响应函数
    ......
};

[4]定义用户消息响应函数
在"MyDefMsgView.cpp "中添加OnMyFunction()函数体,并编写代码。为简单起见,只弹出了
一个消息框:
/////////////////////////////////////////////////////////////////////////////
// CMyDefMsgView message handlers
void CMyDefMsgView::OnMyFunction()
{
    MessageBox("小辉向大家问好!","自定义消息",MB_OK);
}

[5]填写消息映射
在"MyDefMsgView.cpp "文件的消息映射表中加入ON_MESSAGE(WM_USERMSG,OnMyFunction)
紧接在//}}AFX_MSG_MAP之后(你可以试着改变一下位置)
BEGIN_MESSAGE_MAP(CMyDefMsgView, CView)
    //{{AFX_MSG_MAP(CMyDefMsgView)
    ON_WM_RBUTTONDOWN()
    //}}AFX_MSG_MAP
    ON_MESSAGE(WM_USERMSG,OnMyFunction)//我们填写的消息映射
    // Standard printing commands

    ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
    ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()

[6]编写发送自定义消息的代码
首先按照上篇介绍的方法,为CMyDefMsgView类加入WM_RBUTTONDOWN消息,在WM_RBUTTONDOWN消息的处理函数OnRButtonDown(UINT nFlags, CPoint point)中加入发送自定义消息的代码:
    void CMyDefMsgView::OnRButtonDown(UINT nFlags, CPoint point) 
    {
        // TODO: Add your message handler code here and/or call default
        HWND hWnd = this->GetSafeHwnd();//得到视图窗口的句柄
        ::PostMessage(hWnd,WM_USERMSG,0,0);
        CView::OnRButtonDown(nFlags, point);
    }

[7]在CMyDefMsgView类的OnDraw()函数中加入pDC->TextOut(0,0,"按下鼠标右键,测试自定义消息!");
void CMyDefMsgView::OnDraw(CDC* pDC)
{
    CMyDefMsgDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    pDC->TextOut(0,0,"按下鼠标右键,测试自定义消息!");
}

[8]编译运行。

就到这里!!!祝大家进步!!!