收藏 分享(赏)

(适合初学者)MFC基础教程.doc

上传人:精品资料 文档编号:9237527 上传时间:2019-07-30 格式:DOC 页数:85 大小:421.50KB
下载 相关 举报
(适合初学者)MFC基础教程.doc_第1页
第1页 / 共85页
(适合初学者)MFC基础教程.doc_第2页
第2页 / 共85页
(适合初学者)MFC基础教程.doc_第3页
第3页 / 共85页
(适合初学者)MFC基础教程.doc_第4页
第4页 / 共85页
(适合初学者)MFC基础教程.doc_第5页
第5页 / 共85页
点击查看更多>>
资源描述

1、Visual C+/MFC初学教程目录 +- 第一章 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|- 4.9 Tab Ctrl|- 4.A Tool

3、 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 建立以对话 框为基础的应用|- 5.9 使用

4、对话框 作为子窗口+- 第六章 网络通信开发|- 6.1 WinSock介绍|- 6.2 利用 WinSock进 行无连接的通信+- 6.3 利用 WinSock建 立有连接的通信1.1 如何学好 VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难,为了帮助朋友们更快的掌握 VC开发,下面我将自己的一点体会讲一下:1、需要有好的 C/C+基础。正所谓“磨刀不误砍柴工”,最开始接触 VC时不要急于开始Windows程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在

5、编程中常犯的错误。更重要的是理解并能运用 C+的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用 MFC进行开发的朋友对 C+一定要能熟练运用。 2、理解 Windows的消息机制,窗口句柄和其他 GUI句柄的含义和用途。了解和 MFC各个类功能相近的 API函数。3、一定要理解 MFC中消息映射的作用。4、训练自己在编写代码时不使用参考书而是使用 Help Online。5、记住一些常用的消息名称和参数的意义。6、学会看别人的代码。7、多看书,少买书,买书前一定要慎重。8、闲下来的时候就看参考书。后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。此外我将一些

6、我在选择参考书时的原则:对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,在使用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。尽量买翻译的书,因为这些书一般都比较易懂,而且语言比较轻松。买书前一定要慎重如果买到不好用的书可能会对自己的学习积极性产生打击。对于已经掌握了 VC的朋友:这种程度的开发者应该加深自己对系统原理,技术要点的认识。需要选择一些对原理讲解的比较透彻的书籍,这样一来才会对新技术有更多的了解,最好书中对技术的应用有一定的阐述。尽量选择示范代码必较精简的书,可以节约银子。此外最好涉猎一些辅助性的书籍。返回首页1.2 理解 Windows消

7、息机制Windows系统是一个消息驱动的 OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解。 1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有 WM_COMMAND消息发送,WPARAM 的高字中(HIWORD(wParam))是命令的 ID号,对菜单来讲就是菜单 ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。 2、谁将收到消息:一个消息必须由一个窗

8、口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对 WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对 WM_PAINT进行处理。 3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用 Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。 4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个

9、窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。5、示例:下面有一段伪代码演示如何在窗口过程中处理消息 LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM wP,LPARAM)switch(uMessageType)/使用 SWITCH语句将各种消息分开case(WM_PAINT):doYourWindow(.);/在窗口需要重新绘制时进行输出break

10、;case(WM_LBUTTONDOWN):doYourWork(.);/在鼠标左键被按下时进行处理break;default:callDefaultWndProc(.);/对于其它情况就让系统自己处理break;接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以 Windows可以同时进行多个任务。下面的伪代码

11、演示了消息循环的用法: while(1)id=getMessage(.);if(id = quit)break;translateMessage(.);当该程序没有消息通知时 getMessage就不会返回,也就不会占用系统的 CPU时间。 下图为消息投递模式在 16位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。Windows3.X 就是这种系统。而 32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前

12、程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT 就是这种系统。返回 首页1.3 利用 Visual C+/MFC开发 Windows程序的优势MFC借助 C+的优势为 Windows开发开辟了一片新天地,同时也借助 ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助 ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。更令人兴奋的是利用 C+的封装功能使开发者摆脱 Windows中各种句柄的困扰,只需要面对 C+中的对象,这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系

