天天看点

自定义消息处理示例

  我们在前两篇中简单介绍了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]编译运行。

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

继续阅读