什么是MFC编程

什么是MFC编程,第1张

MFC(Microsoft Foundation class)微软基本类(库),它是一个面向对象的应用程序架构。程序员利用它可以很方便搭建应用程序框架。

MFC结合了面向对象的编程技术和WINDOWS消息驱动的编程技术,并封装了WIN32API,其设计好处是:消除了WIN32API的复杂性,封装了WIN32API,统一了程序的概念,而且可扩展。

MFC实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎。VC++是Windows下开发人员使用的专业C++ SDK,MFC就是挂在它之上的一个辅助软件开发包。

扩展资料

MFC编程优势

面对底层程序,它能很轻松的与Windows API或驱动程序结合,就是在自己的代码中直接使用API函数,而API和驱动程序的资料都是以C语言为基础的,这使得VC程序员能够更轻松的使用Windows API。

这样造成了一个很有意思的现象,即入门时VC程序员要付出更多的努力来学习,但是一旦掌握后,开发其他领域的程序或使用第三方软件时,如工业控制类的程序,由于底层的程序都是用C语言编写,反倒是VC程序员能够更快的掌握该领域的编程技术。而很多其他的编程语言甚至找不到相关的资料。

这就说明VC(MFC)实际上是一种入门困难,但是扩展学习却很轻松的语言框架。

