mfc指的是什么?
cwinapp它派生自cwiinthread,c++的多态,就是利用基类来表达子类的行为.mfc好了,事情到了这一步,应该一切都明朗了。指的是微软基础类库。
投资mfc赚钱实例_投资mfc赚钱实例有哪些
投资mfc赚钱实例_投资mfc赚钱实例有哪些
使用这些MFC对象通常分为两个步骤:
首先,在堆栈或堆中创建MFC对象。此时,MFC对象的句柄实例变量为空,或者它不是有效的句柄。
然后,调用MFC对象的成员函数来创建相应的Windows对象,MFC的handle变量存储一个有效的句柄。CDC(设备描述表类)的创建是不同的。可以在MFC对象的构造函数中创建相应的windows对象。
MFC的应用程序类源文件中,有个CWinApp类的派生类的对象theApp,它到底起个啥作用?
它是一个由微软实现的C++类库。它主要封装了大多数windows API函数。VC++是微软开发的C/C++集成开发环境。所谓集成开发环境是指可以对其进行编辑、编译和调试,而不是使用各种工具进行轮换作。它有很大的灵活性。VC也指的是它的内部编译器。发送消息的函数有SendMessage、SendMessageCallback、SendNotifyMessage、SendMessageTimeout;寄送消息的函数主要有PostMessage、PostThreadMessage、PostQuitMessage;广播消息的函数我知道的只有BroadcastSystemMessage、BroadcastSystemMessageEx。theApp是全局变量, 在进入程序入口这前已实例化了,这是基本常识啊.
mfc框架指的是程序入口_afxwinmain里面那段代码.基于对话框,单文档,多文档,都用得是这段代码.而不同的特性,则是靠实际派生类重载virtual函数来实现的(也就是所谓的多态的行为),
这是其一.
但是,mfc并不是如此简单,它相比传统的win32窗口建立多了点变化.问题就出在win32消息太多了,不可能为窗口类去定义所有的消息处理用virtual函数,所以引入消息映射表.
所以在窗口创建前,要放hook,保证各个相关都有机会去响应消息.这是很好的设计.
----------
以后你接触一些大程序的架构,你都能找到mfc架构的影子.其实这就是编程技法.看多了,你也会这么用设计的.
好好看下各向导下,InitInstance()提供的实现,你会找到的.
MFC的应用程序类源文件中,有个CWinApp类的派生类的对象theApp,它到底起个啥作用?
如果在Messages列表框中仍然看不到我们想要的消息,那么该消息可能是被系统忽略掉或者是你自己创建的,在这种情况下,就必须自己手工添加。根据我们前面所说的消息工作的3个部件,我们一一进行处理:theApp是全局变量, 在进入程序入口这前已实例化了,这是基本常识啊.
mfc框架指的是程序入口_afxwinmain里面那段代码.基于对话框,单文档,多文档,都用得是这段代码.而不同的特性,则是靠实际派生类重载virtual函数来实现的(也就是所谓的多态的行为),
这是其一.
但是,mfc并不是如此简单,它相比传统的win32窗口建立多了点变化.问题就出在win32消息太多了,不可能为窗口类去定义所有的消息处理用virtual函数,所以引入消息映射表.
所以在窗口创建前,要放hook,保证各个相关都有机会去响应消息.这是很好的设计.
----------
以后你接触一些大程序的架构,你都能找到mfc架构的影子.其实这就是编程技法.看多了,你也会这么用设计的.
好好看下各向导下,InitInstan// TODO: Add any drawing code here...ce()提供的实现,你会找到的.
什么叫VC?我们公司常常听人在说VC怎么样?什么意思喃?
MFC的消息映射的基类CCmdTarget就是这个名为软件分投投资,可是到会的VC都在谈互联网,软银为盛大投资的成功沾沾自喜,IDG讲起对互联网、移动增值的方向滔滔不绝,在座一位企业家关注VC的朋友说,VC对软件业失去兴趣了,去年投资芯片业的热情也在衰退倒是互联网方面一直较为关注。
VC就是VC++,通常说的VC编程其实是指 VC-MFC 编程。Visual c++
我觉得学VC,熟其二,main只是一个架子,对于一个框架程序来说,还是远远不够的.所以v s的向导在cwinapp派生类重载了相关的函数,完成了一切窗口建立所必需的流程(建立窗口类,注册窗口类,创建窗口等等).了解到这一点,用mfc编程就相当安逸了.悉C++的面向对象与WINDOWS编程技术是必要的.另外多看看别人的源代码,弄清程式所来龙去脉也,弄清程式的运行机制格外重要.至于你不太熟悉API,我看这并不重要,因为这么多API,试问谁能记这么多,不知道的查MSDN.初学者切莫心浮气燥,循序渐进,相信他日
你也是VC"高手".
VC-MFC 是使用 C++ 将Win APi 进行封装后的类库。如果要学 VC 首先要对 C++ 挺熟,才容易上手!
vc是一种面向对象的编程语言
VC编程 是指 VC-MFC 编程? 谁说的? 有没搞错?
这个笑话就跟 VC 2005 不能 非编程(非托管编程)那个笑话一样经典!
做软件的是软件开发工具
不是软件的话就是风险投资
vc/mfc 进程消息队列,线程消息队列,和队列,该如何处理
2,,,队列消息和非队列消息
2,,,从消息的发送途径来看,消息可以分成2种:队列消息和非队列消息。消息队列由可以分成队列和线程消息队列。队列由Windows维护,线程消息队列则由每个GUI线程自己进行维护,为避免给non-GUI现成创建消息队列,所有线程产生时并没有消息队列,仅当线程次调用GDI函数数系统给线程创建一个消息队列。队列消息送到队列,然后到线程消息队列;非队列消息直接送给目的窗口过程。
对于队列消息,最常见的是鼠标和键盘触发的消息,例如WM_MOUSERMOVE,WM_CHAR等消息,还有一些其它的消息,例如:WM_PAINT、WM_TIMER和WM_QUIT。当鼠标、键盘被触发后,相应的鼠标或键盘驱动程序就会把这些转换成相应的消息,然后输送到队列,由Windows系统去进行处理。Windows系统则在适当的时机,从队列中取出一个消息,根据前面我们所说的MSG消息结构确定消息是要被送往那个窗口,然后把取出的消息送往创建窗口的线程的相应队列,下面的事情就该由线程消息队列心了,Windows开始忙自己的事情去了。线程看到自己的消息队列中有消息,就从队列中取出来,通过作系统发送到合适的窗口过程去处理。
一般来讲,系统总是将消息Post在消息队列的末尾。这样保证窗口以先进先出的顺序接受消息。然而,WM_PAINT是一个例外,同一个窗口的多个 WM_PAINT被合并成一个 WM_PAINT 消息, 合并所有的无效区域到一个无效区域。合并WM_PAIN的目的是为了减少刷新窗口的次数。
非队列消息将会绕过系统队列和消息队列,直接将消息发送到窗口过程,。系统发送非队列消息通知窗口,系统发送消息通知窗口。 例如,当用户激活一个窗口系统发送WM_ACTIVATE, WM_SETFOCUS, and WM_SETCURSOR。这些消息通知窗口它被激活了。非队列消息也可以由当应用程序调用系统函数产生。例如,当程序调用SetWindowPos系统发送WM_WINDOWPOSCHANGED消息。一些函数也发送非队列消息,例如下面我们要谈到的函数。
消息的发送
了解了上面的这些基础理论之后,我们就可以进行一下简单的消息发送与接收。
把一个消息发送到窗口有3种方式:发送、寄送和广播。
SendMessage的原型如下:LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),这个函数主要是向一个或多个窗口发送一条消息,一直等到消息被处理之后才会返回。不过需要注意的是,如果接收消息的窗口是同一个应用程序的一部分,那么这个窗口的窗口函数就被作为一个子程序马上被调用;如果接收消息的窗口是被另外的线程所创建的,那么窗口系统就切换到相应的线程并且调用相应的窗口函数,这条消息不会被放进目标应用程序队列中。函数的返回值是由接收消息的窗口的窗口函数返回,返回的值取决于被发送的消息。
PostMessage的原型如下:BOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam),该函数把一条消息放置到创建hWnd窗口的线程的消息队列中,该函数不等消息被处理就马上将控制返回。需要注意的是,如果hWnd参数为HWND_BROADCAST,那么,消息将被寄送给系统中的所有的重叠窗口和弹出窗口,但是子窗口不会收到该消息;如果hWnd参数为NULL,则该函数类似于将dwThreadID参数设置成当前线程的标志来调用PostThreadMEssage函数。
从上面的这2个具有代表性的函数,我们可以看出消息的发送方式和寄送方式的区别所在:被发送的消息是否会被立即处理,函数是否立即返回。被发送的消息会被立即处理,处理完毕后函数才会返回;被寄送的消息不会被立即处理,他被放到一个先进先出的队列中,一直等到应用程序空线的时候才会被处理,不过函数放置消息后立即返回。
实际上,发送消息到一个窗口处理过程和直接调用窗口处理过程之间并没有太大的区别,他们直接的区别就在于你可以要求作系统截获所有被发送的消息,但是不能够截获对窗口处理过程的直接调用。
以寄送方式发送的消息通常是与用户输入相对应的,因为这些不是十分紧迫,可以进行缓慢的缓冲处理,例如鼠标、键盘消息会被寄送,而按钮等消息则会被发送。
广播消息用得比较少,BroadcastSystemMessage函数原型如下:
long BroadcastSystemMessage(DWORD dwFlags,LPDWORD lpdwRecipients,UINT uiMessage,WPARAM wParam,LPARAM lParam);
该函数可以向指定的接收者发送一条消息,这些接收者可以是应用程序、可安装的驱动程序、网络驱动程序、系统级别的设备驱动消息和他们的任意组合。需要注意的是,如果dwFlags参数是BSF_QUERY并且至少一个接收者返回了BROADCAST_QUERY_DENY,则返回值为0,如果没有指定BSF_QUERY,则函数将消息发送给所有接收者,并且忽略其返回值。
窗口过程
窗口过程是一个用于处理所有发送到这个窗口的消息的函数。任何一个窗口类都有一个窗口过程。同一个类的窗口使用同样的窗口过程来响应消息。 系统发送消息给窗口过程将消息数据作为参数传递给他,消息到来之后,按照消息类型排序进行处理,其中的参数则用来区分不同的消息,窗口过程使用参数产生合适行为。
一个窗口过程不经常忽略消息,如果他不处理,它会将消息传回到执行默认的处理。窗口过程通过调用DefWindowProc来做这个处理。窗口过程必须return一个值作为它的消息处理结果。大多数窗口只处理小部分消息和将其他的通过DefWindowProc传递给系统做默认的处理。窗口过程被所有属于同一个类的窗口共享,能为不同的窗口处理消息。下面我们来看一下具体的实例:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{int wmId, wmEvent;
PAINTSTRUCT ps;
HDC hdc;
TCHAR szHello[MAX_LOADSTRING];
LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);
switch (message)
{case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
// Parse the menu selections:
switch (wmId)
{case IDM_ABOUT:
DialogBox(hInst, (LPCTSTR)IDD_ABOUTBOX, hWnd, (DLGPROC)About);
case IDM_EXIT:
DestroyWindow(hWnd);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}break;
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetRect(hWnd, &rt);
DrawText(hdc, szHello, strlen(szHello), &rt, DT_CENTER);
EndPaint(hWnd, &ps);
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
}消息分流器
通常的窗口过程是通过一个switch语句来实现的,这个事情很烦,有没有更简便的方法呢?有,那就是消息分流器,利用消息分流器,我们可以把switch语句分成更小的函数,每一个消息都对应一个小函数,这样做的好处就是对消息更容易管理。
之所以被称为消息分流器,就是因为它可以对任何消息进行分流。下面我们做一个函数就很清楚了:
void MsgCracker(HWND hWnd,int id,HWND hWndCtl,UINT codeNotify)
{case ID_A:
if(codeNotify==EN_CHANGE)...
case ID_B:
if(codeNotify==BN_CLICKED)...
....
然后我们修改一下窗口过程:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{switch(message)
{HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker);
HANDLE_MSG(hWnd,WM_DESTROY,MsgCracker);
default:
return DefWindowProc(hWnd, message, wParam, lParam);
}
return 0;
#define HANDLE_MSG(hwnd,msg,fn)
switch(msg): return HANDLE_##msg((hwnd),(wParam),(lParam),(fn));
实际上,HANDLE_WM_XXXX都是宏,例如:HANDLE_MSG(hWnd,WM_COMMAND,MsgCracker);将被转换成如下定义:
#define HANDLE_WM_COMMAND(hwnd,wParam,lParam,fn)
((fn)((hwnd),(int)(LOWORD(wParam)),(HWND)(lParam),(UINT)HIWORD(wParam)),0L);
不过,我们发现在windowsx.h里面还有一个宏:FORWARD_WM_XXXX,我们还是那WM_COMMAND为例,进行分析:
#define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn)
(void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))
所以实际上,FORWARD_WM_XXXX将消息参数进行了重新构造,生成了wParam && lParam,然后调用了我们定义的函数。
MFC消息的处理实现方式
初看MFC中的各种消息,以及在头脑中根深蒂固的C++的影响,我们可能很自然的就会想到利用C++的三大特性之一:虚拟机制来实现消息的传递,但是经过分析,我们看到事情并不是想我们想象的那样,在MFC中消息是通过一种所谓的消息映射机制来处理的。
为什么呢?在潘爱民老师翻译的《Visual C++技术内幕》(第4版)中给出了详细的原因说明,我再简要的说一遍。在CWnd类中大约有110个消息,还有其它的MFC的类呢,算起来消息太多了,在C++中对程序中用到的每一个派生类都要有一个vtable,每一个虚函数在vtable中都要占用一个4字节大小的入口地址,这样一来,对于每个特定类型的窗口或控件,应用程序都需要一个440KB大小的表来支持虚拟消息控件函数。
如果说上面的窗口或控件可以勉强实现的话,那么对于菜单命令消息及按钮命令消息呢?因为不同的应用程序有不同的菜单和按钮,我们怎么处理呢?在MFC库的这种消息映射系统就避免了使用大的vtable,并且能够在处理常规Windows消息的同时处理各种各样的应用程序的命令消息。
说白了,MFC中的消息机制其实质是一张巨大的消息及其处理函数的一一对应表,然后加上分析处理这张表的应用框架内部的一些程序代码.这样就可以避免在SDK编程中用到的繁琐的CASE语句。
如果你想让你的控件能够进行消息映射,就必须从CCmdTarget类中派生。CCmdTarget类是MFC处理命令消息的基础、核心。MFC为该类设计了许多成员函数和一些成员数据,基本上是为了解决消息映射问题的,所有响应消息或的类都从它派生,例如:应用程序类、框架类、文档类、视图类和各种各样的控件类等等,还有很多。
不过这个类里面有2个函数对消息映射非常重要,一个是静态成员函数DispatchCmdMsg,另一个是虚函数OnCmdMsg。
DispatchCmdMsg专门供MFC内部使用,用来分发Windows消息。OnCmdMsg用来传递和发送消息、更新用户界面对象的状态。
CCmdTarget对OnCmdMsg的默认实现:在当前命令目标(this所指)的类和基类的消息映射数组里搜索指定命令消息的消息处理函数。
这里使用虚拟函数GetMessageMap得到命令目标类的消息映射入口数组_messageEntries,然后在数组里匹配命令消息ID相同、控制通知代码也相同的消息映射条目。其中GetMessageMap是虚拟函数,所以可以确认当前命令目标的确切类。
如果找到了一个匹配的消息映射条目,则使用DispachCmdMsg调用这个处理函数;
如果没有找到,则使用_GetBaseMessageMap得到基类的消息映射数组,查找,直到找到或搜寻了所有的基类(到CCmdTarget)为止;
如果没有找到,则返回FASLE。
每个从CCmdTarget派生的命令目标类都可以覆盖OnCmdMsg,利用它来确定是否可以处理某条命令,如果不能,就通过调用下一命令目标的OnCmdMsg,把该命令送给下一个命令目标处理。通常,派生类覆盖OnCmdMsg时 ,要调用基类的被覆盖的OnCmdMsg。
在MFC框架中,一些MFC命令目标类覆盖了OnCmdMsg,如框架窗口类覆盖了该函数,实现了MFC的标准命令消息发送路径。必要的话,应用程序也可以覆盖OnCmdMsg,改变一个或多个类中的发送规定,实现与标准框架发送规定不同的发送路径。例如,在以下情况可以作这样的处理:在要打断发送顺序的类中把命令传给一个非MFC默认对象;在新的非默认对象中或在可能要传出命令的命令目标中。
消息映射的内容
通过ClassWizard为我们生成的代码,我们可以看到,消息映射基本上分为2大部分:
在头文件(.h)中有一个宏DECLARE_MESSAGE_MAP(),他被放在了类的末尾,是一个public属性的;与之对应的是在实现部分(.cpp)增加了一章消息映射表,内容如下:
BEGIN_MESSAGE_MAP(当前类, 当前类的基类)
file://{{AFX_MSG_MAP(CMainFrame)
消息的入口项
file://}}AFX_MSG_MAP
END_MESSAGE_MAP()
但是仅是这两项还远不足以完成一条消息,要是一个消息工作,必须有以下3个部分去协作:
1.在类的定义中加入相应的函数声明;
2.在类的消息映射表中加入相应的消息映射入口项;
3.在类的实现中加入相应的函数体;
消息的添加
有了上面的这些只是作为基础,我们接下来就做我们最熟悉、最常用的工作:添加消息。MFC消息的添加主要有2种方法:自动/手动,我们就以这2种方法为例,说一下如何添加消息。
1、利用Class Wizard实现自动添加
在菜单中选择View-->Class Wizard,也可以用单击鼠标右键,选择Class Wizard,同样可以激活Class Wizard。选择Message Map标签,从Class name组合框中选取我们想要添加消息的类。在Object IDs列表框中,选取类的名称。此时, Messages列表框显示该类的大多数(若不是全部的话)可重载成员函数和窗口消息。类重载显示在列表的上部,以实际虚构成员函数的大小写字母来表示。其他为窗口消息,以大写字母出现,描述了实际窗口所能响应的消息ID。选中我们向添加的消息,单击Add Function按钮,Class Wizard自动将该消息添加进来。
有时候,我们想要添加的消息本应该出现在Message列表中,可是就是找不到,怎么办?不要着急,我们可以利用Class Wizard上Class Info标签以扩展消息列表。在该页中,找到Message Filter组合框,通过它可以改变首页中Messages列表框中的选项。这里,我们选择Window,从而显示所有的窗口消息,一把情况下,你想要添加的消息就可以在Message列表框中出现了,如果还没有,那就接着往下看:)
2、手动地添加消息处理函数
1) 在类的. h文件中添加处理函数的声明,紧接在//}}AFX_MSG行之后加入声明,注意:一定要以afx_msg开头。
通常,添加处理函数声明的的地方是源代码中Class Wizard维护的表下面,但是在它标记其领域的{{}}括弧外面。这些括弧中的任何东西都将会被Class Wizard销毁。
2) 接着,在用户类的.cpp文件中找到//}}AFX_MSG_MAP行,紧接在它之后加入消息入口项。同样,也是放在{ {} }的外面
3) ,在该文件中添加消息处理函数的实体。
怎么学编程
break;要熟悉编程范式,尤其是面向过程及面向对象这两种;要广泛阅读,多用编译器及IDE(网上有许多免费的)练习编程。
CMainFrame是主窗口框架选择一种编程语言。初学者一定要从主流语言开始学习,比如中级语言C和C++。这两种语言是任何一名合格、专业的程序员都必须掌握的,因为它们称得上是软件开发界的主流。
但是不要从高级语言开始学,如Ja,因为这些语言对于初学者来说难度未免太高(高级语言可以以后再学,但是C语言和C++应该作为你的基础)。
然而对于完完全全的门外汉的来说,可能C和C++都有点困难,那么你也可以从Python开始学,这种语言被大家广泛认为是适合初学者的。
成为代码员去培训下,看几本书就好.
要深入编程,需要学习数据结构和算法,也就是说需要数学功底.
你会骑车子吗??
你是怎么学骑车子的??
你就用你学骑车子的兴趣和耐心,努力去学编程吧!!
在MFC编程中有个概念叫“设备上下文”,究竟什么才算是设备上下文呢? 请高手帮忙,谢谢了
}在WindoMicrosoft 要是早知道 会给别人带来这样的误导,他们就不应该让装VC 时预装上MFC。真是……wsX.h中定义了如下的HANDLE_MSG宏:QT和MFC哪个更好
1,,,VC就是不求赚钱但求上市,所设备上下文 =Dev Context以我们做投资的口号是,不求内容但求形式。QT更美观,可惜我没用过,估计也更复杂,我就用MFC,偶尔做些实用性的小工具,但是界面丑陋!!!外观控的建议用QT
MFC适合windows界面开发,QT时候嵌入式设备界面开发。
什么叫VC?我们公司常常听人在说VC怎么样?什么意思喃?
{switch(id)就是这个名为软件分投投资,可是到会的VC都在谈互联网,软银为盛大投资的成功沾沾自喜,IDG讲起对互联网、移动增值的方向滔滔不绝,在座一位企业家关注VC的朋友说,VC对软件业失去兴趣了,去年投资芯片业的热情也在衰退倒是互联网方面一直较为关注。
VC就是VC++,通常说的VC编程其实是指 VC-MFC 编程。Visual c++
我觉得学VC,熟悉C++的面向对象与WINDOWS编程技术是必要的.另外多看看别人的源代码,弄清程式所来龙去脉也,弄清程式的运行机制格外重要.至于你不太熟悉API,我看这并不重要,因为这么多API,试问谁能记这么多,不知道的查MSDN.初学者切莫心浮气燥,循序渐进,相信他日
你也是Dev 就是关联的设备. 编程时和硬件或软件环境交互必须的对象. 获取他,访问他,修改他,就等于作了硬件或软件.VC"高手".
VC-MFC 是使用 C++ 将Win APi 进行封装后的类库。如果要学 VC 首先要对 C++ 挺熟,才容易上手!
vc是一种面向对象的编程语言
VC编程 是指 VC-MFC 编程? 谁说的? 有没搞错?
这个笑话就跟 VC 2005 不能 非编程(非托管编程)那个笑话一样经典!
做软件的是软件开发工具
不是软件的话就是风险投资
mfc是什么?
0基础学编程可以通过以下方法学习:1、0基础学习编程建议从C语言学起,可以说60%~80%的程序员都是从C语言开始。但是学编程的专业技术,建议去专业机构进行报名学习。2、确定编程学习的方向。编程语言有多种:C++,C,C#,JAVA,Python等,每种语言都有不同的优缺点,可以根据自己的兴趣方向选择一门编程语言作为自己的学习目标。3、基础阶段的语法学习。学习任何一门编程语言,都需要掌握其编程的语法规则,可以通过阅读一些编程书籍,了解一些编程中的概念思想和基本语法。这对于后续的编程学习十分重要。4、上机实战,学习编程最重要就是需要多上机练习,所以电脑上需要安装所学语言对应的编译软件,多看书,多敲代码,实践出真知。5、多向他人学习。编程的学习离不开借鉴模仿,初学编程可以多看看厉害的人的编码,多总结他人代码的优缺点,反思自己如何能够从哪些方面改进代码,优化代码。6、学习编程需要的软件:JDK Ja开发工具集、IBM的Visual Age for Ja、JCreatorNetBeans。mfc是微软基础类库。
}}微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
相关信息:
MFC中最重要的封装是对Win32 API的封装,因此,理解Windows Object和MFC Object (C++对象,一个C++类的实例)之间的关系是理解MFC的关键之一。
所谓Windows Object(Windows对象)是Win32下用句柄表示的Windows作系统对象;所谓MFC Object (MFC对象)是C++对象,是一个C++类的实例,这里MFC Object是有特定含义的,指封装Windows Object的C++ Object,并非指任意的C++ Object。
MFC里面那些很多类分别代表什么 有什么作用
VC就是VC++,通常说的VC编程其实是指 VC-MFC 编程。其中 CApp负责整个应用程序的管理,CDOC类中有一个CAPP的指针,也可以认为应用程序是从CApp开始执行的。
break;CDoc是应用程序数据来源(文档)主要是用来管理数据,提供保存和加载数据的功能。有关文件的读写作在CDoc的Serialize函数中进行。
CView是应用程序数据显示(视图)主要是用来数据显示,以及给用户提供对数据的编辑和修改功能。有关数据或图形的显示作在CView的OnDraw函数中进行。
基本的应用程序就是由这四个类构成的。用户需要做的就是对这些类实例化,以实现所需要的具体功能。
在SDI(单文档)界面中,菜单响应遵循这样一个顺序:菜单消息先由CMainFrame类接收,CMainFrame并不直接在内部寻找对应的相应函数,而是到CView类寻找。如果CView类有该消息的响应函数,那么就直接调用CView类中的响应函数,否则,转到CDoc类寻找,如果CDoc类中存在该消息的响应函数,那么就直接调用CDoc类中的响应函数,否则,返回到CMainFrame类寻找。如果CMainFrame类中也没有,返回到CApp类中寻找。如果在CApp类中也没有找到,表示没有该菜单的响应函数。
可以这样来理解,菜单消息响应函数的顺序是:CView>CDoc>CMainFrame>CApp。
框架、文档、视图类之间的调用关系
1、主框架(CFrameWnd)中访问视图(CView)
CView GetActiveView() const;
通常定义的视图为CView的派生类,在调用自定义视图对象的方法时
应该这样写:((CMouseKeyView)GetActiveView())->MyFunc();
2、主框架(CFrameWnd)中访问文档(CDocument)
GetActiveDocument,返回CDocument对象;
3、在视图(CView)中访问文档(CDocument)
inline CMouseKeyDoc CMouseKeyView::GetDocument()
{return (CMouseKeyDoc)m_pDocument;}
4、在视图(CView)中访问框架(CFrameWnd)
CFrameWnd GetParentFrame() const;
5、在文档(CDocument)中访问框架(CFrameWnd)
CWnd AfxGetMainWnd();
CWnd AfxGetApp()->m_pMainWnd;
6、在文档(CDocument)中访问视图(CView)
UpdateAllViews
功能:通知所有的视图文档已被修改的信息
原型:
void UpdateAllViews(
CView pSender, // 要更新的视图指针,如果希望更新所有视
图,将此参数设为NULL
LPARAM lHint=0L, // 包含更改消息的通知
CObject pHint=NULL // 保管更改消息的对象
}7、在其他类中访问文档类(CDocument)
CDocument GetDocument()
{CFrameWnd frm=(CFrameWnd)::AfxGetMainWnd();
ASSERT(frm);
CDocument pDoc=frm->GetActiveDocument();
ASSERT(pDoc);
ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CMouseKeyDoc)));
return (CMouseKeyDoc)pDoc;
}