MFC对话框向主窗体传递消息机制
- 格式:doc
- 大小:444.50 KB
- 文档页数:3
1. 模态对话框在涉及GUI程序开发的过程中,常常有模态对话框以及非模态对话框的概念模态对话框:在子界面活动期间,父窗口是无法进行消息响应。
独占用户输入非模态对话框:各窗口之间不影响主要区别:非模态对话框与APP共用消息循环,不会独占用户。
模态对话框独占用户输入,其他界面无法响应在用户层的主要逻辑如下:1 TestDlgdlg;23 if (dlg.DoModal() == IDOK)4 {5 //处理完毕后的操作6 }7 .......//后续处理在具体实现中,有如下几个步骤:1. 让父窗口失效EnableWindow(parentWindow, FALSE)2. 建立模态对话框自己的消息循环(RunModalLoop)3. 直至接收关闭消息,消息循环终止,并销毁窗口。
01 INT_PTR CDialog::DoModal()02 {03 //对话框资源加载04 ......0506 //在创建模态窗口之前先让父窗口失效,不响应键盘、鼠标产生的消息07 HWND hWndParent = PreModal();08 AfxUnhookWindowCreate();09 BOOL bEnableParent = FALSE;1011 if (hWndParent&&hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))12 {13 ::EnableWindow(hWndParent, FALSE);14 bEnableParent = TRUE;15 .......16 }1718 //创建模态窗口,并进行消息循环,若窗口不关闭,则循环不退出 19 AfxHookWindowCreate(this);20 VERIFY(RunModalLoop(dwFlags) == m_nModalResult);2122 //窗口关闭,销毁窗口23 DestroyWindow();24 PostModal();2526 //释放资源,并让父窗口有效27 pMainWnd->EnableWindow(TRUE);2829 //返回30 return m_nModalResult;31 }2. 模态窗口中的消息循环01 int CWnd::RunModalLoop(DWORD dwFlags)02 {03 //要检查窗口状态是否是模态窗口04 //若状态一直为模态,则一直进行消息循环05 for (;;)06 {07 ASSERT(ContinueModal());0809 // phase1: check to see if we can do idle work10 while (bIdle&&11 !::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE)) 12 {13 ASSERT(ContinueModal());1415 // show the dialog when the message queue goes idle 16 if (bShowIdle)17 {18 ShowWindow(SW_SHOWNORMAL);19 UpdateWindow();20 bShowIdle = FALSE;21 }2223 // call OnIdle while in bIdle state24 if (!(dwFlags& MLF_NOIDLEMSG) &&hWndParent != NULL &&lIdleCount == 0)25 {26 // send WM_ENTERIDLE to the parent27 ::SendMessage(hWndParent, WM_ENTERIDLE, MSGF_DIALOGBOX, (LPARAM)m_hWnd);28 }29 if ((dwFlags& MLF_NOKICKIDLE) ||30 !SendMessage(WM_KICKIDLE, MSGF_DIALOGBOX, lIdleCount++))31 {32 // stop idle processing next time33 bIdle = FALSE;34 }35 }3637 //在有消息的情况下取消息处理38 do39 {40 ASSERT(ContinueModal());4142 // pump message, but quit on WM_QUIT43 if (!AfxPumpMessage())44 {45 AfxPostQuitMessage(0);46 return -1;47 }4849 // show the window when certain special messages rec'd 50 if (bShowIdle&&51 (pMsg->message == 0x118 || pMsg->message == WM_SYSKEYDOWN))52 {53 ShowWindow(SW_SHOWNORMAL);54 UpdateWindow();55 bShowIdle = FALSE;56 }5758 if (!ContinueModal())59 goto ExitModal;6061 // reset "no idle" state after pumping "normal" message 62 if (AfxIsIdleMessage(pMsg))63 {64 bIdle = TRUE;65 lIdleCount = 0;66 }6768 } while (::PeekMessage(pMsg, NULL, NULL, NULL, PM_NOREMOVE));69 }7071 ExitModal:72 m_nFlags&= ~(WF_MODALLOOP|WF_CONTINUEMODAL);73 return m_nModalResult;74 } GetMessage 与PeekMessage 的区别:GetMessage:用于从消息队列读取消息。
多媒体定时器方法中MFC跨线程传递窗口类消息的实现傅瑶;韩诚山【期刊名称】《微型电脑应用》【年(卷),期】2014(30)6【摘要】为实现高频数据采集,采用多媒体定时器的方法实现上位机精确定时,同时研究实现了MFC中跨线程窗口类消息传递问题的解决方案。
实验表明,定时精度高,达到10毫秒精确定时,不会出现数据丢失,运行良好。
%To achieve high-frequency data collection, it uses multimedia timer method to achieve precise timing on PC, while re-search to achieve a cross-thread the MFC window class messaging solution to the problem. Experimental results show that timing accuracy is high, precision timing up to 10 milliseconds, without data loss, running well.【总页数】3页(P5-6,9)【作者】傅瑶;韩诚山【作者单位】中科院长春光机所;中科院长春光机所【正文语种】中文【中图分类】TP391.8【相关文献】1.在机顶盒环境中实现基于窗口消息传递的通用GUI [J], 张萍2.在MFC DLLs中导出资源及其相关类的实现方法 [J], 何珍文3.拦截Windows传递VB窗口的消息 [J], 刘建都;周炜;周创明4.MFC中的消息映射和命令传递 [J], 甄力;郭宝增5.消息传递网络中的消息传递机制和路由算法 [J], 朱永华;姚洪;徐炜民因版权原因,仅展示原文概要,查看原文内容请购买。
在MFC(Microsoft Foundation Classes)中,通常使用Win32的API来执行跨线程的操作。
但如果你需要从一个非UI线程(比如一个工作线程或后台线程)返回到主UI线程并执行某个方法,你可以使用多种技术来实现。
下面是一个基本的方法,使用PostMessage或SendMessage来通知主线程执行某个操作。
定义自定义消息:首先,你需要定义一个自定义的消息,这样当后台线程需要主线程执行某个操作时,就可以发送这个消息。
cpp#define WM_MY_CUSTOM_MESSAGE (WM_USER + 1)处理消息:在你的主窗口类(通常是一个从CWnd或CDialogEx派生的类)中,你需要重写WindowProc方法来处理这个自定义消息。
cppBEGIN_MESSAGE_MAP(CYourMainWindow, CFrameWnd)ON_MESSAGE(WM_MY_CUSTOM_MESSAGE, &CYourMainWindow::OnMyCustomMessage)END_MESSAGE_MAP()LRESULT CYourMainWindow::OnMyCustomMessage(WPARAM wParam, LPARAM lParam){// 在这里执行你需要的方法或操作return0;}从后台线程发送消息:当你的后台线程需要主线程执行某个操作时,它可以发送自定义的消息。
cpp::PostMessage((HWND)yourMainWindowHandle, WM_MY_CUSTOM_MESSAGE, 0, 0);这里,yourMainWindowHandle是主窗口的句柄。
你可以通过多种方式获取这个句柄,比如将其作为参数传递给后台线程,或者在创建后台线程之前保存它。
4.注意事项:使用PostMessage是异步的,意味着它会立即返回,而消息会被放入主线程的消息队列中等待处理。
mfc使用手册MFC(Microsoft Foundation Class Library)是微软提供的一个类库,用于简化Windows应用程序的开发过程。
以下是MFC使用手册的简要介绍:1. 简介:MFC是一个基于C++的类库,它提供了许多用于构建Windows应用程序的类和函数。
通过使用MFC,开发人员可以快速地构建具有一致外观和感觉的应用程序,并利用Windows平台提供的各种功能。
2. 安装和配置:在开始使用MFC之前,您需要安装Microsoft Visual Studio并确保安装了MFC开发工作负载。
安装完成后,您需要创建一个新的MFC项目或打开一个现有的MFC项目。
3. 创建MFC应用程序:要创建一个新的MFC应用程序,您需要使用Microsoft Visual Studio的向导。
选择“File”菜单中的“New”选项,然后选择“Project”。
在弹出的对话框中,选择“MFC Application”并按照向导的提示完成应用程序的创建过程。
4. MFC类库:MFC提供了许多用于构建应用程序的类和函数。
以下是一些常用的MFC类:CWinApp:应用程序对象类,用于管理应用程序级别的操作,例如初始化应用程序和退出应用程序。
CWnd:窗口类,用于管理窗口的各种操作,例如创建窗口、处理消息和绘制窗口。
CDocument:文档类,用于管理应用程序中的文档数据。
CView:视图类,用于管理应用程序中的视图,例如显示文档数据和与用户交互。
5. MFC消息处理:MFC使用消息传递机制来处理用户与应用程序的交互。
每个窗口和控件都处理一组预定义的消息,例如鼠标点击、键盘输入和窗口大小改变等。
通过覆盖类中的虚函数,您可以定义应用程序如何响应这些消息。
6. MFC对话框和控件:MFC提供了许多内置的对话框和控件,例如按钮、文本框和列表框等。
您可以使用对话框编辑器来创建对话框,并将控件拖放到对话框中。
新建WClient工程基于对话框OK,直接Finish界面制作我们需要三个按钮移除它们接下来添加六个静态文本三个编辑框两个列表控件,最后我们有:接下来设置控件文本,控件ID,设置成员变量,排布界面调整:-设置文本居右横排变竖排:Center vertically 反选中。
拉长两个静态文本控件调整两个ListBox同样大小Make Same Size空间ID设置:成员变量设置:你可以使用Ctrl+W快捷键跳出该窗口点OK点OK点OK点OK点OK点OK点OK点OK点OK点OK点OK现在客户端界面已经准备好了,接下来就是服务器了过程略:现在所有界面准备完毕,接下来为两个程序添加对应的继承CSocket类的类在WClient中:Ctrl+W –》Add Class-》NewClass我们添加了什么呢?在WClient中:Ctrl+W –》Add Class-》NewClass然后呢接下来为两个类添加虚函数CWClientSocket 调出右键菜单Add Handler ,我们将所有的都添加进去。
虽然不是所有的都用的上,但有总比没有好CWServerSocket接下来我们可以看看CPP H文件中的变化头文件(.h)源文件(.cpp)接下来添加代码:首先,服务器端需要响应客户端连接接受客户端发送的数据,向客户端发送数据,管理Socket套接字。
则服务器端需要对OnAccept、OnRecieve、OnClose事件进行响应处理。
在CServerDlg.h中定义窗体响应Socket类对应事件的响应函数定义Socket对象,以及CSocketFile ,CArchive对象(有关说明查阅课本169页)在CServerDlg.h中包含我们定义的CWServerSocket对象的变量用于监听端口,以及与客户端(一个)进行通信添加CWServerSocket.h头文件定义对象在CServerSocket.h中定义用于存储窗体变量的指针,和初始化函数。
MFC六大核心机制1.消息映射机制:MFC使用明确的消息映射机制来处理用户界面和系统事件。
应用程序通过重写消息映射函数来处理不同的消息事件,如鼠标点击、按键操作等。
消息映射机制使得开发者可以方便地响应和处理不同的用户交互动作。
2. 文档视图(Doc/View)体系:MFC采用了文档视图体系,将应用程序数据(文档)和用户界面(视图)分离。
文档表示应用程序的数据,视图代表用户界面,通过文档视图模式可以实现多视图的显示和操作。
开发者可以自定义文档类和视图类,通过它们来管理和展示数据。
3.对象序列化机制:对象序列化是指将对象的状态转换为可以存储或传输的格式,以便于在不同的环境中恢复对象的状态。
MFC提供了强大的对象序列化支持,可以方便地对应用程序的数据进行存储和加载。
开发者只需将需要序列化的成员变量标记为可序列化,并实现相关的序列化函数即可实现数据的持久化。
4.多线程支持:MFC提供了多线程支持,使得应用程序可以在多个线程中同时执行任务。
开发者可以使用MFC提供的线程类来创建和管理线程,并通过消息机制进行线程间的通信。
多线程支持有助于提高应用程序的性能和响应能力。
MFC的运行时类是一组用于封装常用功能的类,包括字符串操作、容器类、文件I/O等。
这些类提供了方便、高效的操作接口,减少了开发者对底层操作的依赖。
开发者可以直接使用MFC提供的运行时类来简化开发过程。
6.扩展性:MFC提供了丰富的扩展性机制,包括自定义控件、自定义对话框、自定义视图等。
开发者可以通过派生已有的MFC类来创建自定义的控件或界面,以满足特定的应用程序需求。
扩展性机制使得开发者可以充分发挥自己的创造力和想象力,实现更加个性化的应用程序。
总结:MFC六大核心机制为开发者提供了丰富的类和功能,使得开发Windows图形界面应用程序更加简单和高效。
通过消息映射机制、文档视图体系、对象序列化机制、多线程支持、运行时类和扩展性机制,开发者可以轻松地实现各种应用程序的需求,并提供更好的用户体验。
MFC对话框与对话框之间的参数传递实例在MFC中,对话框是一种常用的窗口类型,用于显示和接收用户输入。
对话框之间的参数传递是实现不同对话框之间数据交互的一种重要方法。
本文将通过一个实例来演示如何在MFC对话框之间进行参数传递。
首先,我们需要在对话框A的头文件中添加一个成员变量来保存需要传递的文本。
在对话框A的类声明中添加如下代码:```cppCString m_strText;``````cppUpdateData( FALSE ); // 将对话框中的控件值与成员变量关联``````cppCDialogB dlgB; // 创建对话框B的实例dlgB.m_strText = m_strText; // 将对话框A的成员变量值传递给对话框B的成员变量dlgB.DoModal(; // 显示对话框B```注意,我们在创建对话框B的实例之后,直接将对话框A的成员变量值赋给对话框B的成员变量。
这样,当对话框B显示时,对话框B的成员变量就会包含对话框A传递过来的值。
现在,我们来处理对话框B。
同样地,在对话框B的头文件中添加一个成员变量来保存从对话框A传递过来的文本。
在对话框B的类声明中添加如下代码:```cppCString m_strText;```然后,在对话框B的OnInitDialog(函数中,将文本框与成员变量关联起来,并设置文本框的值为成员变量的值。
在OnInitDialog(函数中添加如下代码:```cppUpdateData( FALSE ); // 将对话框中的控件值与成员变量关联```最后,在对话框B的.cpp文件中,我们可以使用m_strText的值进行一些处理。
比如,在OnOK(函数中,我们可以将m_strText的值输出到调试窗口。
在OnOK(函数中添加如下代码:```cppUpdateData( TRUE ); // 将文本框中的文本值与成员变量关联//将文本值输出到调试窗口TRACE( _T( "传递的文本值为:%s\n" ), m_strText );```现在,当我们在对话框A中输入一些文本,然后点击按钮,对话框B 将被创建并显示出来。
MFC教程(4)但是在当前例子中,当前对象的类CTview没有覆盖该函数,所以CWnd的WindowProc被调用。
这个函数把下一步的工作交给OnWndMsg函数来处理。
如果OnWndMsg没有处理,则交给DefWindowProc来处理。
OnWndMsg和DefWindowProc都是CWnd类的虚拟函数。
OnWndMsg的原型如下:BOOL CWnd::OnWndMsg( UINT message,WPARAM wParam, LPARAM lParam,RESULT*pResult ); 该函数是虚拟函数。
和WindowProc一样,由于当前对象的类CTview没有覆盖该函数,所以CWnd的OnWndMsg被调用。
在CWnd中,MFC使用OnWndMsg来分别处理各类消息:如果是WM_COMMAND消息,交给OnCommand处理;然后返回。
如果是WM_NOTIFY消息,交给OnNotify处理;然后返回。
如果是WM_ACTIVATE消息,先交给_AfxHandleActivate 处理(后面5.3.3.7节会解释它的处理),再继续下面的处理。
如果是WM_SETCURSOR消息,先交给_AfxHandleSetCursor处理;然后返回。
如果是其他的Windows消息(包括WM_ACTIVATE),则首先在消息缓冲池进行消息匹配,若匹配成功,则调用相应的消息处理函数;若不成功,则在消息目标的消息映射数组中进行查找匹配,看它是否处理当前消息。
这里,消息目标即CTview对象。
如果消息目标处理了该消息,则会匹配到消息处理函数,调用它进行处理;否则,该消息没有被应用程序处理,OnWndMsg返回FALSE。
关于Windows消息和消息处理函数的匹配,见下一节。
缺省处理函数DefWindowProc将在讨论对话框等的实现时具体分析。
Windows消息的查找和匹配CWnd或者派生类的对象调用OnWndMsg搜索本对象或者基类的消息映射数组,寻找当前消息的消息处理函数。
何谓消息、消息处理函数、消息映射?消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。
具体的某个操作是你的一系列代码。
称为消息处理函数。
在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。
一个switch case语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。
但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switch case语句了,取而代之的是一个叫消息映射的东西。
为什么MFC 要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switch case,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。
因此MFC采用了一种新的机制。
利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。
这种机制就是消息映射。
这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。
这样做显然是高效的。
MFC提供的消息结构同时MFC定义了下面的两个主要结构:AFX_MSGMAP_ENTRYstruct AFX_MSGMAP_ENTRY{UINT nMessage; // Windows消息的ID号UINT nCode; // 控制消息的通知UINT nID; // Windows控制消息的IDUINT nLastID; //表示是一个指定范围的消息被映射的范围UINT nSig; //表示消息的动作标识AFX_PMSG pfn; // 指向消息处理函数的指针};AFX_MSGMAPstruct AFX_MSGMAP{#ifdef _AFXDLLconst AFX_MSGMAP* (PASCAL* pfnGetBaseMap)();#elseconst AFX_MSGMAP* pBaseMap;#endifconst AFX_MSGMAP_ENTRY* lpEntries;};///AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。
MFC框架的基本运行原理一、概述MFC(Microsoft Foundation Classes)是微软公司开发的基于C++的框架库,用于开发Windows应用程序。
MFC框架的基本运行原理是通过提供一系列的类和函数,封装了Windows操作系统的API,使开发者能够更加方便地创建、管理和操作Windows应用程序的各种界面元素。
二、MFC框架结构MFC框架的结构可以分为以下几个主要部分:1. 应用程序类MFC应用程序类(CWinApp)是MFC框架的入口点,一个MFC应用程序只能有一个应用程序类的实例。
应用程序类负责初始化MFC框架,创建主窗口,处理消息循环等。
2. 窗口类MFC窗口类(CWnd)是应用程序中各个窗口的基类,包括主窗口、对话框等。
窗口类负责创建和管理窗口对象,并处理窗口消息。
3. 控件类MFC控件类(CButton、CEdit、CListCtrl等)是MFC框架提供的一系列封装了Windows操作系统控件的类。
通过使用控件类,开发者可以快速创建和使用各种常见的窗口控件。
4. 文档视图模型类MFC文档视图模型类(CDocument、CView)是MFC框架中用于实现文档视图模型的基类。
文档类负责处理文件的读写和数据的保存,视图类负责显示数据并响应用户输入。
三、MFC消息循环MFC框架是事件驱动的,通过消息循环来处理用户输入和系统消息。
消息循环是一个无限循环,等待用户输入和系统消息的到来,然后将消息分发给相应的窗口进行处理。
消息循环的基本流程如下:1.调用消息循环函数,如AfxWinMain。
2.接收并分发消息,包括用户输入和系统消息。
3.若消息为退出消息,则退出消息循环;否则,将消息发送给相应的窗口进行处理。
4.窗口处理消息,并根据消息类型执行相应的操作。
MFC框架通过封装Windows操作系统的消息机制,使开发者能够以面向对象的方式处理消息,并将消息与具体的窗口对象关联起来。
四、MFC的事件处理机制MFC框架提供了一种基于消息映射的事件处理机制,通过事件处理函数来响应用户输入和系统消息。
mfc对话框一、对话框的基本原理对话框是一种用户界面,几乎每一个Windows 程序都使用对话框与角户进行交互。
对话框可能是一个简单的只含有OK 按钮的消息框,也可以是一个复杂的数据输入表单。
对话框上有一些方便用户输入的控件,对话框依靠这些控件与用户进行交互,其实质是一个接收消息的窗口。
本章主要讲解模式对话框和无模式对话框的原理和使用方法,下一章将详细介绍各种控件的使用。
你将学习创建一个对话框,使用对话框模板编辑一个对话框资源,并在程序中调用对话框。
在创建一个对话框之前,先来了解一下对话框是如何工作的。
对话框的数据来自三方面——对话框资源、对话框对象和一个文档对象。
1 .对话框资源对话框资源是一个用户输入或取得数据的图形界面。
这个图形界面是使用 Develop Studio 的对话框编辑器在对话框模板上创建的,程序员可以在对话框模板上增加并编辑控件,生成对话框资源。
当应用程序运行时,就可以得到一个对话框。
2 .对话框对象MFC 使用 CDialog 类来描述对话框,它是 CWnd 类的派生类。
在 CWnd 类的基础上增加了数据交换的功能。
当创建一个新的对话框资源后,使用 C1assWizard 可以创建一个对话框类的派生类。
对话框对象实现了对话框和应用程序之间的通信。
在应用程序中定义一个对话框对象后,在对话框显示前,可以通过访问对话框对象的成员变量为该对话框的控件初始化,在对话框关闭后,可以通过访问对话框对象的成员变量获得用户的输入数据。
3.文档对象MFC 使用文档对象描述应用程序处理的数据,用户输入的数据要进一步的处理,通常要先保存到文档对象中。
例如一个处理学生记录的应用程序,用户通过一个对话框输出学生记录并保存到一个文件中。
应用程序的处理流程是:用户在对话框中输入信息,程序通过对话框对象得到输入信息,将输入信息整理到文档对象中,使用序列化函数将文档对象保存到一个文件中,所以文档对象扮演了一个很重要的数据交换的角色。
mfc的工作原理
MFC (Microsoft Foundation Class) 是微软公司开发的一种基于
类库的应用程序框架,用于构建Windows操作系统上的图形
用户界面(GUI)应用程序。
MFC的工作原理主要涉及以下
几个方面:
1. 封装了Windows API:MFC通过封装Windows API,提供
了一套更加简洁、易用的面向对象的编程接口,使开发者能够更方便地创建和管理窗口、对话框、控件以及其他GUI元素。
2. 事件驱动的编程模型:MFC采用了事件驱动的编程模型,
开发者可以通过重载消息映射表中的事件处理函数,响应用户的输入或系统的消息,例如点击按钮、键盘按键等。
这种模型使得开发者能够更加灵活地控制应用程序的行为。
3. 对象模型:MFC基于面向对象的编程思想,通过类的继承
和多态等机制,实现了可重用性和扩展性。
开发者可以通过创建和继承MFC的类,重写其成员函数来实现自定义的应用程
序逻辑。
4. 消息循环:MFC应用程序通过消息循环来处理用户的输入
和系统的消息。
消息循环负责从消息队列中获取消息,并将其分发给相应的窗口或控件进行处理。
开发者可以通过重载消息循环中的函数,定制应用程序的消息处理方式。
总的来说,MFC的工作原理是基于面向对象的编程思想和事
件驱动的编程模型,封装了Windows API提供了方便的编程
接口,通过消息循环处理用户输入和系统消息。
这样的设计使开发者能够更加简单地创建和管理GUI应用程序。
mfc消息响应机制MFC消息响应机制MFC(Microsoft Foundation Class)是微软公司为开发Windows应用程序而提供的一组C++类库。
在MFC中,消息响应机制是一种重要的编程方式,用于处理用户与应用程序之间的交互。
本文将详细介绍MFC消息响应机制的原理和使用方法。
一、消息处理函数在MFC中,消息处理函数是用于响应消息的函数。
当用户与应用程序进行交互时,系统会产生相应的消息,然后通过消息映射表找到对应的消息处理函数进行处理。
消息处理函数是类成员函数,其原型通常为:afx_msg LRESULT OnMessage(WPARAM wParam, LPARAM lParam);其中,afx_msg是MFC宏定义,LRESULT是消息处理函数的返回值类型,OnMessage是函数名,WPARAM和LPARAM是消息参数,用于传递消息的附加信息。
二、消息映射表消息映射表是一个包含消息处理函数与消息ID之间对应关系的表格。
在MFC应用程序的消息映射表中,每个消息ID都与一个消息处理函数相对应。
当收到某个消息时,系统会根据消息ID查找对应的消息处理函数,并调用该函数进行处理。
消息映射表通常定义在类的声明中,格式如下:BEGIN_MESSAGE_MAP(CMyClass, CBaseClass)ON_MESSAGE(messageID, memberFxn)// more message mappings...END_MESSAGE_MAP()其中,CMyClass是消息处理类的名称,CBaseClass是消息处理类的基类,messageID是消息ID,memberFxn是与该消息ID对应的消息处理函数。
三、消息处理函数的实现消息处理函数的实现步骤如下:1. 在类的声明中定义消息处理函数的原型。
2. 在类的实现文件中,使用宏定义IMPLEMENT_DYNAMIC或IMPLEMENT_DYNCREATE来实现运行时类型信息。
MFC的基本组成及程序模式类型MFC(Microsoft Foundation Class)是一种用于开发Microsoft Windows平台应用程序的编程框架,它提供了一套可重用的类库,使开发人员可以更轻松地创建Windows应用程序。
1. 控件(Controls):MFC提供了很多常用的控件,如按钮、文本框、列表框、组合框等,开发人员可以直接使用这些控件来构建用户界面。
2. 对话框(Dialogs):MFC支持对话框的创建和管理,开发人员可以通过对话框来实现复杂的用户交互。
3. 文档视图架构(Document-View Architecture):MFC提供了文档视图架构,使开发人员可以更方便地实现文档和视图的交互,以及与用户的交互。
4. 消息映射(Message Mapping):MFC通过消息映射机制来处理事件,开发人员可以通过添加消息映射函数来响应用户的输入或其他事件。
5. 消息循环(Message Loop):MFC提供了消息循环机制,用于处理窗口消息,并将其传递给适当的窗口进行处理。
6. 应用程序类(Application Class):MFC的应用程序类是一个派生自CWinApp的类,它提供了应用程序的初始化和运行控制。
MFC的程序模式类型主要有以下几种:1. 单文档(SDI,Single Document Interface)模式:在单文档模式下,应用程序只能打开一个文档,并在主窗口中显示该文档。
用户可以通过菜单或工具栏命令来操作文档。
2. 多文档(MDI,Multiple Document Interface)模式:在多文档模式下,应用程序可以同时打开多个文档,并在子窗口中显示这些文档。
用户可以通过菜单或工具栏命令在不同的子窗口之间切换。
3. 对话框(Dialog)模式:在对话框模式下,应用程序的主窗口是一个对话框。
用户可以通过对话框上的控件进行操作,以实现与应用程序的交互。
MFC六大核心机制MFC(Microsoft Foundation Classes)是微软公司开发的一套基于C++语言的应用程序框架。
它提供了一系列类和函数库,方便开发人员构建Windows应用程序。
MFC框架包含了许多核心机制,下面将介绍其中的六大核心机制。
一、消息映射机制:消息映射机制是MFC框架的核心之一,它用于处理Windows消息。
Windows操作系统是事件驱动的,应用程序需要响应来自用户的输入或系统的消息。
通过消息映射机制,开发人员可以向MFC框架注册处理特定消息的函数,当该消息发生时,框架将自动调用相应的函数进行处理。
开发人员只需要在类的消息映射表中添加相应的消息与处理函数的映射关系,就可以实现消息的处理。
二、文档/视图机制:文档/视图机制是MFC框架中用来管理应用程序数据和图形界面显示的一种机制。
应用程序的数据和用户界面是相互独立的,通过文档/视图机制可以将二者进行分离。
开发人员可以创建一个或多个文档类来管理数据,同时可以创建一个或多个视图类来负责显示用户界面。
MFC框架会自动处理数据和界面之间的同步,例如当数据发生变化时,会自动更新界面;当用户修改界面时,会自动更新数据。
三、消息响应机制:消息响应机制是MFC框架中用来处理用户输入和系统消息的一种机制。
开发人员可以通过消息响应机制,将特定的消息与相应的处理函数进行关联,当该消息发生时,框架会自动调用相应的处理函数。
例如,开发人员可以通过响应鼠标点击消息来实现用户点击按钮的响应,或者通过响应键盘输入消息来实现用户输入的响应。
四、对象模型机制:对象模型机制是MFC框架中用来管理对象的一种机制。
MFC框架使用了一种轻量级的对象模型,对象之间的关系通过继承和组合来实现。
开发人员可以创建自己的类并继承自MFC提供的基类,以实现各种功能。
MFC框架提供了丰富的基类库,包括窗口类、对话框类、控件类等,开发人员可以通过继承这些基类来快速构建自己的应用程序。
MFC 对话框与对话框之间的参数传递实例手把手教:基于MFC AppWizard (exe)的基本对话框应用程序中的对话框与对话框中的参数传递。
实现当单击对话框A中的一个按钮控件时,对话框B中的一个按钮处于不可用状态,再单击一下,则变为可用。
(要实现这种功能,关键在于使得对话框A中可以找到指向对话框B的指针,这样才能找到对应的按钮)步骤:1.新建-工程- MFC AppWizard (exe)-工程名“TMTD”-应用程序类型:基本对话框;ClassWizard步骤选项均为缺省,完成。
2.删除静态控件“TODO: 在这里设置对话控制。
”;在对话框资源上从工具箱中添加上一个Tab Control 控件(ID: IDC_TAB)3.使用ClassWizard-Member Variable为这个控件添加一个控制变量,(Member valiable name: m_TabCtrl;Category: Control; Valiable type: TabCtrl)。
4.创建两个新的对话框资源(ID: IDD_DIALOGA; ID: IDD_DIALOGB ),其属性作如下修改:样式:重叠;边框:无。
5.从这两个对话框模板生成两个新的对话框类(CDlgChildA; CDlgChildB)。
6.在CTMTDDlg (TMTDDlg.h)中添加头文件:#include "DlgChildA.h"#include "DlgChildB.h"7.在主对话框(CTMTDDlg.h )中为新添加进来的两个对话框类增加两个成员变量:Public: CDlgChildA m_Tab1;Public: CDlgChildB m_Tab2;8.在主对话框(CTMTDDlg.h )的OnInitDialog()函数中添加如下类似的代码:// TODO: Add extra initialization hereTCITEM item;item.mask = TCIF_TEXT;item.pszText = "第一页";m_TabCtrl.InsertItem (0, &item);item.pszText ="第二页";m_TabCtrl.InsertItem (1, &item);m_Tab1.Create (IDD_DIALOGA, &m_TabCtrl);m_Tab2.Create (IDD_DIALOGB, &m_TabCtrl);m_Tab1.m_MyDlg2 = &m_Tab2;CRect r;m_TabCtrl.GetClientRect (&r);m_Tab1.SetWindowPos(NULL, 10, 30, r.right-20, r.bottom-40, SWP_SHOWWINDOW);m_Tab2.SetWindowPos(NULL, 10, r.bottom-40, r.right-20, r.bottom-40, SWP_HIDEWINDOW);说明:InsertIte() 函数的调用是为了给标签控件增加两个标签页面,文本是标题。
对话框向主窗体传递消息,在视图中显示
现举例说明对话框向主窗体传递消息,以及主窗体响应消息的过程。
我们拿单文档来说明,我们要实现下列功能:通过对话框,在文本框中输入字符串,在视图中显示刚才输入的字符串。
1、在应用程序向导中选择单个文档,然后完成。
我这里的项目名称为mybook
2、在资源视图中,插入一对话框,对话框名称为dlg_wzm。
3、在刚才生成的对话框中插入一文本框,设置好相应的类和变量。
为确认按钮生成响应函数。
同时在mybook.cpp的BOOL CMyBookApp::InitInstance()函数中让该对话框启动,也就是加入CDlg_wzm dlg; dlg.DoModal();两行程序,当然在前面的要加入#include "dlg_wzm.h"。
(详细过程略)
4、下面重点在于点击该对话框的确认按钮向主窗体发送消息。
要现定义一个消息名称。
在stdafx.h文件中加入一行:
#define WM_MYMESSAGE WM_USER+100
5、在CMainFrame的pulic申明中加入一变量CString wzmstr。
目的是为了保存对话框中的字符串的值。
在对话框的Onok()函数中:
void CDlg_wzm::OnOK()
{
// TODO: Add extra validation here
this->UpdateData(true);
CMainFrame* pWnd=(CMainFrame*)AfxGetMainWnd(); //得到父窗体的指针
pWnd->wzmstr=this->m_input_edit;
ASSERT(pWnd!=NULL);
::SendMessage(pWnd->GetSafeHwnd(), WM_MYMESSAGE,0,0); //发送消息
//注意WM_MYMESSAGE就是我们前面定义的消息。
//CDialog::OnOK();
}
6、下面我们看看主窗体怎么接受消息。
我们要在主窗体中设置消息映射。
在mainfrm.h的protected声明中:
afx_msg void OnMyMessage(WPARAM wParam, LPARAM lParam);
在mainfrm.cpp文件中,
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code !
ON_WM_CREATE()
ON_MESSAGE(WM_MYMESSAGE,OnMyMessage) //这里是我们加入的。
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
然后在mainfrm.cpp的文件最下面加入一个函数:
void CMainFrame::OnMyMessage(WPARAM wParam, LPARAM lParam)
{
CView *pView=this->GetActiveView(); //得到视图指针
if(pView)
{
CClientDC dc(pView);
dc.TextOut(0,0,wzmstr);//向视图中写入对话框中的edit中的字符串。
}
}
7、完成调试。
什么?不能通过。
那你肯定是忘记在dlg_wzm.cpp的开头加入#include "mainfrm.h"了。
呵呵,最终效果如下。