如何发送击键到其它应用程序关于如何通过编程来发送 Ctrl+Alt+Del 击键?如何从 MFC 应用程序中调用 NET 框架?我想编写一个应用程序,它能通过击键将信息写到另外一个应用程序的窗体中。我是不是应该发送 WM_KEYDOWN 和 WM_KEYUP 消息?有没有更好的办法?发送WM_KEYDOWN 和 WM_KEYUP 消息也许能行得通,但 SendInput 是专门被设计用于此目的的 API 函数。它通过 INPUT 结构数组参数来合成包括击键和鼠标事件在内的输入,每个 INPUT 结构数组元素对应一个输入事件——击键或鼠标动作。INPUT 结构含有一个联合类型,其成员为 MOUSEINPUT,KEYBDINPUT (或 HARDWAREINPUT,仿真面包烤箱)。对于击键来说其 KEYBDINPUT 结构如下:struct KEYBDINPUT {WORD wVk; // virt key codeWORD wScan; // hw scan codeDWORD dwFlags; // flags—see docDWORD time; // time stamp, 0 = dfltULONG_PTR dwExtraInfo; // app-defined};所以向另外一个应用程序发送击键其实就是建立一个 INPUT 数组,每一个数组元素对应一次击键(d起和按下),然后调用 SendInput 函数。为了示范其实际使用方法,我编写了一个叫 Typematic 的小程序,你只要按下一个热键,便可以快速将姓名、地址、电话号码或其它信息敲入窗体中。这对于网上购物者们来说是件很理想的事情。当你第一次运行 Typematic 时,显示的对话框如 Figure 1 所示:Figure 1 Typematic 的初始对话框按“OK”按钮后进入隐藏状态。其后你可以按 +T 来重新激活 Typematic,显示如 Figure 2 所示的对话框:Figure 2 重新被激活得 Typematic此时可以看到对话框里显示出了一列缩写信息。敲入“n”代表姓名,“a”代表地址,Typematic 发送相应的字符串到当前窗体或应用程序。这些缩写信息定义在一个静态表中,你可以将它们改为自己的信息:struct ABBREV {TCHAR key;LPCTSTR text;} MYABBREVS[] = {{ _T(''n''),_T("Elmer Fudd") },{ _T(''a''),_T("1 Bunny Way") },{ 0,NULL}};当然,在实际开发过程中,你不必硬编码这些信息,你可以提供一个用户界面来定制它,并将其保存在用户配置文件中,以便这一台机器的每一个用户都有不同的设置。Typematic 示范了一些其它的技巧:如何注册热键来激活你的应用程序(参见 2000 第十二期的专栏)以及如何让静态文本控件接受键盘输入(你必须处理 WM_GETDLGCODE 并返回DLGC_WANTCHARS )。Typematic 定义了一个专门的静态文本控件 CStaticAbbrev,它既可以显示缩写信息也可以读取加速键。代码如 Figure 3 所示。当用户按下热键。 Typematic 便被唤醒并将焦点定位到该 CStaticAbbrev 控件,等待字符输入。当 CStaticAbbrev::OnChar 获得一个与表中缩写之一匹配的键时,它便隐藏对话框,然后调用辅助函数 SendString 发送文本:// in CStaticAbbrev::OnCharif (/ find char in ABBREV table /) {GetParent()->ShowWindow(SW_HIDE); // hide dialogSendString(abbrevtext); // send text}当Typematic 将自己隐藏后,Windows 自动将焦点恢复到之前拥有焦点的窗口,这样输入便定下向到用户按热键之前焦点所在的窗口。非常聪明,不是吗?如果你需要将输入定向到一个特定的应用程序或窗口,调用 SendInput 之前一定要确保它是活动的,为此可以调用 SetForegroundWindow 函数。所有发送击键的工作都在 SendString 中进行,它建立 INPUT 数组并调用 SendInput (参见 Figure 3)。SendString 发送一系列 KEYDOWN/KEYUP 的 INPUT 结构对,字符串中的每一个字符对应一双这样的结构表示按下/d起。它用 KEYEVENTF_UNICODE 标志将串作为 Unicode 字符发送。Unicode 比较容易处理,因为你不必用 Shift 键合成大写字符。如果不借助 KEYEVENTF_UNICODE 的话,你必须将大写的 E 发送成 后跟e,每个字符都有一次按下/d起(down/up)事件, 共有四次击键。感谢微软的人添加了 KEYEVENTF_UNICODE。如果你用托管 C++ 或 Microsoft NET 中其它的语言编程,发送击键更容易。有一个框架类叫 SendKeys,其静态函数 Send 使得发送击键易如反掌。你甚至可以用花哨的语法发送专用键。例如用“{F1}{BACKSPACE}A”来发送 F1,Backspace,A。为此我还写了NET 版本的 Typematic,起名为:TypematicNET,它使用 SendKeys。这样 SendString 函数变成这样:#pragma managedvoid SendString(LPCTSTR str) {SendKeys::SendWait(str);}还有什么比这更容易呢?当我刚开始做的时候,我很自然地用 SendKeys::Send 尝试,而不是 SendWait。为什么我要等待应用程序吃完这些键呢?唉,我尝试的时候 Typematic 惨烈地崩溃了,在 WindowsFormsdll 的某个地方发生 SystemInvalidOperationException 异常。当我启动公共语言运行时(CLR)调试器察看缘由时,Output 窗口显示出下列信息:“附加信息:由于该应用程序不处理 Windows 消息,SendKeys 无法在该应用程序中运行。要么让该应用程序处理消息,要么使用 SendKeysSendWait 方法。”这就是我所称得友好的出错信息!就让它成为所有人的一个例子吧。但在使用 SendKeys 之前,要提醒你的一件事情是:它不像 SendInput 那样稳定。通过针对不同的应用如:IE、Notepad、MFC 窗体视图或其它熟悉的应用,对 Typematic 和 TypematicNET 进行测试,你自己就能发现这个结果。处于某些原因,SendKeys 工作并不总是正常。我猜测它是焦点或定时问题——这些键被发送后马上就消失了,因为你认为具有焦点的窗口实际上没有焦点。所以虽然 SendKeys 很容易使用,同时也比 SendInput 更强大,但它在使用过程中的表现不佳,很可惜!也许微软的老大们在下一个版本中能摆平这个问题。一个最后的警告:发送击键是一种名声狼藉的控制其它应用程序的古怪方法。你必须完全正确地获得所有键,一旦上下文或用户界面稍有改变,便可能导致问题。如果你想要控制其它应用程序,可以看看脚本系统、编程接口或宏语言。我读了一些关于禁用系统键序列的文章,如:Ctrl+Alt+Del,包括你在 2002 年 MSDN 杂志九月刊上的专栏文章。但是我如何通过编程来发送 Ctrl+Alt+Del 呢?William Burns本文的第一个问题回答了如何发送击键到任何应用程序,但是你无法用 SendInput 发送 Ctrl+Alt+Del,因为这个键序列是在 *** 作系统底层处理的。不管怎样,用合成击键的方法来“发送”Ctrl+Alt+Del 是不合适的。那用什么方法呢?如果你想启动任务管理器,用“taskmgrexe”作为参数调用 ShellExecute。如果你想重启机器,可以用 EWX_REBOOT 标志调用 ExitWindowsEx。ExitWindowsEx 具备所有以不同方式关闭或重启机器的标志(参见 Figure 4)。此外,你的应用程序必须具备 SE_SHUTDOWN_NAME 特权才能重启机器。有人知道 Ctrl+Alt+Del 的由来吗?如果你认为你知道,给我发个 e-mail 过来。我会在以后的专栏里公布答案?我能从 MFC 应用程序中调用 NET 框架吗?我想从我的非托管 MFC 代码中调用托管类,并且我想通过 #using 来做,但我总遇到“/RTC1 incompatible with /clr”。那么我如何才能从 MFC 应用程序中调用 NET?Julian Kinsey你当然可以从你的 MFC 程序中调用 NET!就像 Windows 中的其它机制一样,一旦你知道了正确的方法,它是很容易的。当你着手创建 MFC 程序时,应用程序向导(App Wizard)为你设置所有的编译选项。其中之一是项目配置属性中“C/C++|代码生成”项下的“基本运行时检查”。在创建 MFC 程序时,应用程序向导在调试版本中选择“两者/RTC1,等同于/RTCsu)”以实现运行时检查,如检查堆栈帧、未初始化变量或缓冲溢出及内存不足。这些检查与 /clr 不兼容,因为托管代码完全不同(它是 Microsoft 的中间语言,非本机语言),但是当你添加 /clr ,那么 IDE 不会自动移除 /REC1。所以你必须用手动方式来做。对于项目中的每一个 cpp 文件,“基本运行时检查”设置为“默认”。这样做十分不幸,因为对于本地/非托管函数来说,这项检查是很好的事情。它有助于你在交付前发现程序的Bug。但对于要调用NET类库的程序来说,这样做就不是一件好事。那么我们该怎么办呢?问题是使用托管扩展调用 NET 框架,你必须将“使用托管扩展”设置为“是”,它将打开/clr开关,进行这个设置的唯一地方是在项目属性页中,它是全局有效的。“使用托管扩展”为项目中所有模块打开/clr 开关。在缺省情况下,所有函数都是托管的了。如果你想默认使用本地模式,可以在 stdafxh 文件的末尾添加一行:#pragma unmanaged因为每个模块都要包含 stdafxh 文件,所以所有模块都是以本地模式进行编译的。当要调用 NET 框架时,你可以像这样跳到托管模式:#pragma managedvoid DoSomethingWithDotNET() {// call framework classes here}直到现在,我都是用这个技巧(将 #pragma unmanaged 放在 stdafxh 末尾)。但它解决不了运行时检查问题,因为 /clr 仍然与 /RTC 不兼容,即便你的大多数函数是本地的。在混合模式的应用程序中,编译器不会让你在本地函数中进行运行时检查的。Figure 5 项目设置你真正想做的是只用 /clr 编译调用 NET 框架的模块。但如何做呢?当在项目范围内使用“使用托管扩展”时,这一点很容易做到:在模块生成属性的“命令行”项下添加专门的开关即可。Figure 5 和 Figure 6 显示了设置方法。在全局项目设置中,将“使用托管扩展”设置为“否”,然后针对每个调用 NET 框架的模块添加 /clr。此时其它模块仍然使用 /RTC1 并执行运行时检查。当然,你必须将以及所有来自 stdafxh 的框架文件移到托管模块中。如果你愿意,可以将所有标准的 NET 包含在一个 UsesDotNeth 文件中,就像下面这样:#using #using #include using namespace System;Figure 6 模块设置然后在每个调用 NET 框架的模块中包含 #include "UsesDotNeth" 即可。你仍然可以在某个模块中用 #pragma managed/unmanaged 来混合托管和本地代码。还有一个设置要做,那就是当你添加 /clr 到一个模块文件时,除了关闭运行时检查外,你同时还必须选择“不使用与编译头”。与编译头信息仅在所有模块具有相同的编译选项时才起作用;如果一个模块有 /clr 选项,那么它不能使用与其它没有 /clr 选项的模块相同的预编译头。嘿,当今计算机是如此之快,谁还需要预编译头?如果你确实想与众不同,那么就用单独的头文件如 UsesDotNeth 来编译你的托管模块吧。

mfc是微软公司提供的一个基础类库。

以C++类的形式封装了WindowsAPI,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

mfc特性

Visual C++包含MFC应用程序向导,可用于兼容MFC的应用程序。在ATL程序中也可以手动添加MFC支持。在向导中有各种选项以定制生成的程序的功能,例如界面风格、语种、数据库开发支持、打印支持、自动化支持、ActiveX支持、网络支持、基于HTML的帮助文档支持等等。

在COM开发方面,相对于ATL来说,MFC的组件比较大,代码不够短小精悍,但是支持的功能也比较多,例如有对ActiveX Document的封装类。在界面开发方面,MFC提供对消息循环的封装,使用消息映射来避免虚函数的开销。MFC也提供常用Windows通用控件的封装类。

MFC扩展DLL的接口使得MFC程序可以直接调用MFC扩展DLL中的MFC类。MFC也支持在标准DLL中被使用。

以上内容参考 百度百科--mfc

方法/步骤

创建MFC工程

选择基于对话框程序

在资源视图中选择对话框,在对话框上右键插入ActiveX控件

在d出的对话框中选择自己注册在电脑上的控件

在添加的控件上右键添加控件的变量,以方便在程序中调用控件接口

可以按照以下方式进行,实行时不分先后。

一、调用函数部分。

1 引入头文件。头文件在C语言中,负责声明函数,及定义相关数据结构等功能。要调用其它C文件中的函数,标准的做法是引用头文件。

2 如果不存在头文件,需要自行编写,也可以在引用文件中自行声明函数。不过后一种并不正规。

3 在声明或引用头文件后,就可以直接调用其函数了。

二、获取计算结果。

1 通过函数返回值获取结果。

2 通过函数参数获取结果。

3 在其它C文件中奖结果存入全局变量,然后通过全局变量获取结果。

以上三种方式均可以实现目的,具体使用取决于C文件的编写方式。对于简单数据类型,且结果单一的情况,一般使用第一种。复杂数据类型,或者需要的结果可能为多个变量的情况,一般使用第二种。不推荐使用第三种,尤其在多线程 *** 作情况下。

都是什么回答啊

楼主 你没有了解MFC的运行机制就去看他写他所以你先要了解他的机制 已经各个CPP H都是什么

下面我就给你说下

在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数也就是说MFC封装了Windows API 你说你喜欢C++而MFC换一种说法就是一个用C++写的一个函数库 然后你来调用 只不过这个类不是你写的

MFC提供数百个类,最重要的、也是编写任何VC++应用程序都必不可少的两个类CWinApp和CFrameWnd,这两个类是编写复杂庞大应用程序的基石。

1>封装特性:构成MFC框架的是MFC类库而MFC类库又是C++的一个类库。这些类封装WIN32应用程序编程接口,OLE(Object Link Embed 对象链接嵌入)特性,ODBC和DAO数据访问的功能。

2>继承特性:MFC抽象出了众多类的共同特性,并设计出一些基类作为实现其他类的基础,这些类中最重要的类是CObject类和CCmdTarget类,程序员可以从适当的MFC类中派生出自己的类,实现特定的功能达到编程的目的。

3>虚拟和消息映射:MFC是以C++为基础,当然支持虚函数,但作为一个编程框架必须要解决的是效率问题:如果MFC仅仅通过虚函数来支持动态约束必然会产生大量的虚函数表这样编程框架过于臃肿而且消耗更多的内存。但是MFC建立了消息映射机制这样降低了内存的使用却大大提高了效率

消息映射是一个将消息和成员函数相互关联的表,当应用程序的框架窗口接收到一个消息时,MFC将搜索该窗口的消息映射,如果存在一个处理消息的处理程序,那么就调用该处理程序

它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。

MFC消息映射机制:

将消息与消息处理函数联系起来,形成一一对应的机制。

消息映射宏

声明: DECLARE_MESSAGE_MAP

定义:

BEGIN_MESSAGE_MAP

ON_COMMAND

ON_CONTROL

ON_MESSAGE

END_MESSAGE_MAP

MFC主要组成部分:类、宏和全局函数。

类是MFC中最主要的内容。MFC类是以层次结构方式组织起来的。MFC中的类分成两部分,除了一些辅助类,大多数的MFC类是直接或间接从根类CObject派生而来。

MFC宏主要功能:消息映射、运行时对象类型服务、诊断服务、异常处理。

MFC约定:全局函数以“Afx”为前缀,全局变量以“afx”为前缀

MFC类的层次关系

CObject项目类)->CCmdTarget(消息响应类)->

