相对于Qt的信号与槽机制,MFC提供了一套消息映射机制来处理各种消息。
步骤:
1、声明宏,写到.h中
DECLARE_MESSAGE_MAP()
2、分界宏 写到.cpp中
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
//消息宏
END_MESSAGE_MAP()
3、找消息宏 写到 分界宏中
4、把函数原型 声明写到.h中
5、函数的实现写到.cpp中
完整示例:
mfc.h
#include <afxwin.h>
class MyApp :public CWinApp //CWinApp应用程序类
{
public:
//程序入口
virtual BOOL InitInstance();
};
class MyFrame :public CFrameWnd //CFrameWnd 窗口框架类
{
public:
MyFrame();
//声明宏 提供消息映射机制
DECLARE_MESSAGE_MAP()
afx_msg void OnLButtonDown(UINT, CPoint);
afx_msg void OnChar(UINT, UINT, UINT);
afx_msg void OnPaint();
};
main.cpp
#include "mfc.h"
MyApp app; //全局应用程序对象,有且仅有一个
BOOL MyApp::InitInstance()
{
//创建窗口
MyFrame *frame = new MyFrame;
//显示和更新
frame->ShowWindow(SW_SHOWDEFAULT);
frame->UpdateWindow();
m_pMainWnd = frame; //保存指向应用程序的主窗口的指针
return TRUE;
}
//分界宏
BEGIN_MESSAGE_MAP(MyFrame, CFrameWnd)
//各种消息宏
ON_WM_LBUTTONDOWN() //鼠标左键按下(key)
ON_WM_CHAR() //键盘(key)
ON_WM_PAINT() //绘图(key)
END_MESSAGE_MAP()
MyFrame::MyFrame()
{
Create(NULL, TEXT("mfc"));
}
void MyFrame::OnLButtonDown(UINT, CPoint point)
{
//TCHAR buf[1024];
//wsprintf(buf, TEXT("x = %d, y = %d"), point.x, point.y);
//MessageBox(buf);
//mfc中得到字符串 CString
CString str;
str.Format(TEXT("x = %d, y = %d"), point.x, point.y);
MessageBox(str);
}
void MyFrame::OnChar(UINT key, UINT, UINT)
{
CString str;
str.Format(TEXT("按下了%c 键"), key);
MessageBox(str);
}
void MyFrame::OnPaint()
{
CPaintDC dc(this);
//dc.TextOutW(100, 100, TEXT("Fighting!"));
//画椭圆 矩形内切圆
dc.Ellipse(10, 10, 300, 300);
}
这里面(MFC)的MessageBox不同于Win32的MessageBox,仅需提供一个参数即可。