`
wo_deqing
  • 浏览: 64208 次
文章分类
社区版块
存档分类
最新评论

VC++ MFC的消息映射、循环机制

 
阅读更多
消息映射、循环机制是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-&gt;m_hWnd, // 目标窗口<br> WM_MY_MESSAGE, // 消息<br> 0, // WPARAM<br> 0, // LPARAM<br> SMTO_ABORTIFHUNG |<br> SMTO_NORMAL,<br> TIMEOUT_INTERVAL,<br> &amp;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-&gt;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()-&gt;m_pMainWnd;<br> // 获取子窗口指针<br> pChild = (CMDIChildWnd *)pFrame-&gt;GetActiveFrame();<br> //获取视类指针<br> pView = pChild-&gt;GetActiveView();<br> if(pView != NULL)<br> pView-&gt;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-&gt;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()-&gt;m_pMainWnd;<br> // 获取子窗口指针<br> pChild = (CMDIChildWnd *)pFrame-&gt;GetActiveFrame();<br> //获取视类指针<br> pView = pChild-&gt;GetActiveView();<br> if(active != NULL)<br> active-&gt;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(&amp;rect);<br> InvalidateRect(&amp;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-&gt;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>
分享到:
评论

相关推荐

    vc++ mfc简单计算器

    - MFC消息映射机制和事件处理。 - 如何在MFC程序中处理用户输入和响应控制。 - 基本的字符串操作和数值计算。 通过这个简单的计算器项目,开发者可以深入了解MFC的工作原理,为后续开发更复杂的Windows应用程序打下...

    vc++ mfc贪吃蛇源程序

    5. **消息循环与消息映射**:MFC应用程序通常包含一个消息循环,用于处理来自操作系统的消息。消息映射机制允许开发者将特定的消息与函数关联起来,以便在接收到消息时调用相应的处理函数。 6. **游戏逻辑**:...

    VC++ MFC简明教程

    通过消息映射机制,处理窗口消息。 4. **CDocument/CTextView**:MFC的文档/视图架构,用于实现数据和显示的分离。CDocument存储数据,CView处理显示。 5. **消息映射**:MFC使用宏定义的消息映射表,将消息与函数...

    VC++ MFC类库中文chm手册

    - 消息循环:MFC应用程序的核心,负责接收和分发消息。 4. **文档/视图架构** - 文档/视图设计模式:数据(文档)与显示(视图)的分离,支持多个视图查看同一文档。 - CDocument和CView的协作:文档存储数据,...

    VC++MFC基础理论详细例程

    MFC使用消息循环来处理这些消息,并通过消息映射机制将特定的消息映射到相应的成员函数,实现事件驱动编程。 4. **CWinApp类**:CWinApp是MFC应用程序的基础类,它代表整个应用程序。在WinMain中,你需要创建...

    VC++MFC编程实例PPT学习教案.pptx

    8. 消息映射:消息映射是MFC的事件处理机制,用于将窗口消息映射到对应的成员函数。 9. 框架窗口类:框架窗口类是MFC的基本窗口类,提供了基本的窗口功能。 10. OnLButtonDown函数:OnLButtonDown函数是框架窗口类的...

    VC++之MFC类库中文手册.zip

    7. **消息映射机制**:MFC使用消息映射来处理窗口消息。在头文件中定义的消息映射宏将特定的消息与成员函数关联起来,使得消息处理更加方便。 8. **文件操作**:MFC提供了CFile类,用于处理磁盘上的文件读写,以及...

    VC++之MFC使用手册

    MFC使用消息映射机制,将Windows消息与特定的成员函数关联起来,从而实现事件处理。开发者只需在消息映射表中定义消息和响应函数的对应关系,就能处理用户的操作。 **数据库支持** MFC包含了对ODBC(Open Database ...

    vc++ MFC 计算器源代码

    6. **消息映射机制**:MFC使用消息映射机制将用户操作(如点击按钮)映射到相应的函数处理。在源码中,会有ON_BN_CLICKED等宏定义,它们定义了当用户点击按钮时执行的函数。 7. **事件驱动编程**:计算器的逻辑处理...

    VC++MFC简易钟表

    6. **消息映射(Message Map)**:MFC使用消息映射机制将Windows消息与处理函数关联起来。在`CClockWnd`类中,你需要添加消息映射条目,比如`ON_WM_PAINT`和`ON_WM_TIMER`,分别对应`WM_PAINT`(重绘窗口)和`WM_...

    VC++ MFC 图书管理系统源代码

    4. **事件处理**:MFC采用消息映射机制,通过ON_COMMAND、ON_BN_CLICKED等宏将按钮点击、菜单选择等用户交互映射到相应的函数处理。 5. **错误处理**:系统会包含错误处理和异常处理机制,以确保程序在遇到问题时...

    指针式时钟 vc++mfc编程案例 vc课设

    7. **消息循环与消息处理**:MFC应用程序的核心是一个消息循环,它不断检查消息队列,处理来自操作系统或其他来源的消息。我们需要定义消息映射表(ON_MESSAGE, ON_WM_TIMER等),并处理对应的WM_PAINT、WM_TIMER等...

    VC++MFC编程实例

    5. **事件处理**:MFC使用消息映射机制处理Windows消息,通过ON_MESSAGE、ON_COMMAND等宏定义消息处理函数。 6. **数据库访问**:MFC提供了ADO(ActiveX Data Objects)和DAO(Data Access Object)类库,用于...

    VC++ MFC 浏览器(适用初学者)

    你需要了解`Run`函数中的消息循环,以及如何使用`ON_MESSAGE`, `ON_COMMAND`等宏进行消息映射,将消息与相应的处理函数关联起来。 ### 5. **网络编程** 虽然`CHtmlView`或`CWebBrowser2`已经处理了大部分网络通信,...

    VC++ MFC Windows应用第1-8讲

    5. **消息映射**:MFC通过消息映射机制实现事件处理。开发者通过在头文件中定义MESSAGE_MAP宏,将消息与处理函数关联起来,从而响应用户操作或其他系统事件。 6. **控件和资源**:MFC提供了丰富的控件类,如按钮、...

    VC++ mfc简明教程

    3. **消息映射**:MFC通过消息映射机制将用户操作转换为对应的成员函数调用,从而实现事件驱动编程。 4. **框架窗口**:应用程序的主要窗口,用户可以在此窗口中进行各种操作。 5. **对话框**:用于与用户交互的小...

    VC++MFC绘SIN曲线.rar

    这个项目对于理解MFC的图形绘制机制非常有帮助,同时也展示了如何在C++中实现数学函数的可视化。通过学习和实践这个例子,开发者可以进一步掌握Windows编程的基本技巧,为更复杂的图形应用打下基础。同时,这也是一...

    vc++ MFC MP3播放器 源代码

    6. **事件处理**:MFC使用消息映射机制来处理用户输入和其他事件。例如,播放、暂停、停止等按钮的点击事件需要映射到相应的成员函数。 7. **界面设计**:MFC提供了对话框模板,可以用于创建播放器的界面布局,包括...

    有限自动机 VC++ MFC

    MFC提供了一些事件处理机制,如`CWinApp`的`OnIdle()`函数,可以用来持续处理输入。 ```cpp void CMyApp::OnIdle(LONG lCount) { static State currentState = State::Initial; char input; // 从输入设备获取...

Global site tag (gtag.js) - Google Analytics