{

CWinThread(线程类)->CWinApp(Window应用程序类)

CDocument(文档类)

CWnd(窗体类)->[

CFrameWnd(框架类)

CView(视图类)

]

}

CObject类由于MFC中大部分类是从CObject类继承而来的,CObject类描述了几乎所有的MFC类的一些公共特性,CObject类为程序员提供了对象诊断、运行时类型识别和序列化等功能。

CCmdTarget类由CObject类直接派生而来,它负责将消息发送到能够响应这些消息的对象。它是所有能进行消息映射的MFC类的基类。

CWinApp类在任何MFC应用程序中有且仅有一个CWinApp派生类的对象,它代表了程序中运行的主线程,也代表了应用程序本身。 CWinApp类取代了WinMain()主函数在SDK应用程序中的地位。传统SDK应用程序WinMain()函数完成的工作。现在由类CWinApp的InitApplication(),InitInstance()和Run()三个成员函数承担。

CWnd类由CCmdTarget类直接派生而来,该类及其派生类的实例是一个窗口。CWnd类代表了MFC中最基本的GUI对象,它是一个功能最完善、成员函数最多的MFC类。

CFrameWnd类是CWnd类的派生类,主要用来掌管一个窗口,它取代了SDK应用程序中窗口函数WndProc()的地位。CFrameWnd类的对象是一个框架窗口,包括边框、标题栏、菜单、最大化按钮、最小化按钮和一个激活的视图。

