您的位置:首页 > 其它

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

2008-10-07 21:00 477 查看
在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,前者等待消息响应再返回,后者立即返回.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: