1、 1 目录 +- 第一章 VC 入门 |- 1.1 如何学好 VC |- 1.2 理解 Windows 消息机制 |- 1.3 利用 Visual C+/MFC 开发 Windows 程序的优势 |- 1.4 利用 MFC 进行开发的通用方法介绍 |- 1.5 MFC 中常用类,宏,函数介绍 +- 第二章 图形输出 |- 2.1 和 GUI 有关的各种对象 |- 2.2 在窗口中输出文字 |- 2.3 使用点,刷子,笔进行绘图 |- 2.4 在窗口中绘制设备相关位图,图标,设备无关位图 |- 2.5 使用各种映射方式 |- 2.6 多边形和剪贴区域 +- 第三章 文档视结构 |- 3.1 文档
2、 视图 框架窗口间的关系和消息传送规律 |- 3.2 接收用户输入 |- 3.3 使用菜单 |- 3.4 文档,视,框架之间相互作用 |- 3.5 利用序列化进行文件读写 |- 3.6 MFC 中所提供的各种视类介绍 +- 第四章 窗口控件 |- 4.1 Button |- 4.2 Static Box |- 4.3 Edit Box |- 4.4 Scroll Bar |- 4.5 List Box/Check List Box |- 4.6 Combo Box/Combo Box Ex |- 4.7 Tree Ctrl |- 4.8 List Ctrl 2 |- 4.9 Tab Ctrl
3、|- 4.A Tool Bar |- 4.B Status Bar |- 4.C Dialog Bar |- 4.D 利用 AppWizard 创建并使用 ToolBar StatusBar Dialog Bar |- 4.E General Window |- 4.F 关于 WM_NOTIFY 的使用方法 +- 第五章 对话框 |- 5.1 使用资源编辑器编辑对话框 |- 5.2 创建有模式对话框 |- 5.3 创建无模式对话框 |- 5.4 在对话框中进行消息映射 |- 5.5 在对话框中进行数据交换和数据检查 |- 5.6 使用属性对话框 |- 5.7 使用通用对话框 |- 5.8 建立
4、以对话框为基础的应用 |- 5.9 使用对话框作为子窗口 +- 第六章 网络通信开发 |- 6.1 WinSock 介绍 |- 6.2 利用 WinSock 进行无连接的通信 +- 6.3 利用 WinSock 建立有连接的通信 Visual C+开发指南 闻怡洋 /文 第一章 VC 入门 1.1 如何学好 VC - Visual C+/MFC 入门教程 这个问题很多朋友都问过我, 当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难,为了帮助朋友们更快的掌握 VC 开发,下面我将自己的一点体会讲一下: 1、需要有好的 C/C+基础。正所谓 “磨刀不误砍柴工
5、”,最开始接触 VC 时不要急于开始 Windows 程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉3 一些在编程中常犯的错误。更重要的是理解并能运用 C+的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用 MFC 进行开发的朋友对 C+一定要能熟 练运用。 2、理解 Windows 的消息机制,窗口句柄和其他 GUI 句柄的含义和用途。了解和 MFC 各个类功能相近的 API 函数。 3、一定要理解 MFC 中消息映射的作用。 4、训练自己在编写代码时不使用参考书而是使用 Help Online。 5、记住一些常用的消
6、息名称和参数的意义。 6、学会看别人的代码。 7、多看书,少买书,买书前一定要慎重。 8、闲下来的时候就看参考书。 9、多来我的主页。 O 后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。 此外我将一些我在选择参考书时的原则: 对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,在使用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。尽量买翻译的书,因为这些书一般都比较易懂,而且语言比较轻松。买书前一定要慎重如果买到不好用的书可能会对自己的学习积极性产生打击。 对于已经掌握了 VC 的朋友:这种程度的开发者应该加深自己对系统原理,
7、技术要点的认识。需要选择一些对原理讲解的比较透彻的书籍,这样一来才会对新技术有更多的了解,最好书中对技术的应用有一定的阐述。尽量选择示范代码必较精简的书,可以节约银子。 此外最好涉猎一些辅助性的书籍。 1.2 理解 Windows 消息机制 - Visual C+/MFC 入门教程 Windows 系统是一个消息驱动的 OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解。 1、消息的组成:一个消息由一个消息名称( UINT),和两个参数( WPARAM, LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送
8、消息到某一个窗口。例如当菜单转中之后会有 WM_COMMAND 消息发送, WPARAM 的高字中( HIWORD(wParam))是命令的 ID 号,对菜单来讲就是菜单 ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程( WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对 WM_COMMAND 进行处理的代码,如果希望在窗口中进行图形输出就必须对 WM_PAINT 进行处理。 4 3、未处理的消息到那里去了: M$为窗口编写了默认的窗口过程
9、,这个窗口过程将负责处理那些你不处 理消息。正因为有了这个默认窗口过程我们才可以利用 Windows 的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。 4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。 5、示例:下面有一段伪代码演示如何在窗口过程中处
10、理消息 LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM) switch(uMessageType) /使用 SWITCH 语句将各种消息分开 case(WM_PAINT): doYourWindow(.);/在窗口需要重新绘制时进行输出 break; case(WM_LBUTTONDOWN): doYourWork(.);/在鼠标左键被按 下时进行处理 break; default: callDefaultWndProc(.);/对于其它情况就让系统自己处理 break; 接下来谈谈什么是消息机制:系统将会维护一个或多
11、个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以 Windows 可以同时进行多个任务。下面的伪代码演示了消息循环的用法: while(1) 5 id=getMessage(.); if(id = quit) break; translateMessage(.); 当该程序没有消息通知时 getMessage 就不会返回,也就不会占用系统的 CPU 时间。
12、 下图为消息投递模式 在 16 位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。 Windows3.X 就是这种系统。 而 32 位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。 Windows95/NT 就是这种系统。 1.3 利用 Visual C+/MF - Visual C+/MFC 入门教程 MFC 借助 C+的优势为 W
13、indows 开发开辟了一片新天地,同时也借助 ApplicationWizzard 使开发者摆脱离了那些每次都必写基本代码,借助 ClassWizard 和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。更令人兴奋的是利用 C+的封装功能使开发者摆脱 Windows 中各种句柄的困扰,只需要面对 C+中的对象,这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系统原理对开发很有帮助) 正因为 MFC 是建立在 C+的基础上,所以我强调 C/C+语言基础对开发的重要性。利用 C+的封装性开发者可以更容易理解和操作各种窗口对象;利用 C+的派生性开发者可以减少开发自定义窗口的
14、时间和创造出可重用6 的代码;利用虚拟性可以在必要时更好的控制窗口的活动。而且 C+本身所具备的超越 C 语言的特性都可以使开发者编写出更易用,更灵活的代码。 在 MFC 中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法: 代码如下 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) /AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() /AFX_MSG_MAP ON_COMMAND(ID_FONT_DROPDOWN, DoNothing) EN
15、D_MESSAGE_MAP() 经过编译后,代码被替换为如下形式(这只是作讲解,实际情况比这复杂得多): /BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) CMainFrame:newWndProc(.) switch(.) /AFX_MSG_MAP(CMainFrame) / ON_WM_CREATE() case(WM_CREATE): OnCreate(.); break; /AFX_MSG_MAP / ON_COMMAND(ID_FONT_DROPDOWN, DoNothing) case(WM_COMMAND): if(HIWORD(wP)=ID_F
16、ONT_DROPDOWN) DoNothing(.); break; 7 /END_MESSAGE_MAP() newWndProc 就是窗口过程只要是该类的实例生成的窗口都使用该窗口过程。 所以了解了 Windows 的消息机制在加上对消息映射的理解就很容易了解 MFC 开发的基本思路了。 1.4 利用 MFC 进行开发的通用方法介绍 - Visual C+/MFC 入门教程 以下是我在最初学习 VC 时所常用的开发思路和方法,希望能对初学 VC 的朋友有所帮助和启发。 1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。 2、开发注重交互的简单应用程序可以使用对话框为
17、基础的窗口,如果文件读写简单这可利用 CFile 进行。 3、开发注 重交互并且文件读写复杂的的简单应用程序可以利用以 CFormView 为基础视的单文档视结构。 4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。 5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。 6、在要求在多个文档间传递数据时使用多文档视结构。 7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。 8、尽量避免使用多文档多视结构。 9、不要使用多重继承并尽量减少一个类中封装过多的功能。 1.5 MFC 中常用类,宏,函数介绍 - Visual C+/MFC
18、入门教程 常用类 CRect:用来表示矩形的类,拥有四个成员变量: top left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造: CRect( int l, int t, int r, int b ); 指明四个坐标 CRect( const RECT 由 RECT 结构构造 CRect( LPCRECT lpSrcRect ); 由 RECT 结构构造 CRect( POINT point, SIZE size ); 有左上角坐标和尺寸构造 CRect( POINT topLeft, POINT bottomRight ); 有两点坐标构造 下面介绍几个
19、成员函数: int Width( ) const; 得到宽度 int Height( ) const; 得到高度 CSize Size( ) const; 得到尺寸 CPoint 得到左上角坐标 8 CPoint 得到右下角坐标 CPoint CenterPoint( ) const; 得当中心坐标 此外矩形可以和点( CPoint)相加进行位移,和另一个矩形相加得到 “并 ”操作后的矩形。 CPoint:用来表示一个点的坐标,有两个成员变量: x y。 可以和另一个点相加。 CString:用来表示可变长度的字符串。使用 CString 可不指明内存大小, CString 会根据需要自行分配
20、。下面介绍几个成员函数: GetLength 得到字符串长度 GetAt 得到指定位置处的字符 operator + 相当于 strcat void Format( LPCTSTR lpszFormat, . ); 相当于 sprintf Find 查找指定字符,字符串 Compare 比较 CompareNoCase 不区分大小写比较 MakeUpper 改为小写 MakeLower 改为大写 CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为 CString 对象的实例。下面介绍几个成员函数: Add 增加 CString RemoveAt 删除指定位置 CStri
21、ng 对象 RemoveAll 删除数组中所有 CString 对象 GetAt 得到指定位置的 CString 对象 SetAt 修改指定位置的 CString 对象 InsertAt 在某一位置插入 CString 对象 常用宏 RGB TRACE ASSERT VERIFY 常用函数 9 CWindApp* AfxGetApp(); HINSTANCE AfxGetInstanceHandle( ); HINSTANCE AfxGetResourceHandle( ); int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UI
22、NT nIDHelp = 0 );用于弹出一个消息框 第二章 图形输出 2.1 和 GUI 有关的各种对象 在 Windows 中有各种 GUI 对象(不要和 C+对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种 GUI 对象和拥有的属性。 字体对象 CFont 用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。 颜色和背景色不属于字体的属性。 关于如何创建和使用字体在 2.2 在窗口中输出文字中会详细讲解。 刷子 CBrush 对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属
23、性为颜色,是否采用网格和网格的类型如水平的,垂直的,交叉的等。你也可以利用 8*8 的位图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在 2.3 使用刷子,笔进行绘图 中会详细讲解。 画笔 CPen 对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。关于如何创建和使用画笔在 2.3 使用刷子,笔进行绘图 中会详细讲解。 位图 CBitmap 对象可以包含一幅 图像,可以保存在资源中。关于如何使用位图在 2.4 在窗口中绘制设备相关位图,图标,设备无关位图 中会详细讲解。 还有一种特殊的 GUI 对象是多边形,
24、利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在 2.6 多边形和剪贴区域 中会详细讲解。 在 Windows 中使用 GUI 对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该 GUI 对象选入 DC 中,同时保存 DC 中原来的 GUI 对象。 如果选入一个非法的对象将会引起异常 。在使用完后应该恢复原来的对象,这一点特别重要, 如果保存一个临时对象在 DC 中,而在临时对象被销毁后可能引起异常。 有一点必须注意, 每一个对象在重新创建前必 须销毁 ,下面的代码演示了这一种安全的使用方法: OnDraw(CDC* pDC)
25、CPen pen1,pen2; pen1.CreatePen(PS_SOLID,2,RGB(128,128,128);/创建对象 10 pen2.CreatePen(PS_SOLID,2,RGB(128,128,0);/创建对象 CPen* pPenOld=(CPen*)pDC-SelectObject(/选择对象进 DC drawWithPen1. (CPen*)pDC-SelectObject(/选择对象进 DC drawWithPen2. pen1.DeleteObject();/再次创建前先销毁 pen1.CreatePen(PS_SOLID,2,RGB(0,0,0);/再次创建对象
26、(CPen*)pDC-SelectObject(/选择对象进 DC drawWithPen1. pDC-SelectObject(pOldPen);/恢复 此外系统中还拥有一些库存 GUI 对象,你可以利用 CDC:SelectStockObject(SelectStockObject( int nIndex )选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体。 BLACK_BRUSH Black brush. DKGRAY_BRUSH Dark gray brush. GRAY_BRUSH Gray brush. HOLLOW_BRUSH Hollow brush. LTGRAY
27、_BRUSH Light gray brush. NULL_BRUSH Null brush. WHITE_BRUSH White brush. BLACK_PEN Black pen. NULL_PEN Null pen. WHITE_PEN White pen. ANSI_FIXED_FONT ANSI fixed system font. ANSI_VAR_FONT ANSI variable system font. DEVICE_DEFAULT_FONT Device-dependent font. OEM_FIXED_FONT OEM-dependent fixed font. SYSTEM_FONT The system font. By default, Windows uses the system font to draw menus, dialog-box controls, and other text. In Windows versions 3.0 and later, the system font is proportional width; earlier versions of Windows use a fixed-width system font.