m_pMainWndnew CMyFrame m_pMainWnd-gtShowWindow m_nCmdShow m_pMainWnd-gtUpdateWindow return TRUEBEGIN_MESSAGE_MAPCMyFrameCFrameWnd ON_WM_LBUTTONDOWN ON_WM_PAINTEND_MESSAGE_MAPCMyFrame::CMyFrame CreateNULLquotMYAPP Applicationquotvoid CMyFrame::OnLButtonDown UINT nFlagsCPoint point TRACEquotEntering CMyFrame::OnLButtonDown - lxddnquot longnFlagspoint.x point.yvoid CMyFrame::OnPaint CPaintDC dcthis dc.TextOut 00quotHello Worldquot4、编译运行,报错。
为什么呢?原来还没有添加 MFC 的支持,在 Project Setting 选项 General 属性页选择”Use MFC in a Static Libraryquot5、再 CtrlF5哈成功了。
让我们看看这个程序中的一些元素。
①WinMain 函数:并非不存在只是已经被隐藏在应用程序框架内部。
②CMyApp 类:CMyApp 类的对象代表一个应用程序,CWinApp 基类决定它的大部分行为。
③应用程序的启动:当开始运行应用程序时 WINDOWS 会调用 WinMain 函数,WinMain 会查找该应用程序的全局对象 theApp。
④CMyApp::InitInstance 成员函数:发现 theApp 后自动调用重载的虚函数 InitInstance 来完成主窗口的构造和显示工作。
记住这个函数。
⑤CWinApp::Run 成员函数:WinMain 在调用 InitInstance 之后紧接着调用 Run 函数,它被隐藏在基类中负责传递应用程序的消息给相映的窗口。
(我把它理解为好象 SDK 的窗口的过程函数不知对不对)⑥CMyFrame 类:此类的对象代表着应用程序的主窗口。
它的构造函数调用基类 CFrameWnd 的 Create 函数创建具体的窗口结构。
⑦CMyFrame::OnLButtonDown 函数:演示消息处理机制,当鼠标坐键被按下这一事件被映射到 CMyFrame的 OnLButtonDown 函数上,如果你选择 F5 进行编译运行的话可以在调试窗口看到 TRACE 宏显示的类似下面的信息 Entering CMyFrame::OnLButtonDown - 1309119 Entering CMyFrame::OnLButtonDown - 1408221⑧CMyFrame::OnPaint 函数:应用程序每次重新绘制窗口都需要调用此函数,将显示quotHello Worldquot放在这里是因为每次窗口发生变化时保证quotHello Worldquot被显示,你可以试着将语句: CPaintDC dcthis dc.TextOut 00quotHello Worldquot写在别出,例如写在void CMyFrame::OnLButtonDown UINT nFlagsCPoint point TRACEquotEntering CMyFrame::OnLButtonDown - lxddnquot longnFlagspoint.x point.y CPaintDC dcthis dc.TextOut 00quotHello Worldquot运行后当点击左键时显示quotHello Worldquot,但当窗口最小化再最大化时quotHello Worldquot不见了。
⑧关闭应用程序:用户关闭应用程序时会有一系列事件发生。
首先 CMyFrame 对象被删除,然后退出 Run,进而退出 WinMain,最后删除 CMyApp 对象。
通过上面的示例我们看见程序的大部分功能包含在基类 CWinApp 和 CFrameWnd 中,我们只写了很少的函数,便可以完成很复杂的功能。
所以应用程序框架不仅仅是一种类库,它还定义了应用程序的结构,除了基类外还包括 WinMain 函数,以及用来支持消息处理、诊断、DLL、等都包含在应用程序框架中。
第三篇:消息映射和视图类在写了两篇笔记后有很多朋友给我发信,和我交流一些在学习过程中的问题。
但由于我也是一个初学者,对一些问题自己也没有把握,所以实在不敢做答,但我会尽量尽我所能和大家一起研究,谢谢大家的鼓励和信任。
在开始先补充一下上一篇的内容“内容窗口的创建”,兼答天歌网友的问题(如果天歌兄弟能看到的话 )。
为了简化我们看一个更简单代码,只有一个文件,创建一个空白的窗口,什么也不做。
注意哦:真写程序时还是要分成.h 和.cpp 两个文件比较清晰。
前几步和『VC技术内幕』学习笔记(2)中的一样,下面是代码://// MyApp.cppinclude quotafxwin.hquot //afxwin.h 会调用 windows.h 是 MFC 编程的途径,只要用到 MFC 就一定要包含它。
class CMyApp:public CWinApp //从 CWinApp 继承一个类public: virtual BOOL InitInstance//重载 InitInstance 虚函数class CMyFrame:public CFrameWnd //从 CFrameWnd 继承一个类CMyApp myApp //最后又激活应用程序的构造函数BOOL CMyApp::InitInstance m_pMainWndnew CMyFrame //new 激活了 CMyFrame 类构造函数 CFrameWnd,构造函数调又用 CREATE //m_pMainWnd 在 MFC 的 定 义 CWnd m_pMainWnd// main window usually sameAfxGetApp-gtm_pMainWnd //m_pMainWnd 保存窗口的位置 CMyFrame m_pMainWnd-gtCreateNULLquot一个 MFC 应用程序:空白窗口quot //创建窗口 m_pMainWnd-gtShowWindowm_nCmdShow //显示在屏幕上 return TRUE如果还不明白建议查看 MSDN 或看看侯大师的深入浅出。
关于这个问题就说到这,最后对天歌朋友的学习态度表示敬意。
下面进入正体,让我们继续来看看 MFC 的消息映射。
MFC 是通过一些宏来将特定的消息影射到派生类相应的成员函数上,这种体制的好处是允许某些非窗口类(如文档类)来控制命令消息。
且不需要C作任何扩展。
MFC 的消息控制函数要求提供函数原形、函数体以及消息映射中的入口。
真的很麻烦,还好用 Class Wizard可以很容易的将上面说到的东西加到我们的类中。
例如只要在 Class Wizard 中添加 WM_LBUTTONDOWN 消息则相应的代码便加在合适的地方。
怎么样简单多了吧。
应用程序除了包含应用程序框架类外,一般还要包含文档和视图类。
这种文档-视图结构是应用框架的核心。
我一直做 MIS 开发,当然不是用 VC 用的是 VB,所以看到这我很不自觉的想到了后台数据库和界面的关系,这个例子可能不是很恰当,但却能很好的帮助我们理解文档和视图。
文档好比后台的数据库,视图就是界面上显示的内容,同一个数据库可以用不同的界面显示,但由于所有的界面内容都是从数据库中数据得来,所以当数据库发生变化时所有的相关界面显示都会跟着改变。
越来越觉得不恰当,不过实在想不出别的例子了。
我们的应用程序实际上就是通过视图对文档进行一系列操作,不单指输出。
下面我们看看视图类。
视图是一个从 CView 类派生的类的对象,在屏幕上显示的窗口就是一种。
对象的行为完全由类的成员函数和数据成员决定,其中及包括派生类中的特定函数,也包括基类的标准函数,所以了解 MFC 类库的结构以及各类的标准成员函数是多么重要啊,别怕麻烦找来 MFC 的源码读读,看多少算多少,但肯定不白看,这是雷神的经验。
记得上一篇的我的例子吗,1、打开 VC6 从菜单选择 NEW,给项目命名为”MyApp01“。
2、选择 MFC AppWizardexe 选项,除 STEP 1 选择单文档外其他 STEP 缺省。
此时 MFC 应用程序框架便帮我们完成了应用程序,你可以执行它,它会在屏幕上显示一个典型的WINDOWS 风格的空白窗口。
我们来看一下项目程序所在目录下的文件:myapp01.dsp //项目文件myapp01.dsw //工作空间文件myapp01.rc //资源描述文件myapp01View.cpp //包含 CMyAppView 类成员函数的视图类实现文件 重点myapp01View.h //包含 CMyAppView 类成员函数的视图类头文件 重点myapp01.opt //二进制文件,告诉 Developer Studio 本项目的哪些文件是打开的,又是如何排列的readme.txt //用来解释所产生的所有文件,未列出的 myapp01Doc.cpp、myapp01Doc.h、StdAfx.cpp、StdAfx.h....在这里都可以找到相应解释。
resource.h //包含define 常量定义的头文件仔细研究一下 myapp01View.cpp 和 myapp01View.h 文件,程序核心 CMyAppView 类在这两
上一篇:
【精品】VC开发平台简介
下一篇:
近三年来思想工作小结(德能勤绩廉)