Useful Documents
接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法: while(1) { }
当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。下图为消息投递模式
在16位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。Windows3.G就是这种系统。
而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。
1.3利用VisualC++/MF-VisualC++/MFC入门教程
MFC借助C++的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。更令人兴奋的是利用C++的封装功能使开发者摆脱Windows中各种句柄的困扰,只需要面对C++中的对象,这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系统原理对开发很有帮助)
id=getMessage(...); if(id==quit)
breaA;
translateMessage(...);
Useful Documents
6
Useful Documents
正因为MFC是建立在C++的基础上,所以我强调C/C++语言基础对开发的重要性。利用C++的封装性开发者可以更容易理解和操作各种窗口对象;利用C++的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码;利用虚拟性可以在必要时更好的控制窗口的活动。而且C++本身所具备的超越C语言的特性都可以使开发者编写出更易用,更灵活的代码。
在MFC中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法: 代码如下
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFG_MSG_MAP(CMainFrame)
ON_WM_CREATE()
//}}AFG_MSG_MAP
ON_COMMAND(ID_FONT_DROPDOWN,DoNothing)
END_MESSAGE_MAP()
经过编译后,代码被替换为如下形式(这只是作讲解,实际情况比这复杂得多): //BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
CMainFrame::newWndProc(...) { switch(...) { //{{AFG_MSG_MAP(CMainFrame) //
ON_WM_CREATE()
case(WM_CREATE): OnCreate(...);
breaA;
Useful Documents
7
Useful Documents
}
newWndProc就是窗口过程只要是该类的实例生成的窗口都使用该窗口过程。
所以了解了Windows的消息机制在加上对消息映射的理解就很容易了解MFC开发的基本思路了。 1.4利用MFC进行开发的通用方法介绍-VisualC++/MFC入门教程
以下是我在最初学习VC时所常用的开发思路和方法,希望能对初学VC的朋友有所帮助和启发。 1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。
2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用CFile进行。
3、开发注重交互并且文件读写复杂的的简单应用程序可以利用以CFormView为基础视的单文档视结构。
4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。
5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。 6、在要求在多个文档间传递数据时使用多文档视结构。
7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。
//}}AFG_MSG_MAP //
ON_COMMAND(ID_FONT_DROPDOWN,DoNothing)
case(WM_COMMAND): breaA;
if(HIWORD(wP)==ID_FONT_DROPDOWN) { }
DoNothing(...);
//END_MESSAGE_MAP() }
Useful Documents
8
Useful Documents
8、尽量避免使用多文档多视结构。
9、不要使用多重继承并尽量减少一个类中封装过多的功能。 1.5MFC中常用类,宏,函数介绍-VisualC++/MFC入门教程 常用类
CRect:用来表示矩形的类,拥有四个成员变量:topleftbottomright。分别表是左上角和右下角的坐标。可以通过以下的方法构造: CRect(intl,intt,intr,intb);指明四个坐标 CRect(constRECT&srcRect);由RECT结构构造 CRect(LPCRECTlpSrcRect);由RECT结构构造
CRect(POINTpoint,SIZEsize);有左上角坐标和尺寸构造 CRect(POINTtopLeft,POINTbottomRight);有两点坐标构造 下面介绍几个成员函数: intWidth()const;得到宽度 intHeight()const;得到高度 CSizeSize()const;得到尺寸 CPoint&TopLeft();得到左上角坐标 CPoint&BottomRight();得到右下角坐标 CPointCenterPoint()const;得当中心坐标
此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。 CPoint:用来表示一个点的坐标,有两个成员变量:Gy。可以和另一个点相加。
CString:用来表示可变长度的字符串。使用CString可不指明内存大小,CString会根据需要自行分配。下面介绍几个成员函数: GetLength得到字符串长度 GetAt得到指定位置处的字符
Useful Documents
9
Useful Documents
operator+相当于strcat
voidFormat(LPCTSTRlpszFormat,...);相当于sprintf Find查找指定字符,字符串 Compare比较
CompareNoCase不区分大小写比较 MaAeUpper改为小写 MaAeLower改为大写
CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数: Add增加CString
RemoveAt删除指定位置CString对象 RemoveAll删除数组中所有CString对象 GetAt得到指定位置的CString对象 SetAt修改指定位置的CString对象 InsertAt在某一位置插入CString对象 常用宏 RGB TRACE ASSERT VERIFY 常用函数
CWindAppGAfGGetApp();
HINSTANCEAfGGetInstanceHandle(); HINSTANCEAfGGetResourceHandle();
Useful Documents
10