CDocument类在应用程序中作为用户文档类的基类,它代表了用户存储或打开的一个文件。

CView类是MFC中一个很基本的类,它作为其它MFC视图类和用户视图派生类的基类。

从API编程到MFC编程的过渡:

WinMain()

{ 初始化WNDCLASS

注册窗体结构

创建窗口 ->>>>>>>>应用程序类CWinApp

显示窗口

消息循环

}

WndProc()

{ switch(…)

->>>>>>>>>框架窗口类CFrameWnd

}

MFC Object和Windows Object的对应关系:

描述 Windows句柄 MFC Object

窗口 HWND CWnd

设备上下文 HDC CDC

菜单 HMENU CMenu

笔 HPEN CPen

刷子 HBRUSH CBrush

字体 HFONT CFont

位图 HBITMAP CBitmap

套接字 SOCKET CSocket

三、手工创建一个MFC应用程序:

注意:创建MFC程序,要创建一个Win32空项目,并要选择项目属性中的”在共享DLL文件中使用MFC,然后新建我们的文件

例子:在”helloh”头文件中添写如下代码:

class CMyApp:public CWinApp

{

public:

virtual BOOL InitInstance();//虚函数

};

class CMainWindow:public CFrameWnd

{

public:

CMainWindow();

protected:

afx_msg void OnPaint();

DECLARE_MESSAGE_MAP();//声明消息映射

};

