MFC程序中如何实现自定义消息

在MFC编程中,对于系统默认的消息,我们可以采用向导来快速的实现添加消息映射函数,其实我们也可以通过自己的手动添加代码,来实现自定义的消息映射函数,下面以单文档程序为例,在鼠标左键按下的时候,发送一个自定义消息,并添加消息处理函数:

1.在需要添加消息的类的头文件中,定义自定义消息.

本例中,在CView类的头文件,定义一个自定义消息

#define  WM_MYMESSAGE  2008

注意,采用宏定义消息的时候,要注意消息的范围,系统处理消息的最大值是WM_USER ,可以转到定义出看,WM_USER的值为1024,我们可以自定义的消息是任何大于改数的一个值.

2.添加消息函数的声明.

在类的头文件中添加消息函数的声明:


class CMyView : public CView
{
protected: // create from serialization only
 CMyView();
 DECLARE_DYNCREATE(CMyView)

// Attributes
public:
 CMyDoc* GetDocument();


// Operations
public:

// Overrides
 // ClassWizard generated virtual function overrides
 //{{AFX_VIRTUAL(CMyView)
 public:
 virtual void OnDraw(CDC* pDC);  // overridden to draw this view
 virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
 protected:
 virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
 virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
 virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
 //}}AFX_VIRTUAL

// Implementation
public:
 virtual ~CMyView();
#ifdef _DEBUG
 virtual void AssertValid() const;
 virtual void Dump(CDumpContext& dc) const;
#endif

protected:

// Generated message map functions
protected:
 //{{AFX_MSG(CMyView)
 afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
 //}}AFX_MSG
 DECLARE_MESSAGE_MAP()
public:
afx_msg void DoMyMessage(WPARAM wParam,LPARAM lParam);//添加自定义消息处理函数声明
};

 

3.在类的实现部分的消息映射部分,添加消息映射

BEGIN_MESSAGE_MAP(CMyView, CView)
 //{{AFX_MSG_MAP(CMyView)
 ON_WM_LBUTTONDOWN()
 //}}AFX_MSG_MAP
 // 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)
 ON_MESSAGE(WM_MYMESSAGE,CMyView::DoMyMessage)          //这个是自己添加的消息隐射(注意不要加分号)
END_MESSAGE_MAP()

 

4.编写消息处理函数

void CMyView::DoMyMessage(WPARAM wParam,LPARAM lParam)
{
 CString str;
 str.Format("x=%d y=%d",wParam,lParam);
 MessageBox(str);
}

 

5.再需要发送消息的地方发送消息.

void CMyView::OnLButtonDown(UINT nFlags, CPoint point)
{
 // TODO: Add your message handler code here and/or call default
// MessageBox("DOWN!");
 PostMessage(WM_MYMESSAGE,point.x,point.y);
 
// SendMessage()
 
 CView::OnLButtonDown(nFlags, point);
}

在鼠标左键按下的时候,发送消息,消息的两个参数包含了鼠标的横坐标和纵坐标.

注意,发送消息可以采用SendMessage或者PostMessage,前者等待消息响应再返回,后者立即返回.


 

你可能感兴趣的:(MFC程序中如何实现自定义消息)