《C++MFC入门教程.pdf》由会员分享,可在线阅读,更多相关《C++MFC入门教程.pdf(84页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 一 章 VC入门.21.1 如何学好VC.21.2 理解 Windows消息机制.31.3 利用Visual C+/MFC开发Windows程序的优势.51.4 利用M FC进行开发的通用方法介绍.6第二章图形输出.92.1 和 GUI有关的各种对象.92.2 在窗口中输出文字.112.3 使用点,刷子,笔进行绘图.162.4 在窗口中绘制设备相关位图,图标,设备无关位图.182.5 使用各种映射方式.20第三章文档视结构.233.1 文档视图框架窗口间的关系和消息传送规律.233.2 接收用户输入.243.3 使用菜单.273.4 文档,视,框架之间相互作用.313.5 利用序列化进行文
2、件读写.323.6 M FC中所提供的各种视类介绍.35第四章窗口控件.354.1 Button.354.2 S tatic Box.374.3 Edit“384.4 Scroll Bar.384.5 L ist Box/Check List Box.394.6 Combo Box.404.7 Tree C trl.424.8 L ist C trl.454.9 Tab C trl.484.A Tool Bar.494.B Status Bar.504.C Dialog Bar.514.D 利用 AppWizard 创建并使用 ToolBar StatusBar Dialog Bar.514.
3、E General ffindow.554.F 关于 WM_NOTIFY的使用方法.57第五章对话框.585.1 使用资源编辑器编辑对话框.585.2 创建有模式对话框.595.3 创建无模式对话框.615.4 在对话框中进行消息映射.655.5 在对话框中进行数据交换和数据检查.675.6 使用属性对话框.705.7 使用通用对话框.735.8 建立以对话框为基础的应用.745.9 使用对话框作为子窗口.75第六章网络通信开发.776.1 ffinSock 介绍.776.2 利用WinSock进行无连接的通信.806.3 利用WinSock进行有连接的通信.82第 一 章VC入门1.1 如何
4、学好VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一点体会讲一下:1、需要有好的C/C+基础。正所谓“磨刀不误砍柴工”,最开始接触VC时不要急于开始Windows程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。更重要的是理解并能运用C+的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的朋友对C+一定要能熟练运用。2、理解Windows的消息机制,窗口句柄和其他GUI
5、句柄的含义和用途。了解和MFC各个类功能相近的API函数。3、一定要理解MFC中消息映射的作用。4、训练自己在编写代码时不使用参考书而是使用Help Online。5、记住一些常用的消息名称和参数的意义。6、学会看别人的代码。7、多看书,少买书,买书前一定要慎重。8、闲下来的时候就看参考书。后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。此外我将一些我在选择参考书时的原则:对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,在使用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。尽量买翻译的书,因为这些书一般都比较易懂,而且语言比
6、较轻松。买书前一定要慎重如果买到不好用的书可能会对自己的学习积极性产生打击。对于已经掌握了 V C的朋友:这种程度的开发者应该加深自己对系统原理,技术要点的认识。需要选择一些对原理讲解的比较透彻的书籍,这样一来才会对新技术有更多的了解,最好书中对技术的应用有一定的阐述。尽量选择示范代码必较精简的书,可以节约银子。此外最好涉猎一些辅助性的书籍。1.2 理解W i n d o w s 消息机制W indows系统是一个消息驱动的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的儿个方面讲解一下,希望大家看了后有一点了解。1、消息的组成:一个消息由一个消息名称(U IN
7、T),和两个参数(W PAR AM,L PAR AM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有叫L COMMAND消息发送,W PAR AM的高字中(HIW OR D(wParam)是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。2、谁将收到消息:一 个 消息必须由一个窗口接收。在窗口的过程(W NDPR OC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对 W MCOMMAND进行处理的代码,如果希望在窗口中进行图形输出就必
8、须对W M_PAINT 进行处理。3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用W indows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口 上按下鼠标时消息就会通过窗口
9、一的句柄被发送到窗口一而不是窗口-O5、示例:下面有一段伪代码演示如何在窗口过程中处理消息L O N G yo urW n dP ro c(H W N D h W n d,U I N T uM e ssa g e T yp e,W P A R A M vP,L P A R A M)swi tch(uM e ssa g e T yp e)使用S W I T C H 语句将各种消息分开ca se(W M _ P A I N T):do Y o urW i n do w(.);在窗口需要重新绘制时进行输出b re a k;ca se(W M _ L B U T T O N D O W N):do Y
10、 o urW o rk(.);在鼠标左键被按下时进行处理b re a k;de f a ul t:ca l I D e f a ul tW n dP ro c(.);对于其它情况就让系统自己处理b re a k;)接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每 条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以W i n do ws可以同时进行多个任务。下面的
11、伪代码演示了消息循环的用法:wh i l e (1)i d=g e tM e ssa g e (.);i f(i d=qui t)b re a k;tra n sl a te M e ssa g e(.);)当该程序没有消息通知时g e tM e ssa g e 就不会返回,也就不会占用系统的C P U 时间。下图为消息投递模式消 息 1消 息 2消 息 3在 1 6 位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。W i n do ws3.X
12、就是这种系统。而 3 2 位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。W i n d o w s 9 5/N T 就是这种系统。1.3利用V i s u a l C+/M F C 开发W i n d o w s 程序的优势M F C 借助C+的优势为W i n d o w s 开发开辟了一片新天地,同时也借助A p p l i c a t i o n W i z z a r d使开发者摆脱离了那些每次都必写基本代码,借助C l a s s W i z a r d 和消息映射使
13、开发者摆脱了定义消息处理时那种混乱和冗长的代码段。更令人兴奋的是利用C+的封装功能使开发者摆脱 W i n d o w s 中各种句柄的困扰,只需要面对C+中的对象,这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系统原理对开发很有帮助)正因为M F C 是建立在C+的基础上,所以我强调C/C+语言基础对开发的重要性。利用C+的封装性开发者可以更容易理解和操作各种窗口对象;利用C+的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码;利用虚拟性可以在必要时更好的控制窗口的活动。而且C+本身所具备的超越C语言的特性都可以使开发者编写出更易用,更灵活的代码。在 M F C 中对
14、消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法:代码如下BEGIN_MES S AGE_MAP(CMainFrame,CFrameWnd)/AFX_MS G_MAP(CMainFrame)ON_WMCREATE()/AFX_MS G_MAPON_COMMAND(ID_FONT_DROPDOWN,DoNothing)END_MES S AGE_MAP()经在编译后,代码被替换为如下形式(这只是作讲解,实际情况比这复杂得多):/BEGIN_MES S AGE_MAP(CMainFrame,CFrameWnd
15、)CMainFrame:newWndProc(.)switch(.)(/AFX_MS G_MAP(CMainFrame)/ON_WM_CREATE()case(WM_CREATE):OnCreate(.);break;/AFX_MS G_MAP/ON_COMMAND(ID_FONT_DROPDOWN,DoNothing)case(WM一COMMAND):if(HIWORD(wP)=ID_FONT_DROPDOWN)(DoNothing(.);)break;/END_MES S AGE_MAP()newWndProc就是窗口过程只要是该类的实例生成的窗口都使用该窗口过程。所以了解了 Window
16、s的消息机制在加上对消息映射的理解就很容易了解MFC开发的基本思路了。1.4 利用MFC进行开发的通用方法介绍以下是我在最初学习VC时所常用的开发思路和方法,希望能对初学VC的朋友有所帮助和启发。1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用 C F i l e 进行。3,开发注重交互并且文件读写复杂的的简单应用程序可以利用以C F or m V i e w 为基础视的单文档视结构。4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。5、在对多文档要求不强烈时尽量避免多文档视
17、结构,可以利用分隔条产生单文档多视结构。6、在要求在多个文档间传递数据时使用多文档视结构。7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。8、尽量避免使用多文档多视结构。9、不要使用多重继承并尽量减少一个类中封装过多的功能。1.5 M F C 中常用类,宏,函数介绍常用类C R e c t:用来表示矩形的类,拥有四个成员变量:t op l e f t b ot t om r i g h t。分别表是左上角和右下角的坐标。可以通过以下的方法构造:C R e c t(i n t 1,i n t t,i n t r,i n t b );指明四个坐标C R e c t (c on
18、 s t R E C T&s r c R e c t );由 R E C T 结构构造C R e c t (L P C R E C T IpS r c R e c t );由 R E C T 结构构造C R e c t(P O IN T poi n t,S IZE s i ze );有左上角坐标和尺寸构造C R e c t(P O IN T t opL e f t,P O IN T b ot t om R i g h t );有两点坐标构造下面介绍几个成员函数:i n t W i d t h()c on s t;得到宽度i n t H e i g h t()c on s t;得到高度C S i
19、 ze S i ze()c on s t;得到尺寸C P oi n t&T opL e f t();得到左上角坐标C P oi n t&B ot t om R i g h t();得到右下角坐标C P oi n t C e n t e r P oi n t ()c on s t;得当中心坐标此外矩形可以和点(C P oi n t)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。C P oi n t:用来表示一个点的坐标,有两个成员变量:x y0可以和另一个点相加。C S t r i n g:用来表示可变长度的字符串。使用C S t r i n g 可不指明内存大小,C S t r i n
20、 g 会根据需要自行分配。下面介绍几个成员函数:G e t L e n g t h 得到字符串长度G e t A t 得到指定位置处的字符ope r a t or +相当于 s t r c a tv oi d F or m a t (L P C T S T R Ips zF or m a t,.);相当于 s pr i n t fF i n d 查找指定字符,字符串C om pa r e 比较C om pa r e N oC a s e 不区分大小写比较M a k e U ppe r 改为小写M a k e L ow e r 改为大写C S t r i n g A r r a y:用来表示可变
21、长度的字符串数组。数组中每一个元素为C S t r i n g 对象的实例。下面介绍几个成员函数:A d d 增加 C S t r i n gR e m ov e A t 删除指定位置C S t r i n g 对象R e m ov e A l l 删除数组中所有C S t r i n g 对象G e t A t 得到指定位置的C S t r i n g 对象S e t A t 修改指定位置的C S t r i n g 对象In s e r t A t 在某一位置插入C S t r i n g 对象常用宏R G BT R A C EA S S E R TV E R IF Y常用函数C W i
22、n d A pp*A f x G e t A pp 0;H IN S T A N C E A f x G e t l n s t a n c e l l a n d l e();1IIN S T A N C E A f x G e t R e s ou r c e H a n d l e();i n t A f x M e s s a g e B ox(L P C T S T R Ips zT e x t,U IN T n T ype =M B _ O K,U I N T n I D H e l p =0 );用于弹出一个消息框第二章图形输出2.1 和 GUI有关的各种对象在 W i n d
23、o w s中有各种G U I 对象(不要和C+对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种G U I 对象和拥有的属性。字体对象C F o n t用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。颜色和背景色不属于字体的属性。关于如何创建和使用字体在2.2 在窗口中输出文字中会详细讲解。刷子C B r u sh 对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格和网格的类型如水平的,垂直的,交叉的等。你也可以利用8*8的位图来创建一个自定义模板的刷子,在
24、使用这种刷子填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在2.3 使用刷子,笔进行绘图中会详细讲解。画笔C Pe n 对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。关于如何创建和使用画笔在2.3 使用刷子,笔进行绘图中会详细讲解。位图C B i tm a p 对象可以包含一幅图像,可以保存在资源中。关于如何使用位图在区U 3口中绘制设备相关位图,图标,设备无关位图中会详细讲解。还有一种特殊的G U I 对象是多边形,利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在2.6 多边形和剪贴区域中会详细讲解。在 W i n d
25、 o w s中使用G U I 对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该G U I 对象选入D C 中,同时保存D C 中原来的G U I 对象。如果选入个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在D C 中,而在临时对象被销毁后可能引起异常。有一点必须注意,每个对象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法:O n D r a w(C D C*p D C)(C Pe n p e n l,p e n 2;p e n l.C r e a te Pe n(PS _ S O L I D,2
26、,R G B (1 28,1 28,1 28);创建对象p e n 2.C r e a te Pe n(PS _ S O L I D,2,R G B(1 28,1 28,0);创建对象C Pe n*p Pe n 0 1 d=(C Pe n*)p D C-S e l e c t O bj ect (&p en l);选择对象进 D Cdr aw W i t h P en l.(C P en*)p D C-S el ect O bj ect (&p en 2);选择对象进 D Cdr aw W i t h P en 2.p en l.D el et eO bj ect ();再次创建前先销毁p e
27、n l.C r eat eP en (P S _S O L I D,2,R G B(O,0,0);再次创建对象(C P en*)p D C-S el ect O bj ect (&p en l);选择对象进 D Cdr aw W i t h P en l.p D C-S el ect O bj ect (p O l dP en);恢复)此外系统中还拥有一些库存GUI对象,你可以利用CDC:S electS tockObject(S electS tockObject(int nlndex)选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体。BL ACK_BR U S H Black
28、brush.DKGR AY_BR U S H Dark gray brush.GR AY_BR U S H Gray brush.HOL L OW _BR U S H Hollow brush.L T GR AY_BR U S H Light gray brush.NU L L _BR U S H Null brush.W HIT E_BR U S H White brush.BL ACK_PEN Black pen.NU L L _PEN Null pen.W HIT E_PEN White pen.ANS I_FIXED_FONT ANS I fixed system font.ANS I
29、_V AR _F0NT ANS I variable system font.DEV ICE_DEFAU L T _FONT Device-dependent font.0EM_FIXED_F0NT OEM-dependent fixed font.S YS T EM_FONT The system font.By default,Windows uses the system font todraw menus,dialog-box controls,and other text.In Windows versions 3.0 andlater,the system font is prop
30、ortional width;earlier versions of Windowsuse a fixed-width system font.S YS T EM_FIXED_FONT T h e fi x ed-w i dt h s y s t em fo n t u s ed i n W i n do w s p r i o r t ov er s i o n 3.0.T h i s o bj ect i s av ai l abl e fo r co m p at i bi l i t y w i t h ear l i er v er s i o n so f W i n do w s
31、.DEFAU L T _PAL ET T E D efau l t co l o r p al et t e.T h i s p al et t e co n s i s t s o f t h e 20s t at i c co l o r s i n t h e s y s t em p al et t e.这些对象留在D C 中是安全的,所以你可以利用选入库存对象来作为恢夏D C 中G U I 对象。大家可能都注意到了绘图时都需要一个D C 对象,D C (D ev i ce C o n t ex t 设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境
32、是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是W i n do w s 耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出,而不需要对画进行任何调整。D C 的使用会穿插在本章中进行介绍。2.2在窗口中输出文字在这里我假定读者己经利用A p p l i cat i o n w i z ar d生成了一个S D I 界面的程序代码。接下来的你只需要在C V i ew 派生类的O n D r aw 成员函数中加入绘图代码就可以了。在这里我需要解释一下O n D r aw 函数的作用,O n D r aw 函数会在窗口
33、需要重绘时自动被调用,传入的参数C D C*p D C对应的就是D C 环境。使用O n D r aw 的优点就在于在你使用打印功能的时候传入O n D r aw 的 D C环境将会是打印机绘图环境,使用打印预览时传入的是一个称为C P r ev i ew D C 的绘图环境,所以你只需要一份代码就可以完成窗口/打印预览/打印机绘图三重功能。利用W i n do w s 的设备无关性和M$为打印预览所编写的上千行代码你可以很容易的完成一个具有所见即所得的软件。输出文字一般使用 C D C:B O O L T ex t O u t (i n t x,i n t y,co n s t C S t
34、r i n g ft s t r )(1 C D C:i n tD r aw T ex t (co n s t C S t r i n g fe s t r,L P R E C T I p R ect,U I N T n F o r m at )两个函数,对 T ex t O u t来讲只能输出单行的文字,而 D r aw T ex t 可以指定在一个矩形中输出单行或多行文字,并且可以规定对齐方式和使用何种风格。n F o r m a t 可以是多种以下标记的组合(利用位或操作)以达到选择输出风格的目的。DT _BOT T OM 底部对齐 Sp e ci f i e s bo t t o m-
35、ju s t i f i e d t e x t.Th i s v a l u e m u s t beco m bi n e d w i t h DT _S INGL EL INE.DT _CAL CR ECT 计算指定文字时所需要矩形尺寸 D e t e r m i n e s t h e w i dt h a n d h e i gh to f t h e r e ct a n gl e.I f t h e r e a r e m u l t i p l e 1 i n e s o f t e x t,DrawT ext w i l l u s e t h ew i dt h o f t
36、 h e r e ct a n gl e p o i n t e d t o by IpRect a n d e x t e n d t h e ba s e o f t h er e ct a n gl e t o bo u n d t h e l a s t l i n e o f t e x t.I f t h e r e i s o n l y o n e l i n e o f t e x t,DrawT ext w i l l m o di f y t h e r i gh t s i de o f t h e r e ct a n gl e s o t h a t i t bo
37、u n ds t h el a s t ch a r a ct e r i n t h e l i n e.I n e i t h e r ca s e,DrawText r e t u r n s t h e h e i gh t o ft h e f o r m a t t e d t e x t,bu t do e s n o t dr a w t h e t e x t.DT_CENTER 中部对齐 C e n t e r s t e x t h o r i z o n t a l l y.DT_END_ELLIPSIS o r DT_PATH_ELLIPSIS Re p l a ce
38、 s p a r t o f t h e gi v e n s t r i n gw i t h e l l i p s e s,i f n e ce s s a r y,s o t h a t t h e r e s u l t f i t s i n t h e s p e ci f i e dr e ct a n gl e.Th e gi v e n s t r i n g i s n o t m o d i f i e d u n l e s s t h e DT_MODIFYSTRING f l a gi s s p e ci f i e d.Yo u ca n s p e ci f
39、 y DT_END_ELLIPSIS t o r e p l a ce ch a r a ct e r s a t t h e e n d o f t h e s t r i n g,o r DT_PATH_ELLIPSIS t o r e p l a ce ch a r a ct e r s i n t h e m i ddl e o f t h e s t r i n g.I ft h e s t r i n g co n t a i n s ba ck s l a s h ()ch a r a ct e r s,DT_PATH_ELL IPS IS p r e s e r v e s a
40、 sm u ch a s p o s s i bl e o f t h e t e x t a f t e r t h e l a s t ba ck s l a s h.DT_EXPANDTABS E x p a n ds t a b ch a r a ct e r s.Th e de f a u l t n u m be r o f ch a r a ct e r s p e rt a b i s e i gh t.DT_EXTERNALLEADING I n cl u de s t h e f o n t J Q e x t e r n a l l e a di n g i n t h
41、e l i n eh e i gh t.N o r m a l l y,e x t e r n a l l e a di n g i s n o t i n cl u de d i n t h e h e i gh t o f a l i n eo f t e x t.DT_LEFT 左对齐 Al i gn s t e x t f l u s h-l e f t.DT_MODIFYSTRING M o di f i e s t h e gi v e n s t r i n g t o m a t ch t h e di s p l a y e d t e x t.Th i s f l a g
42、h a s n o e f f e ct u n l e s s t h e DT_END_ELLIPSIS o r DT_PATH_ELLIPSIS f l a gi s s p e ci f i e d.Note So m e uFormat f l a g co m bi n a t i o n s ca n ca u s e t h e p a s s e d s t r i n g t o be m o di f i e d.Us i n g DT_MODIFYSTRING w i t h e i t h e r DT_END_ELLIPSIS o r DT_PATH_ELLIPSI
43、S m a yca u s e t h e s t r i n g t o be m o di f i e d,ca u s i n g a n a s s e r t i o n i n t h e CString o v e r r i de.DT_N0CLIP D r a w s w i t h o u t cl i p p i n g.DrawText i s s o m e w h a t f a s t e r w h e nDT_N0CLIP i s u s e d.DT_NOPREFIX 禁止使用&前缀 Tu r n s o f f p r o ce s s i n g o f
44、 p r e f i x ch a r a ct e r s.N o r m a l l y,DrawText i n t e r p r e t s t h e a m p e r s a n d(&)m n e m o n i c-p r e f i x ch a r a ct e ra s a di r e ct i v e t o u n de r s co r e t h e ch a r a ct e r t h a t f o l l o w s,a n d t h et w o-a m p e r s a n d(&)m n e m o n i c-p r e f i x ch
45、 a r a ct e r s a s a di r e ct i v e t o p r i n t as i n gl e a m p e r s a n d.By s p e ci f y i n g DT_NOPREFIX,t h i s p r o ce s s i n g i s t u r n e d o f f.DT_PATH_ELLIPSISDT_RIGHT 右对齐 Al i gn s t e x t f l u s h-r i gh t.DT _S INGL EL INE 单行输出 Sp e ci f i e s s i n gl e l i n e o n l y.C a
46、 r r i a ge r e t u r n s a n dl i n e f e e ds do n o t br e a k t h e l i n e.DT _T ABS T OP 设置 TAB 字符所占宽度 Se t s t a b s t o p s.Th e h i gh-o r de r by t e o fnFormat i s t h e n u m be r o f ch a r a ct e r s f o r e a ch t a b.Th e de f a u l t n u m be r o fch a r a ct e r s p e r t a b i s e
47、 i gh t.DT _T 0P 定部对齐 Sp e ci f i e s t o p-ju s t i f i e d t e x t (s i n gl e l i n e o n l y).DT _V CENT ER 中部对齐 Sp e ci f i e s v e r t i ca l l y ce n t e r e d t e x t (s i n gl e l i n eo n l y).DT _W OR DBR EAK 每行只在单词间被折行 Sp e ci f i e s w o r d-br e a k i n g.L i n e s a r ea u t o m a t i
48、 ca l l y br o k e n be t w e e n w o r ds i f a w o r d w o u l d e x t e n d p a s t t h e e dge o ft h e r e ct a n gl e s p e ci f i e d by IpRect.A ca r r i a ge r e t u r n 托 i n e f e e d s e q u e n ce w i l la l s o br e a k t h e l i n e.在输出文字时如果希望改变文字的颜色,你可以利用C D C:Se t Te x t C o l o r(C
49、 O L O RRE Fcr C o l o r )进行设置,如果你希望改变背景色就利用C D C:Se t Bk C o l o r(C O L O RRE F cr C o l o r ),很多时候你可能需要透明的背景色你可以利用C D C:Se t Bk M o de(i n t n Bk M o de )设置,可接受的参数有 OPAQ U E Ba ck gr o u n d i s f i l l e d w i t h t h e cu r r e n t ba ck gr o u n d co l o r be f o r e t h et e x t,h a t ch e d
50、br u s h,o r p e n i s dr a w n.Th i s i s t h e de f a u l t ba ck gr o u n d m o de.T R ANS PAR ENT Ba ck gr o u n d i s n o t ch a n ge d be f o r e dr a w i n g.接下来讲讲如何创建字体,你可以创建的字体有两种:库存字体C D C:C r e a t e St o ck O bje ct(i n t n l n de x )和自定义字体。在创建非库存字体时需要填充一个L O G F O N T结构并使用C F o n t:C r