消息映射、循环机制是Windows程序运行的基本方式。VC++ MFC 中有许多现成的消息句柄
,可当我们需要完成其它的任务,需要自定义消息,就遇到了一些困难。在MFC
<wbr><wbr><br>
ClassWizard中不允许添加用户自定义消息,所以我们必须在程序中添加相应代码,以便可<br>
以象处理其它消息一样处理自定义消息。通常的做法是采取以下步骤:<br><wbr><wbr><br>
第一步:定义消息。<br><wbr><wbr><br>
推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。<br><wbr><wbr><br>
#define WM_MY_MESSAGE (WM_USER+100) <wbr><wbr><br><wbr><wbr><br>
第二步:实现消息处理函数。该函数使用WPRAM和LPARAM参数并返回LPESULT。<wbr><wbr><br><wbr><wbr><br>
LPESULT CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)<wbr><wbr><br>
{ <wbr><wbr><br>
// TODO: 处理用户自定义消息 <wbr><wbr><br>
... <wbr><wbr><br>
return 0; <wbr><wbr><br>
} <wbr><wbr><br><wbr><wbr><br>
第三步:在类头文件的AFX_MSG块中说明消息处理函数:<br><wbr><wbr><br>
class CMainFrame:public CMDIFrameWnd<wbr><wbr><br>
{ <wbr><wbr><br>
... <wbr><wbr><br>
// 一般消息映射函数 <wbr><wbr><br>
protected: <wbr><wbr><br>
// {{AFX_MSG(CMainFrame) <wbr><wbr><br>
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);<wbr><wbr><br>
afx_msg void OnTimer(UINT nIDEvent);<wbr><wbr><br>
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);<wbr><wbr><br>
//}}AFX_MSG <wbr><wbr><br>
DECLARE_MESSAGE_MAP() <wbr><wbr><br>
} <wbr><wbr><br><wbr><wbr><br>
第四步:在用户类的消息块中,使用ON_MESSAGE宏指令将消息映射到消息处理函数中。<br><wbr><wbr><br><wbr><wbr><br>
BEGIN_MESSAGE_MAP(CMainFrame, CMDIFrameWnd)<wbr><wbr><br>
//{{AFX_MSG_MAP(CMainFrame) <wbr><wbr><br>
ON_WM_CREATE() <wbr><wbr><br>
ON_WM_TIMER() <wbr><wbr><br>
ON_MESSAGE(WM_MY_MESSAGE, OnMyMessage)<wbr><wbr><br>
//}}AFX_MSG_MAP <wbr><wbr><br>
END_MESSAGE_MAP() <wbr><wbr><br><wbr><wbr><br>
如果用户需要一个定义整个系统唯一的消息,可以调用SDK函数RegisterWindowMessage定义<br>
消息:<br><wbr><wbr><br>
static UINT WM_MY_MESSAGE=RegisterWindowMessage("User");<wbr><wbr><br><wbr><wbr><br>
并使用ON_REGISTERED_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步骤同上。<br><wbr><wbr><br>
当需要使用自定义消息时,可以在相应类中的函数中调用函数PostMessage或SendMessa<br>
ge发送消息PoseMessage(WM_MY_MESSAGE,O,O); 如果向其他进程发送消息可通过如下方法<br>
发送消息:<br><wbr><wbr><br>
DWORD result;<br>
SendMessageTimeout(wnd->m_hWnd, // 目标窗口<br>
WM_MY_MESSAGE, // 消息<br>
0, // WPARAM<br>
0, // LPARAM<br>
SMTO_ABORTIFHUNG |<br>
SMTO_NORMAL,<br>
TIMEOUT_INTERVAL,<br>
&result); <wbr><wbr><br><wbr><wbr><br>
以避免其它进程如果被阻塞而造成系统死等状态。<br><wbr><wbr><br>
可是如果需要向其它类(如主框架、子窗口、视类、对话框、状态条、工具条或其他控<br>
件等)发送消息时,上述方法显得无能为力,而在编程过程中往往需要获取其它类中的某个<br>
识别信号,MFC框架给我们造成了种种限制,但是可以通过获取某个类的指针而向这个类发送<br>
消息,而自定义消息的各种动作则在这个类中定义,这样就可以自由自在的向其它类发送<br>
消息了。<br><wbr><wbr><br>
下面举的例子叙述了向视类和框架类发送消息的方法:<br><wbr><wbr><br>
在主框架类中向视类发送消息:<br><wbr><wbr><br>
视类中定义消息:<br><wbr><wbr><br>
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage) //定义消息映射<br>
视类定义消息处理函数:<br><wbr><wbr><br>
// 消息处理函数<br>
LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAMlParam)<br>
{<br>
// TODO: 处理用户自定义消息 <wbr><wbr><br>
... <wbr><wbr><br>
return 0;<br>
} <wbr><wbr><br><wbr><wbr><br>
//发送消息的测试函数<br>
void CMainFrame::OnTest()<br>
{<br>
CView * active = GetActiveView();//获取当前视类指针<br>
if(active != NULL)<br>
active->PostMessage(WM_MY_MESSAGE,0,0);<br>
} <wbr><wbr><br><wbr><wbr><br>
在其它类中向视类发送消息:<br><wbr><wbr><br>
//发送消息的测试函数<br>
void CMainFrame::OnTest()<br>
{<br>
CMDIFrameWnd *pFrame;<br>
CMDIChildWnd *pChild;<br>
CView *pView;<br>
//获取主窗口指针<br>
pFrame=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;<br>
// 获取子窗口指针<br>
pChild = (CMDIChildWnd *)pFrame->GetActiveFrame();<br>
//获取视类指针<br>
pView = pChild->GetActiveView();<br>
if(pView != NULL)<br>
pView->PostMessage(WM_MY_MESSAGE,0,0);//发送消息<br>
} <wbr><wbr><br><wbr><wbr><br>
其余步骤同上。<br><wbr><wbr><br>
在视类中向主框架发送消息:<br><wbr><wbr><br>
首先在主框架中定义相关的消息,方法同上,然后在发送消息的函数中添加代码如下<br><wbr><wbr><br>
//发送消息的测试函数<br>
void CMessageView::OnTest()<br>
{<br>
CFrameWnd * active = GetActiveFrame();//获取当前主窗口框架指针<br>
if(active != this)<br>
active->PostMessage(WM_MY_MESSAGE,0,0);<br>
return 0;<br>
} <wbr><wbr><br><wbr><wbr><br>
在其它类中向不同的类发送消息可依次方法类推,这样我们的程序就可以的不受限制<br>
向其它类和进程发送消息,而避免了种种意想不到的风险。<br><wbr><wbr><br>
下面一个例子程序为多文档程序里在一对话框中向视类发送消息,详述了发送自定义消<br>
息的具体过程。<br>
实现步骤:<br><wbr><wbr><br>
第一步:在VC++中新建工程Message,所有ClassWizard步骤选项均为缺省,完成。<br><wbr><wbr><br>
第二步:在主菜单中添加测试菜单为调出对话框,在框架类中建立相应函数OnTest()<br><wbr><wbr><br>
第三步:在资源中建立对话框,通过ClassWizard添加新类TestDialog,添加测试按钮,<br><wbr><wbr><br><wbr><wbr><br>
在对话框类中建立相应函数OnDialogTest()<br><wbr><wbr><br>
//通过对话框按钮发送消息的函数<br>
void TestDialog::OnDialogTest()<br>
{<br>
CMDIFrameWnd *pFrame;<br>
CMDIChildWnd *pChild;<br>
CView *pView;<br>
//获取主窗口指针<br>
pFrame=(CMDIFrameWnd*)AfxGetApp()->m_pMainWnd;<br>
// 获取子窗口指针<br>
pChild = (CMDIChildWnd *)pFrame->GetActiveFrame();<br>
//获取视类指针<br>
pView = pChild->GetActiveView();<br>
if(active != NULL)<br>
active->PostMessage(WM_MY_MESSAGE,0,0);//发送消息<br>
} <wbr><wbr><br><wbr><wbr><br>
在Message.h头文件中添加如下语句:<br><wbr><wbr><br>
static UINT WM_MY_MESSAGE=RegisterWindowMessage("Message");<wbr><wbr><br><wbr><wbr><br>
第四步:在视类中添加自定义消息:<br><wbr><wbr><br>
在头文件MessageView.h中添加消息映射<br><wbr><wbr><br>
protected:<br>
//{{AFX_MSG(CMessageView)<br>
//}}AFX_MSG<br>
afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam);//此行为添加代码<br>
DECLARE_MESSAGE_MAP()<br>
在视类文件MessageView.cpp中的消息映射中添加自定义消息映射<br>
BEGIN_MESSAGE_MAP(CMessageView, CView)<br>
//{{AFX_MSG_MAP(CMessageView)<br>
//}}AFX_MSG_MAP<br>
// Standard printing commands<br>
ON_REGISTERED_MESSAGE(WM_MY_MESSAGE,OnMyMessage)//此行添加代码定义唯一消息<br>
END_MESSAGE_MAP() <wbr><wbr><br><wbr><wbr><br>
添加相应的0消息处理函数<br><wbr><wbr><br>
LRESULT CMessageView::OnMyMessage(WPARAM wParam, LPARAMlParam)<br>
{<br>
CRect rect;<br>
GetClientRect(&rect);<br>
InvalidateRect(&rect);<br>
test=!test;<br>
return 0;<br>
} <wbr><wbr><br><wbr><wbr><br>
在MessageView.h中添加布尔变量 public:BOOL test;<br><wbr><wbr><br>
在视类构造函数中初始化 test变量:test=FALSE;<br><wbr><wbr><br>
修改CMessageView::OnDraw()函数<br><wbr><wbr><br>
void CMessageView::OnDraw(CDC* pDC)<br>
{<br>
CMessageDoc* pDoc = GetDocument();<br>
ASSERT_VALID(pDoc);<br>
// 以下程序显示消息响应效果<br>
if(test)<br>
pDC->TextOut(0,0,"消息响应!");<br>
} <wbr><wbr><br><wbr><wbr><br>
第五步:显示测试对话框<br><wbr><wbr><br>
在MainFrame类中包含对话框头文件:<br><wbr><wbr><br>
#include "TestDialog.h";<br>
OnTest()函数中添加代码<br>
void CMainFrame::OnTest()<br>
{<br>
TestDialog dialog;<br>
dialog.DoModal();<br>
} <wbr><wbr><br><wbr><wbr><br>
运行程序,在测试菜单打开对话框,点击测试按钮即可看到结果。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
分享到:
相关推荐
- MFC消息映射机制和事件处理。 - 如何在MFC程序中处理用户输入和响应控制。 - 基本的字符串操作和数值计算。 通过这个简单的计算器项目,开发者可以深入了解MFC的工作原理,为后续开发更复杂的Windows应用程序打下...
5. **消息循环与消息映射**:MFC应用程序通常包含一个消息循环,用于处理来自操作系统的消息。消息映射机制允许开发者将特定的消息与函数关联起来,以便在接收到消息时调用相应的处理函数。 6. **游戏逻辑**:...
通过消息映射机制,处理窗口消息。 4. **CDocument/CTextView**:MFC的文档/视图架构,用于实现数据和显示的分离。CDocument存储数据,CView处理显示。 5. **消息映射**:MFC使用宏定义的消息映射表,将消息与函数...
- 消息循环:MFC应用程序的核心,负责接收和分发消息。 4. **文档/视图架构** - 文档/视图设计模式:数据(文档)与显示(视图)的分离,支持多个视图查看同一文档。 - CDocument和CView的协作:文档存储数据,...
MFC使用消息循环来处理这些消息,并通过消息映射机制将特定的消息映射到相应的成员函数,实现事件驱动编程。 4. **CWinApp类**:CWinApp是MFC应用程序的基础类,它代表整个应用程序。在WinMain中,你需要创建...
8. 消息映射:消息映射是MFC的事件处理机制,用于将窗口消息映射到对应的成员函数。 9. 框架窗口类:框架窗口类是MFC的基本窗口类,提供了基本的窗口功能。 10. OnLButtonDown函数:OnLButtonDown函数是框架窗口类的...
7. **消息映射机制**:MFC使用消息映射来处理窗口消息。在头文件中定义的消息映射宏将特定的消息与成员函数关联起来,使得消息处理更加方便。 8. **文件操作**:MFC提供了CFile类,用于处理磁盘上的文件读写,以及...
MFC使用消息映射机制,将Windows消息与特定的成员函数关联起来,从而实现事件处理。开发者只需在消息映射表中定义消息和响应函数的对应关系,就能处理用户的操作。 **数据库支持** MFC包含了对ODBC(Open Database ...
6. **消息映射机制**:MFC使用消息映射机制将用户操作(如点击按钮)映射到相应的函数处理。在源码中,会有ON_BN_CLICKED等宏定义,它们定义了当用户点击按钮时执行的函数。 7. **事件驱动编程**:计算器的逻辑处理...
6. **消息映射(Message Map)**:MFC使用消息映射机制将Windows消息与处理函数关联起来。在`CClockWnd`类中,你需要添加消息映射条目,比如`ON_WM_PAINT`和`ON_WM_TIMER`,分别对应`WM_PAINT`(重绘窗口)和`WM_...
4. **事件处理**:MFC采用消息映射机制,通过ON_COMMAND、ON_BN_CLICKED等宏将按钮点击、菜单选择等用户交互映射到相应的函数处理。 5. **错误处理**:系统会包含错误处理和异常处理机制,以确保程序在遇到问题时...
7. **消息循环与消息处理**:MFC应用程序的核心是一个消息循环,它不断检查消息队列,处理来自操作系统或其他来源的消息。我们需要定义消息映射表(ON_MESSAGE, ON_WM_TIMER等),并处理对应的WM_PAINT、WM_TIMER等...
5. **事件处理**:MFC使用消息映射机制处理Windows消息,通过ON_MESSAGE、ON_COMMAND等宏定义消息处理函数。 6. **数据库访问**:MFC提供了ADO(ActiveX Data Objects)和DAO(Data Access Object)类库,用于...
你需要了解`Run`函数中的消息循环,以及如何使用`ON_MESSAGE`, `ON_COMMAND`等宏进行消息映射,将消息与相应的处理函数关联起来。 ### 5. **网络编程** 虽然`CHtmlView`或`CWebBrowser2`已经处理了大部分网络通信,...
5. **消息映射**:MFC通过消息映射机制实现事件处理。开发者通过在头文件中定义MESSAGE_MAP宏,将消息与处理函数关联起来,从而响应用户操作或其他系统事件。 6. **控件和资源**:MFC提供了丰富的控件类,如按钮、...
3. **消息映射**:MFC通过消息映射机制将用户操作转换为对应的成员函数调用,从而实现事件驱动编程。 4. **框架窗口**:应用程序的主要窗口,用户可以在此窗口中进行各种操作。 5. **对话框**:用于与用户交互的小...
这个项目对于理解MFC的图形绘制机制非常有帮助,同时也展示了如何在C++中实现数学函数的可视化。通过学习和实践这个例子,开发者可以进一步掌握Windows编程的基本技巧,为更复杂的图形应用打下基础。同时,这也是一...
6. **事件处理**:MFC使用消息映射机制来处理用户输入和其他事件。例如,播放、暂停、停止等按钮的点击事件需要映射到相应的成员函数。 7. **界面设计**:MFC提供了对话框模板,可以用于创建播放器的界面布局,包括...
MFC提供了一些事件处理机制,如`CWinApp`的`OnIdle()`函数,可以用来持续处理输入。 ```cpp void CMyApp::OnIdle(LONG lCount) { static State currentState = State::Initial; char input; // 从输入设备获取...