13、统原理对开发很有帮助) 正因为 MFC是建立在 C+的基础上,所以我强调 C/C+语言基础对开发的重要性。利用 C+的封装性开发者可以更容易理解和操作各种窗口对象;利用 C+的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码;利用虚拟性可以在必要时更好的控制窗口的活动。而且 C+本身所具备的超越 C语言的特性都可以使开发者编写出更易用,更灵活的代码。 在 MFC中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法: 代码如下BEGIN_MESSAGE_MAP(CMainFrame, CFram

14、eWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()/AFX_MSG_MAPON_COMMAND(ID_FONT_DROPDOWN, DoNothing)END_MESSAGE_MAP()经过编译后,代码被替换为如下形式(这只是作讲解,实际情况比这复杂得多):/BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)CMainFrame:newWndProc(.)switch(.)/AFX_MSG_MAP(CMainFrame)/ ON_WM_CREATE()case(WM_CREATE):OnCreate(.);break;/AFX_

15、MSG_MAP/ ON_COMMAND(ID_FONT_DROPDOWN, DoNothing)case(WM_COMMAND):if(HIWORD(wP)=ID_FONT_DROPDOWN)DoNothing(.);break;/END_MESSAGE_MAP()newWndProc就是窗口过程只要是该类的实例生成的窗口都使用该窗口过程。 所以了解了 Windows的消息机制在加上对消息映射的理解就很容易了解 MFC开发的基本思路了。 返 回首页1.4 利用 MFC进行开发的通用方法介绍以下是我在最初学习 VC时所常用的开发思路和方法,希望能对初学 VC的朋友有所帮助和启发。1、开发需要读写

16、文件的应用程序并且有简单的输入和输出可以利用单文档视结构。2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用 CFile进行。3、开发注重交互并且文件读写复杂的的简单应用程序可以利用以 CFormView为基础视的单文档视结构。4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。6、在要求在多个文档间传递数据时使用多文档视结构。7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。8、尽量避免使用多文档多视结构。9、不要使用多重继承并尽量减少一个类中封装过

17、多的功能。返回首页1.5 MFC中常用类,宏,函数介绍常用类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 );

18、有两点坐标构造下面介绍几个成员函数:int Width( ) const; 得到宽度 int Height( ) const; 得到高度 CSize Size( ) const; 得到尺寸 CPoint 得到左上角坐标 CPoint 得到右下角坐标 CPoint CenterPoint( ) const; 得当中心坐标 此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。CPoint:用来表示一个点的坐标,有两个成员变量:x y。 可以和另一个点相加。CString:用来表示可变长度的字符串。使用 CString可不指明内存大小,CString 会根据需要自行

19、分配。下面介绍几个成员函数: GetLength 得到字符串长度 GetAt 得到指定位置处的字符 operator + 相当于 strcat void Format( LPCTSTR lpszFormat, . ); 相当于 sprintf Find 查找指定字符,字符串 Compare 比较 CompareNoCase 不区分大小写比较 MakeUpper 改为小写 MakeLower 改为大写 CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为 CString对象的实例。下面介绍几个成员函数: Add 增加 CString RemoveAt 删除指定位置 CStr

20、ing对象 RemoveAll 删除数组中所有 CString对象 GetAt 得到指定位置的 CString对象 SetAt 修改指定位置的 CString对象 InsertAt 在某一位置插入 CString对象 常用宏RGBTRACEASSERTVERIFY常用函数CWindApp* AfxGetApp();HINSTANCE AfxGetInstanceHandle( );HINSTANCE AfxGetResourceHandle( );int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0