在”hellocpp”源文件中添写如下代码:

#include <afxwinh>

#include “helloh"

CMyApp myApp;

BOOL CMyApp::InitInstance()

{

m_pMainWnd = new CMainWindow;

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

return TRUE;

}

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)

ON_WM_PAINT()

END_MESSAGE_MAP() //消息映射

CMainWindow::CMainWindow() //构造函数初始化

{

Create(NULL,“我的第一个MFC应用程序”);//创建窗体

}

void CMainWindow::OnPaint()

{ CPaintDC dc(this);

CRect rect;

GetClientRect(&rect);

dcDrawText("Hello MFC",-1,&rect, DT_SINGLELINE|DT_CENTER|DT_VCENTER);

}

CWinApp是应用程序类,在MFC应用程序中必须从这个类派生出一个类,该派生类是MFC应用程序的入口

必须定义这个派生类的对象,并且只能有一个这个对象代表整个应用程序。

成员函数:InitInstance()

功能:初始化应用程序实例和窗口实例,

虚函数CWinApp::InitInstance必须在派生类中重写。在InitInstance函数中,编写初始化代码,如:

创建一个窗口

显示一个窗口

CFrameWnd类

作用:为应用程序提供一个窗口,同时实现消息处理功能。

成员函数: Create()

功能:创建窗体,将之赋于CFrameWnd对象上。

