应用程序由各种对象组成,大多数情况下,计算机上运行着多个应用程序,并且不断要求操作系统执行一些任务。
Map消息
由于Windows是面向消息的操作系统,因此Windows环境的大部分编程都涉及消息处理,每一个事件,例如一个键盘或鼠标点击发生时,一个消息被发送到该应用程序,然后必须处理该事件。
要让编译器管理消息,应将它们包含在类定义中。
应该在类定义的末尾提供 DECLARE_MESSAGE_MAP 宏,如以下代码所示。
class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: DECLARE_MESSAGE_MAP() };
实际消息应该在DECLARE_MESSAGE_MAP行的上方列出。
要实现这些消息,您需要创建一个程序正在使用的消息表。
此表使用两个定界宏;
它以 BEGIN_MESSAGE_MAP 开头,以 END_MESSAGE_MAP 宏结尾。
BEGIN_MESSAGE_MAP宏带有两个参数,即类名和从其派生类的MFC类,如以下代码所示。
#include <afxwin.h> class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: DECLARE_MESSAGE_MAP() }; CMainFrame::CMainFrame() { //Create the window's frame Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW, CRect(120, 100, 700, 480), NULL); } class CMessagesApp : public CWinApp { public: BOOL InitInstance(); }; BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) END_MESSAGE_MAP() BOOL CMessagesApp::InitInstance(){ m_pMainWnd = new CMainFrame; m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } CMessagesApp theApp;
让无涯教程通过创建一个新的Win32项目来研究一个简单的示例。
步骤1 - 要创建MFC项目,请右键单击该项目,然后选择"Properties"。
步骤2 - 在左侧部分,单击 配置Properties→General。
步骤3 - 在"Project Defaults Section"部分中选择"Use MFC in Shared DLL"选项,然后单击"OK"。
步骤4 - 需要添加一个新的源文件(new source file)。
步骤5 - 右键单击您的项目,然后选择Add→New Item。
步骤6 - 在"Templates"部分中,单击C ++文件(.cpp)。
步骤7 - 单击添加以继续。
步骤8 - 现在,将以下代码添加到* .cpp文件中。
#include <afxwin.h> class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: DECLARE_MESSAGE_MAP() }; CMainFrame::CMainFrame() { //创建窗口的框架 Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW, CRect(120, 100, 700, 480), NULL); } class CMessagesApp : public CWinApp { public: BOOL InitInstance(); }; BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) END_MESSAGE_MAP() BOOL CMessagesApp::InitInstance() { m_pMainWnd = new CMainFrame; m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); return TRUE; } CMessagesApp theApp;
Windows 消息
Windows消息有不同类型,例如创建窗口,显示窗口等,这是一些常用的Windows消息。
让无涯教程看一个简单的窗口创建示例。
WM_CREATE - 创建称为窗口的对象时,创建对象的框架会发送一条标识为 ON_WM_CREATE 的消息。
步骤1 - 要创建ON_WM_CREATE,请添加afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);在DECLARE_MESSAGE_MAP()之前,如下所示。
class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); DECLARE_MESSAGE_MAP() };
步骤2 - 在BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)之后和END_MESSAGE_MAP()之前添加ON_WM_CREATE()
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() END_MESSAGE_MAP()
步骤3 - 这是OnCreate()的实现
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { //调用基类创建窗口 if (CFrameWnd::OnCreate(lpCreateStruct) == 0) { //如果窗口创建成功,让用户知道 MessageBox(L"The window has been created!!!"); //由于窗口创建成功,返回0 return 0; } //Otherwise, return -1 return -1; }
步骤1 - 现在,您的* .cpp文件将类似于以下代码所示。
#include <afxwin.h> class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); DECLARE_MESSAGE_MAP() }; CMainFrame::CMainFrame() { //Create the window's frame Create(NULL, L"MFC Messages Demo", WS_OVERLAPPEDWINDOW, CRect(120, 100, 700, 480), NULL); } class CMessagesApp : public CWinApp { public: BOOL InitInstance(); }; BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() END_MESSAGE_MAP() int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { //调用基类创建窗口 if (CFrameWnd::OnCreate(lpCreateStruct) == 0) { //如果窗口创建成功,让用户知道 MessageBox(L"The window has been created!!!"); //由于窗口创建成功,返回0 return 0; } //Otherwise, return -1 return -1; } BOOL CMessagesApp::InitInstance() { m_pMainWnd = new CMainFrame; m_pMainWnd -> ShowWindow(SW_SHOW); m_pMainWnd -> UpdateWindow(); return TRUE; } CMessagesApp theApp;
步骤5 - 编译并执行上述代码后,您将看到以下输出。
步骤6 - 单击"OK"时,它将显示主窗口。
Command 消息
图形应用程序的主要功能之一是呈现允许用户与计算机进行交互的Windows控件和资源,将学习的控件示例包括按钮,列表框,组合框等。
在上一课中介绍的一种资源是菜单,这些控件和资源可以在用户单击它们时启动它们自己的消息,从Windows控件或资源发出的消息称为命令消息。
让无涯教程看一个简单的Command消息示例。
为了使您的应用程序能够创建新文档,CWinApp类提供了OnFileNew()方法。
afx_msg void OnFileNew(); BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_COMMAND(ID_FILE_NEW, CMainFrame::OnFileNew) END_MESSAGE_MAP()
这是方法定义-
void CMainFrame::OnFileNew() { //Create New file }
Keyboard 消息
键盘是连接到计算机的硬件对象。默认情况下,它用于在控件上输入可识别的符号,字母和其他字符,键盘上的每个键都显示一个符号,字母或这些符号的组合,以指示该键的用途,用户通常按下一个键,该键将信号发送到程序。
按下键会导致WM_KEYDOWN或WM_SYSKEYDOWN消息放置在线程消息中。这可以定义如下-
afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags);
看一个简单的例子。
步骤1 - 这是消息。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_CREATE() ON_WM_KEYDOWN() END_MESSAGE_MAP()
- 这是OnKeyDown()的实现。
void CMainFrame::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { switch (nChar) { case VK_RETURN: MessageBox(L"You pressed Enter"); break; case VK_F1: MessageBox(L"Help is not available at the moment"); break; case VK_DELETE: MessageBox(L"Can't Delete This"); break; default: MessageBox(L"Whatever"); } }
步骤3 - 编译并执行上述代码后,您将看到以下输出。
步骤4 - 按下回车键时,它将显示以下消息。
Mouse 消息
鼠标是连接到计算机的另一个对象,允许用户与计算机进行交互。
如果按下鼠标左键,则会发送ON_WM_LBUTTONDOWN消息
如果按下鼠标右键,则发送ON_WM_RBUTTONDOWN消息。
类似地,如果释放鼠标左键,则发送ON_WM_LBUTTONUP消息。
如果释放鼠标右键,则发送ON_WM_TBUTTONUP消息。
看一个简单的例子。
步骤1 - 在CMainFrame类定义中添加以下两个函数,如以下代码所示。
class CMainFrame : public CFrameWnd { public: CMainFrame(); protected: afx_msg void OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags); afx_msg void OnLButtonDown(UINT nFlags,CPoint point); afx_msg void OnRButtonUp(UINT nFlags,CPoint point); DECLARE_MESSAGE_MAP() };
步骤2 - 添加以下两个消息映射。
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) ON_WM_KEYDOWN() ON_WM_LBUTTONDOWN() ON_WM_RBUTTONUP() END_MESSAGE_MAP()
步骤3
void CMainFrame::OnLButtonDown(UINT nFlags, CPoint point) { CString MsgCoord; MsgCoord.Format(L"Left Button at P(%d, %d)", point.x, point.y); MessageBox(MsgCoord); } void CMainFrame::OnRButtonUp(UINT nFlags, CPoint point) { MessageBox(L"Right Mouse Button Up"); }
步骤4 - 运行此应用程序时,将看到以下输出。
步骤5 - 单击"OK"时,将看到以下消息。
步骤6 - 右键单击此窗口。现在,当您释放鼠标右键时,它将显示以下消息。
参考链接
https://www.learnfk.com/mfc/mfc-messages-events.html
标签:MAP,教程,MFC,CFrameWnd,CMainFrame,WM,无涯,MESSAGE,public From: https://blog.51cto.com/u_14033984/8762711