21、);用于弹出一个消息框返 回首页2.1 和 GUI有关的各种对象在 Windows中有各种 GUI对象(不要和 C+对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种 GUI对象和拥有的属性。字体对象 CFont用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。颜色和背景色不属于字体的属性。关于如何创建和使用字体在 2.2 在窗口中输出文字中会详细讲解。刷子 CBrush对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格和网格的类型如水平的,垂直的,交叉的等。

22、你也可以利用 8*8的位图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在 2.3 使用刷子,笔进行绘图中会详细讲解。画笔 CPen对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。关于如何创建和使用画笔在 2.3 使用刷子,笔进行绘图中会详细讲解。位图 CBitmap对象可以包含一幅图像,可以保存在资源中。关于如何使用位图在 2.4 在窗口中绘制设备相关位图,图标,设备无关位图中会详细讲解。还有一种特殊的 GUI对象是多边形,利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在 2.6

23、 多边形和剪贴区域中会详细讲解。在 Windows中使用 GUI对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该 GUI对象选入 DC中,同时保存 DC中原来的 GUI对象。如果选入一个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在 DC中,而在临时对象被销毁后可能引起异常。有一点必须注意,每一个对象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法: OnDraw(CDC* pDC)CPen pen1,pen2;pen1.CreatePen(PS_SOLID,2,RGB(128,128,128);/

24、创建对象pen2.CreatePen(PS_SOLID,2,RGB(128,128,0);/创建对象CPen* pPenOld=(CPen*)pDC-SelectObject(/选择对象进 DCdrawWithPen1.(CPen*)pDC-SelectObject(/选择对象进 DCdrawWithPen2.pen1.DeleteObject();/再次创建前先销毁pen1.CreatePen(PS_SOLID,2,RGB(0,0,0);/再次创建对象(CPen*)pDC-SelectObject(/选择对象进 DCdrawWithPen1.pDC-SelectObject(pOldPen)

25、;/恢复此外系统中还拥有一些库存 GUI对象,你可以利用CDC:SelectStockObject(SelectStockObject( int nIndex )选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体。 BLACK_BRUSH Black brush. DKGRAY_BRUSH Dark gray brush. GRAY_BRUSH Gray brush. HOLLOW_BRUSH Hollow brush. LTGRAY_BRUSH Light gray brush. NULL_BRUSH Null brush. WHITE_BRUSH White brush. BLA

26、CK_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

27、 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. SYSTEM_FIXED_FONT The fixed-width system font used in Windows prior to version 3.0. This object is available for compatibi

28、lity with earlier versions of Windows. DEFAULT_PALETTE Default color palette. This palette consists of the 20 static colors in the system palette. 这些对象留在 DC中是安全的,所以你可以利用选入库存对象来作为恢复 DC中 GUI对象。 大家可能都注意到了绘图时都需要一个 DC对象,DC(Device Context 设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使

29、用不同的设备环境就行了,而作图方式可以完全不变。这也就是 Windows耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出,而不需要对画进行任何调整。DC 的使用会穿插在本章中进行介绍。返回 首页2.2 在窗口中输出文字在这里我假定读者已经利用 ApplicationWizard生成了一个 SDI界面的程序代码。接下来的你只需要在 CView派生类的 OnDraw成员函数中加入绘图代码就可以了。在这里我需要解释一下 OnDraw函数的作用,OnDraw 函数会在窗口需要重绘时自动被调用,传入的参数CDC* pDC对应的就是 DC环境。使用 OnDraw的优点就在于在你使

30、用打印功能的时候传入OnDraw的 DC环境将会是打印机绘图环境,使用打印预览时传入的是一个称为 CPreviewDC的绘图环境,所以你只需要一份代码就可以完成窗口/打印预览/打印机绘图三重功能。利用 Windows的设备无关性和 M$为打印预览所编写的上千行代码你可以很容易的完成一个具有所见即所得的软件。输出文字一般使用 CDC:BOOL TextOut( int x, int y, const CString 创建一种固定颜色的刷子 BOOL CreateHatchBrush( int nIndex, COLORREF crColor ); 创建指定颜色和网格的刷子,nIndex 可取以下

31、值: HS_BDIAGONAL Downward hatch (left to right) at 45 degrees HS_CROSS Horizontal and vertical crosshatch HS_DIAGCROSS Crosshatch at 45 degrees HS_FDIAGONAL Upward hatch (left to right) at 45 degrees HS_HORIZONTAL Horizontal hatch HS_VERTICAL Vertical hatch BOOL CreatePatternBrush( CBitmap* pBitmap )

32、; 创建以 8*8位图为模板的刷子 在选择了画笔和刷子后就可以利用 Windows的作图函数进行作图了,基本的画线函数有以下几种 CDC:MoveTo( int x, int y ); 改变当前点的位置 CDC:LineTo( int x, int y ); 画一条由当前点到参数指定点的线 CDC:BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 画弧线 CDC:BOOL Polyline( LPPOINT lpPoints, int nCount ); 将多条线依次序连接 基本的作图函数有以下几种: CDC:BOOL Rectan

33、gle( LPCRECT lpRect ); 矩形 CDC:RoundRect( LPCRECT lpRect, POINT point ); 圆角矩形 CDC:Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight ); 3D边框 CDC:Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 扇形 CDC:Ellipse( LPCRECT lpRect ); 椭圆形 CDC:Pie( LPCRECT lpRect, POIN

34、T ptStart, POINT ptEnd ); CDC:Polygon( LPPOINT lpPoints, int nCount ); 多边形 对于矩形,圆形或类似的封闭曲线,系统会使用画笔绘制边缘,使用刷子填充内部。如果你不希望填充或是画出边缘,你可以选入空刷子(NULL_PEN)或是(NULL_BRUSH)空笔。 下面的代码创建一条两象素宽的实线并选入 DC。并进行简单的作图: .CPen pen;pen.CreatePen(PS_SOLID,2,RGB(128,128,128);CPen* pOldPen=(CPen*)dc.SelectObject(dc.SelectStockO

35、bject(NULL_BRUSH);/选入空刷子dc.Rectangle(CRect(0,0,20,20);/画矩形.返回 首页2.4 在窗口中绘制设备相关位图,图标,设备无关位图在 Windows中可以将预先准备好的图像复制到显示区域中,这种内存拷贝执行起来是非常快的。在 Windows中提供了两种使用图形拷贝的方法:通过设备相关位图(DDB)和设备无关位图(DIB)。DDB可以用 MFC中的 CBitmap来表示,而 DDB一般是存储在资源文件中,在加载时只需要通过资源 ID号就可以将图形装入。BOOL CBitmap:LoadBitmap( UINT nIDResource )可以装入指

36、定 DDB,但是在绘制时必须借助另一个和当前绘图 DC兼容的内存 DC来进行。通过CDC:BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop )绘制图形,同时指定光栅操作的类型。BitBlt 可以将源 DC中位图复制到目的 DC中,其中前四个参数为目的区域的坐标,接下来是源 DC指针,然后是源 DC中的起始坐标,由于 BitBlt为等比例复制,所以不需要再次指定长宽,(StretchBlt 可以进行缩放)最后一个参数为光栅操作的类型,可取以下值: BLACKNES

37、S 输出区域为黑色 Turns all output black. DSTINVERT 反色输出区域 Inverts the destination bitmap. MERGECOPY 在源和目的间使用 AND操作 Combines the pattern and the source bitmap using the Boolean AND operator. MERGEPAINT 在反色后的目的和源间使用 OR操作 Combines the inverted source bitmap with the destination bitmap using the Boolean OR ope

38、rator. NOTSRCCOPY 将反色后的源拷贝到目的区 Copies the inverted source bitmap to the destination. PATINVERT 源和目的间进行 XOR操作 Combines the destination bitmap with the pattern using the Boolean XOR operator. SRCAND 源和目的间进行 AND操作 Combines pixels of the destination and source bitmaps using the Boolean AND operator. SRC

39、COPY 复制源到目的区 Copies the source bitmap to the destination bitmap. SRCINVERT 源和目的间进行 XOR操作 Combines pixels of the destination and source bitmaps using the Boolean XOR operator. SRCPAINT 源和目的间进行 OR操作 Combines pixels of the destination and source bitmaps using the Boolean OR operator. WHITENESS 输出区域为白色

40、Turns all output white. 下面用代码演示这种方法: CYourView:OnDraw(CDC* pDC)CDC memDC;/定义一个兼容 DCmemDC.CreateCompatibleDC(pDC);/创建 DCCBitmap bmpDraw;bmpDraw.LoadBitmap(ID_BMP) ;/装入 DDBCBitmap* pbmpOld=memDC.SelectObject(/保存原有 DDB,并选入新 DDB入 DCpDC-BitBlt(0,0,20,20,/将源 DC中(0,0,20,20)复制到目的 DC(0,0,20,20)pDC-BitBlt(20,

41、20,40,40,/将源 DC中(0,0,20,20)和目的 DC(20,20,40,40)中区域进行 AND操作memDC.SelectObject(pbmpOld) ;/选入原 DDB(图标并不是一个 GDI对象,所以不需要选入 DC)在 MFC中没有一个专门的图标类,因为图标的操作比较简单,使用 HICON CWinApp:LoadIcon( UINT nIDResource )或是 HICON CWinApp:LoadStandardIcon( LPCTSTR lpszIconName ) 装入后就可以利用 BOOL CDC:DrawIcon( int x, int y, HICON

42、hIcon )绘制。由于在图标中可以指定透明区域,所以在某些需要使用非规则图形而且面积不大的时候使用图标会比较简单。下面给出简单的代码: OnDraw(CDC* pDC)HICON hIcon1=AfxGetApp()-LoadIcon(IDI_I1);HICON hIcon2=AfxGetApp()-LoadIcon(IDI_I2);pDC-DrawIcon(0,0,hIcon1);pDC-DrawIcon(0,40,hIcon2);DestroyIcon(hIcon1);DestroyIcon(hIcon2);同样在 MFC也没有提供一个 DIB的类,所以在使用 DIB位图时我们需要自己读

43、取位图文件中的头信息,并读入数据,并利用 API函数 StretchDIBits绘制。位图文件以BITMAPFILEHEADER结构开始,然后是 BITMAPINFOHEADER结构和调色版信息和数据,其实位图格式是图形格式中最简单的一种,而且也是 Windows可以理解的一种。我不详细讲解DIB位图的结构,提供一个 CDib类供大家使用,这个类包含了基本的功能如:Load,Save,Draw。 DownLoad CDib 4K返回首页2.5 使用各种映射方式所谓的映射方式简单点讲就是坐标的安排方式,系统默认的映射方式为 MM_TEXT即 X坐标向右增加,Y 坐标向下增加,(0,0)在屏幕左上

44、方,DC 中的每一点就是屏幕上的一个象素。也许你会认为这种方式下是最好理解的,但是一个点和象素对应的关系在屏幕上看来是正常的,但到了打印机上就会很不正常。因为我们作图是以点为单位并且打印机的分辨率远远比显示器高(800DPI 800 点每英寸)所以在打印机上图形看起来就会很小。这样就需要为打印另做一套代码而加大了工作量。如果每个点对应 0.1毫米那么在屏幕上的图形就会和打印出来的图形一样大小。通过 int CDC:SetMapMode( int nMapMode )可以指定映射方式,可用的有以下几种: MM_HIENGLISH 每点对应 0.001英寸 Each logical unit is

45、 converted to 0.001 inch. Positive x is to the right; positive y is up. MM_HIMETRIC 每点对应 0.001毫米 Each logical unit is converted to 0.01 millimeter. Positive x is to the right; positive y is up. MM_LOENGLISH 每点对应 0.01英寸 Each logical unit is converted to 0.01 inch. Positive x is to the right; positive

46、 y is up. MM_LOMETRIC 每点对应 0.001毫米 Each logical unit is converted to 0.1 millimeter. Positive x is to the right; positive y is up. MM_TEXT 象素对应 Each logical unit is converted to 1 device pixel. Positive x is to the right; positive y is down.以上几种映射默认的原点在屏幕左上方。除 MM_TEXT外都为 X坐标向右增加,Y 坐标向上增加,和自然坐标是一致的。所

47、以在作图是要注意什么时候应该使用负坐标。而且以上的映射都是 X-Y等比例的,即相同的长度在 X,Y 轴上显示的长度都是相同的。DownLoad Sample 另外的一种映射方式为 MM_ANISOTROPIC,这种方式可以规定不同的长宽比例。在设置这中映射方式后必须调用 CSize CDC:SetWindowExt( SIZE size )和 CSize CDC:SetViewportExt( SIZE size )来设定长宽比例。系统会根据两次设定的长宽的比值来确定长宽比例。下面给出一段代码比较映射前后的长宽比例: OnDraw(CDC* pDC)CRect rcC1(200,0,400,2

48、00);pDC-FillSolidRect(rcC1,RGB(0,0,255);pDC-SetMapMode(MM_ANISOTROPIC );CSize sizeO;sizeO=pDC-SetWindowExt(5,5);TRACE(“winExt %d %dn“,sizeO.cx,sizeO.cy);sizeO=pDC-SetViewportExt(5,10);TRACE(“ViewExt %d %dn“,sizeO.cx,sizeO.cy);CRect rcC(0,0,200,200);pDC-FillSolidRect(rcC,RGB(0,128,0);上面代码在映射后画出的图形将是一个长方形。DownLoad Sample 最后讲讲视原点(viewport origin),你可以通过调用 CPoint CDC:SetViewportOrg( POINT point )重新设置原点的位置,这就相对于对坐标进行了位移。例如你将原点设置在(20,20)那么原来的(0,0)就变成了(-20,-20)

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报