BOOL Create(窗口类型, 窗口标题,显示风格,显示区域,符窗口句柄,菜单,扩展显示风格,上下文对象)共有8个参数,前两个必须给出,后6个可以默认。

MFC应用程序的核心就是基于CWinApp类的应用程序对象,CWinApp提供了消息循环来检索消息并将消息调度给应用程序的窗口我们在编写MFC应用程序时,要包含afxwinh,

一个MFC应用程序可以有且仅有一个应用程序对象,对象必须声明为在全局范围内有效(也就是全局对象),以便它在程序开始时即在内存中被实例化

我们的Hello MFC的应用程序类被命名为CMyApp,它在hellocpp中用如下语句进行了实例化:

CMyApp myApp;

CMyApp的类声明在helloh中代码如下:

class CMyApp:public CWinApp

{

public:

virtual BOOL InitInstance();

};

CMyApp没有声明任何的数据成员,只是重写了一个从CWinApp类中继承来的函数,在应用程序的生存期内InitInstance的调用比较早,是在应用程序开始运行以后而窗口创建之前,除非InitIstance创建一个窗口,否则应用程序是不会有窗口,这正是为什么即使最小的MFC应用程序也必须从CWinApp派生出一个类并重写CWinApp::InitIstance的原因

InitInstance函数:CWinApp::InitInstance是一个虚函数,其默认 *** 作仅包含一条语句:return TRUE;

InitInstance是用来执行程序每次开始时都需要进行的初始化工作最好的地方

在hellocpp中,CMyApp的InitInstance通过实例化hello的CMainWindow类来创建hello窗口,语句:

m_pMainWnd = new CMainWindow;

构造了一个CMainWindow对象指针,并将其地址复制到了应用程序对象的m_pMainWnd数据成员中,窗口创建以后,InitInstance就会通过CMainWindow指针调用ShowWindow和UpdateWindow函数显示它:

m_pMainWnd->ShowWindow(m_nCmdShow);

m_pMainWnd->UpdateWindow();

ShowWindow和UpdateWindow是所有窗口对象共用的CWnd成员函数其中包括CFrameWnd类的对象,CMainWindow就是从CFrameWnd派生出来的

要从MFC程序调用一个常规的Windows API函数,需要在函数名称前添加一个全局运算符:: 例如:::UpdateWindow();

通过生成窗口对象并调用其Create函数,MFC应用程序可以创建一个窗口,在CMyApp::InitInstance中,hello创建了一个CMainWindow对象,CMainWindow的构造函数生成在屏幕上看到的窗口:

Create(NULL,”我的第一个MFC应用程序”);

CPaintDC dc(this);

MFC的CPaintDC类是从MFC的CDC类派生的,CDC类封装了Windows设备环境,以及包含了绘制到屏幕、打印机和其他设备的几十个成员函数

在MFC中如何处理消息呢

在SDK中我们利用的是消息循环和窗口过程函数对消息进行消息处理

在MFC中我们用的是消息映射机制

下面是将消息映射添加到一个类中需要做的全部工作

1>通过将DECLARE_MESSAGE_MAP语句添加到类声明中,声明消息映射

2>通过放置标识消息的宏来执行消息映射,相应的类将在对BEGIN_MESSAGE_MAP和END_MESSAGE_MAP的调用之间处理消息

3>添加成员函数来处理消息

1、构造CWinApp派生类的对象

2、系统调用WinMain()

3、WinMain调用InitInstance,在该函数中创建CFrameWnd派生类对象,调用Create函数创建窗口、调用ShowWindow函数显示窗口。

4、之后内部机制调用Run,接受用户的消息,并将消息导向默认的处理函数。当接收到WM_QUIT消息时,Run内部调用ExitInstance,退出程序。

MFC采用消息映射(Message Map)机制取代C/C++语言中的switch-case结构来处理消息。

消息映射:在MFC中把消息处理函数和它所要处理的特定的消息连接起来的一种机制。

它通过宏来实现消息到成员函数的映射,而且这些函数不必是虚拟的成员函数,这样不需要为消息映射函数生成一个很大的虚拟函数表(V表),节省内存。

MFC消息映射机制包括一组消息映射宏。一条消息映射宏把一个Windows消息和其消息处理函数联结起来。

MFC应用程序框架提供了消息映射功能。

在类的实现源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏来定义消息映射。

在类定义的结尾用DECLARE_MESSAGE_MAP()宏来声明使用消息映射。

Hello的CmainWindow类只处理一种消息类型—WM_PAINT,因此其消息映射的实现如下所示:

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd);

ON_WM_PAINT()

END_MESSAGE_MAP()

BEGIN_MESSAGE_MAP开始了消息映射,并标识了消息映射所属的类和该类的基类

END_MESSAGE_MAP()结束消息映射

ON_WM_PAINT()在BEGIN_MESSAGE_MAP和END_MESSAGE_MAP()之间,称做消息条目,在MFC为100多种Window消息提供了宏

afx_msg void OnPaint();

DECLARE_MESSAGE_MAP()

afx_msg 醒目地暗示OnPaint是一个消息处理程序,

DECLARE_MESSAGE_MAP()声明消息映射

MFC把消息主要分为三大类:

(1)、标准Windows消息(WM_XXX)

使用宏:ON_WM_XXX() 特点:有默认的消息处理函数

(2)、命令消息:(WM_COMMAND)

来自于菜单、工具条、按钮等的消息

使用宏: ON_COMMAND(命令按钮标识符ID,消息处理函数)

特点:由用户指定消息处理函数

3、”Notification消息” (通知消息) 由控件产生:

BOOL 布尔值,取值为TRUE或者FALSE

BSTR 32为字符指针

BYTE 8位整数无符号的

COLORREF 32位数值代表一个颜色值

DWORD 32位整数无符号的

LONG 32位整数带符号的

LPCTSTR 32位指针,指向一个常字符串

LPVOID 32位指针,指向一个为指定类型的数据

MFC特有的数据类型:

1>POSITION :一个数值,代表数组或者链表中元素的位置,在MFC中常用于数据处理类

2>LPRECT:32位指针,指向一个不变的矩形区域结构

这是我针对你的问题整理的一些资料 很多 我想删减一些 但我觉得这些都对你很重要

以上就是关于什么是MFC编程全部的内容,包括:什么是MFC编程、如何从MFC应用程序中调用.NET框架、mfc是什么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9825130.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存