VC教程 计算机 中文.docx
1.1如何学好VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一点体会讲一下:1、需要有好的C/C+基础。正所谓“磨刀不误砍柴工”,最开始接触VC时不要急于开始WindOWS程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。更重要的是理解并能运用C+的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的朋友对C+一定要能熟练运用。2、理解WindoWS的消息机制,窗口句柄和其他GUl句柄的含义和用途。了解和MFC各个类功能相近的APl函数。3、一定要理解MFC中消息映射的作用。4、训练臼己在编写代码时不使用参考书而是使用HelpOnlineo5、记住一些常用的消息名称和参数的意义。6、学会看别人的代码。7、多看书,少买书,买书前一定要慎重。8、闲下来的时候就看参考书。9、多来我的主页。O后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。此外我将一些我在选择参考书时的原则:对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,在使用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。尽量买翻译的书,因为这些书一般都比较易懂,而且语言比较轻松。买书前一定要慎重如果买到不好用的书可能会对自己的学习枳极性产生打击。对于已经掌握了VC的朋友:这种程度的开发者应该加深自己对系统原理,技术要点的认识。需要选择一些对原理讲解的比较透彻的书籍,这样一来才会对新技术有更多的了解,最好书中对技术的应用有一定的阐述。尽量选择示范代码必较精简的书,可以节约银子。此外最好涉猎一些辅助性的书籍。01.2理解Windows消息机制WindoWS系统是一个消息驱动的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解。1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,1.PARAM)O当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM.COMMAND消息发送,WPARAM的高字中(HlWORD(WParam)是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPRoC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAlNT进行处理。3、未处理的消息到那里去了:乂$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用WindOWS的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二15、示例:下面有一段伪代码演示如何在窗口过程中处理消息1.ONGyourWndProc(HWNDhWndzUINTUMessageTyperWPARAMwPz1.PARAM)(switch(UMessageType)使用SWITCH语句将各种消息分开case(WM_PAINT):JOYOUrWindOW在窗口需要重新绘制时进行输出break;case(WM_1.BUTTONDOWN):doYourWork(.);在鼠标左键被按下时进行处理break;default:CalIDefaUltWndProc对于其它情况就让系统自己处理break;接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而招该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以WindOWS可以同时进行多个任务。下面的伪代码演示了消息循环的用法:while(1)(id=getMessage(.);if(id=quit)break;translateMessage(.);当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。图示消息投递模式在16位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。WindOWs3.X就是这种系统。而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。WindoWS95/NT就是这种系统。返回1.3 利用VisualC+/MFC开发Windows程序的优势MFC借助C+的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClaSSWiZard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。更令人兴奋的是利用C+的封装功能使开发者摆脱WindoWS中各种句柄的困扰,只需要面对C+中的对象,这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系统原理对开发很有帮助)正因为MFC是建立在C+的基础上,所以我强调CC+语言基础对开发的重要性。利用C+的封装性开发者可以更容易理解和操作各种窗口对象;利用C+的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码:利用虚拟性可以在必要时更好的控制窗口的活动。而且C+本身所具备的超越C语言的特性都可以使开发者编写出更易用,更灵活的代码。在MFC中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法:代码如下BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()/)AFX_MSG_MAPON_COMMAND(ID-FONT-DROPWNzDoNothing)END_MESSAGE_MAP()经通译后,代宿被替换为如下形式(这只是作讲解,实际情况比这复杂得多):/BEGIN_MESSAGE_MAP(CMainFramezCFrameWnd)CMainFrame:DewWndProc(.)(switch(.)/AFX_MSG_MAP(CMainFrame)/ON_WM_CREATE()case(WM_CREATE):OnCreatebreak;/)AFX-MSG-MAP/ON_COMMAND(ID_FONT_DROPDOWNZDoNothing)case(WM.COMMAND):if(HIWORD(wP)=ID_FONT_DROPDOWN)DoNothingbreak;/END_MESSAGE_MAP()newWndProc就是窗口过程只要走该类的实例生成的窗口都使用该窗口过程。所以了解了WindoWS的消息机制在加上对消息映射的理解就很容易了解MFC开发的基本思路了。返回1.4 利用MFC进行开发的通用方法介绍以卜是我在最初学习VC时所常用的开发思路和方法,希望能对初学VC的朋友有所帮助和启发。1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用CFiIe进行。3、开发注重交互并且文件读写复杂的的简单应用程序可以利用以CFOrmVieW为基础视的单文档视结构。4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。6、在要求在多个文档间传递数据时使用多文档视结构。7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。8、尽量避免使用多文档多视结构。9、不要使用多重继承并尽量减少一个类中封装过多的功能。返回MFC中常用类,宏,函数介绍常用类CRect:用来表示矩形的类,拥有四个成员变量:toPleftboItomright。分别表姥左上角和右下角的坐标。可以通过以下的方法构造: CRect(int/,intt,intr,intb);指明四个坐标 CRect(constRECT&srcRect);tlRECT结构构造 CRcct(1.PCRECTIpSrcRect);由RECT结构构造 CRect(PoINTPO加八SIZEsize);有左上角坐标和尺寸构造 CRcct(POINTtop1.eft,POINTbottomRight);有两点坐标构造下面介绍几个成员函数: intWidth()const;得到宽度 intHeight()const;得到高度 CSizeSize()const;得到尺寸 CPoint&Top1.eft();得到左上角坐标 CPoint&BoltomRight();得到右卜角坐标 CPointCenterPoint()const;得当中心坐标此外矩形可以和点(CPOint)相加进行位移,和另一个矩形相加得到“并”操作后的矩形。CPointt用来表示一个点的坐标,有两个成员变量:xy可以和另一个点相加。CString:用来表示可变长度的字符串。使用CString可不指明内存大小,CString会根据需要自行分配。下面介绍几个成员函数: GCI1.CngIh得到字符串长度 GetAt得到指定位置处的字符 operator+相当于strcat voidFormat(1.PCTSTRIpszFormat.);相当于sprintf Find查找指定字符,字符串 Compare比较 ComPareNoCaSe不区分大小写比较 MakeUpper改为小写 Make1.ower改为大写CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数: Add增加CString RemoveAt删除指定位置CSlring对象 RemoveAll删除数组中所有CString对象 GeIAt得到指定位置的CString对象 SetAt修改指定位置的CString对象 InsertAt在某一位置插入CString对象常用宏RGBTRACEASSERTVERIFY常用函数CWindApp*AfxGetAppO;HINSTANCEAfXGetlnStanCeHandle();HINSTANCEAfxGetResourceHandIeC);返回2.1和GUl有关的各种对象在WindoWS中有各种GUI对象(不要和C+对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。字体对象CFOnt用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。颜色和背景色不属于字体的属性。关于如何创建和使用字体在2.2在:窗口中输出文字中会详细讲解。刷了CBrUSh对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷丁来讲它的属性为颜色,是否采用网格和网格的类型如水平的,垂宜的,交叉的等。你也可以利用8*8的位图来创建一个自定义模板的刷F,在使用这种刷了填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在2.3使用刷了,笔进行绘图中会详细讲解。画笔CPCn对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。关于如何创建和使用画笔在2.3使用刷子,笔进行绘图中会详细讲解。位图CBilmaP对象可以包含一幅图像,可以保存在资源中。关于如何使用位图在2.4在窗口中绘制设备相关位图,图标,设备无关位图中会详细讲解。还有一种特殊的GUl时象是多边形,利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在2.6%边形和剪贴区域中会详细讲解。在WindoWS中使用GUl对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该GUl对象选入DC中,同时保存DC中原来的GUl时象。如果选入个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果诧存一个临时对象在DC中,而在临时对象被销毁后可能引起异常。有一点必须注意,每一个时象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法:OnDraw(CDC*pDC)(CPenpenlrpen2;penl.CreatePen(PS_S01.工D,2,RGB(128,128,128);/创建对象pen2.CreatePen(PS-S01.IDz2,RGB(128,128,0)”/创建对象CPen*pPen01d=(CPen*)pDC->SelectObject(&penl);选择对象进DCCirawWithPenl.(CPen*)pDC->SelectObject(&pen2);/选择对象进DCdrawWithPen2.penl.DeleteObject()/再次创建前先销毁penl.CreatePen(PS_SO1.ID,2,RGB(0,0,0);/再次创建对象(CPen*)pDC->SelectObject(&penl);/选择对象进DCCirawWithPenl.pDC->SelectObject(p01dPen);/恢复)此外系统中还拥有一些库存GUI对象,你可以利用CDC:SeleCtStOCkObjeCt(SeIeClStoCkobject(intnlndex)选入这些对象,它们包拈一些固定颜色的刷子,画笔和一些基本字体。 B1.ACK.BRUSHBlackbrush. DKGRAY_BRUSHDarkgraybrush. GRAY_BRUSHGraybrush. HO1.1.OW,BRUSHHollowbrush. 1.TGRAY_BRUSH1.ightgraybrush. NU1.1._BRUSHNullbrush. WHITE_BRUSHWhitebrush. B1.ACK_PENBlackpen. NU1.1._PENNullpen. WHITE_PENWhitepen. ANSI_FIXED_FONTANSIfixedsystemfont. ANSI-VAR-FONTANSIvariablesystemfont. DEVICE_DEFAU1.T_FONTDevice-dependentfont. OEM_FIXED_FONTOEM-dependentfixedfont. SYSTEM-FONTThesystemfont.Bydefault,Windowsusesthesystemfonttodrawmenus,dialog-boxcontrols,andothertext.InWindowsversions3.0andlater,thesystemfontisproportionalwidth;earlierversionsofWindowsuseafixed-widthsystemfont. SYSTEM_FIXED_FONTThefixed-widthsystemfontusedinWindowspriortoversion3.0.ThisobjectisavailableforcompatibilitywithearlierversionsofWindows. DEFAU1.T_PA1.ETTEDefaultcolorpalette.Thispalct(cconsistsofthe20staticcolorsinthesystempalette.这些对象留在DC中是安全的,所以你可以利用选入库存对象来作为恢复DC中GUI对象。大家可能都注意到了绘图时都需要一个DC对象,DC(DeViCeCOnteXl设备环境)对象处一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只得要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是WindoWS耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出,而不需要对画进行任何调整。DC的使用会穿插在本堂中进行介绍。返回2.2在窗口中输出文字在这里我假定读者已经利用ApplicationWizard生成了一个SDI界面的程序代码。接下来的你只需要在CView派生类的OnDraW成员函数中加入绘图代码就可以了。在这里我需要解释一下OnDraW函数的作用,OnDraW函数会在窗口需要重绘时自动被调用,传入的参数CDCl)T_CA1.CRECT计算指定文字时所需要矩形尺寸DCICnninCSthewidthandheightoftherectangle.Iftherearemultiplelinesoftext,DrawTextwillusethewidthoftherectanglepointedtobyIpRectandextendthebaseoftherectangletoboundthelastlineoftext.Ifthereisonlyonelineoftext,DrawTextwillmodifytherightsideoftherectanglesothatitboundsthelastcharacterintheline.Ineithercase,DrawTextreturnstheheightoftheformattedtext,butdoesnotdrawthetext.DT-CENTER中部对齐Centerstexthorizontally.DT_END_E1.1.IPSISorDT_PATH_E1.1.IPSISReplacespartofthegivenstringwithellipses,ifnecessary,sothattheresultfilsinthespecifiedrectangle.ThegivenstringisnotmodifiedunlesstheDT.MODIFYSTRINGflagisspecified.pDC对应的就是DC环境。使用OnDraW的优点就在于在你使用打印功能的时候传入OnDraW的DC环境将会是打印机绘图环境,使用打印预览时传入的是一个称为CpreVieWDC的绘图环境,所以你只需要一份代码就可以完成窗口/打印预览/打印机绘图三重功能。利用WindOWS的设备无关性和M$为打印预览所编写的上千行代码你可以很容易的完成一个具有所见即所得的软件。输出文字一般使用CDC:B001.Textut(intx.inty,constCString&str)和CDC:intDrawText(constCString<fcstr,1.PRECTIpRect,UINTnFormat)两个函数,对TeXgUt来讲只能输出单行的文字,而DrawText可以指定在一个矩形中输出单行或多行文字,并且可以规定对齐方式和使用何种风格。nFormat可以是多种以下标记的组合(利用位或操作)以达到选择输出风格的目的。 DT-BOTTOM底部对齐Specifiesbottom-justifiedtext.ThisvaluemustbecombinedwithDT_SING1.E1.INE.YoucanspecifyDT_END_E1.1.IPSIStoreplacecharactersattheendofthestring,orDT_P?TII_E1.1.IPSIStoreplacecharactersinthemiddleofthestring.Ifthestringcontainsbackslash()characters,DT_PATH_E1.1.IPSISpreservesasmuchaspossibleofthetextafterthelastbuckslash. DT_EXPANDTABSExpandstabcharacters.Thedefaultnumberofcharacterspertabiseight. DT_EXTERNA1.1.EADINGIncludesthefontflexternalleadinginthelineheight.Nonnally,externalleadingisnotincludedintheheightofalineoftext. DT_1.EFT左对齐Alignstextush-left. DT_MODIFYSTRINGModifiesthegivenstringtomatchthedisplayedtext.Thisflaghasnoeffectunless(heDT_END_E1.1.IPSISorDT_PATH_E1.IJPSISflagisspecified.NoteSomeuFonnatagcombinationscancausethepassedstringtobemodified.UsingDT,MODIFYSTRINGwitheitherDT_END_E1.1.IPSISorDT_PATH_E1.1.IPSISmaycausethestringtobemodified,causinganassertionintheCStringoverride. DT_NOC1.IPDrawswithoutclipping.DrawTextissomewhatfasterwhenI)T-NOC1.IPisused. DT_NOPREFIX禁止使用&前缀Turnsoffprocessingofprefixcharacter.Normally.DrawTextinterpretstheampersand(&)mnemonic-prefixcharacterasadirectivetounderscorethecharacterthatfollows,andtletwo-ampersand(&&)mnemonic-prefixcharactersasadirectivetoprintasingleampersand.ByspecifyingDT_NOPREFIX,thisprocessingisturnedoff. DT_PATH_E1.1.IPSIS DT_RIGHT右对齐Alignstextflush-right. DT_SING1.E1.INE单行输出Specifiessinglelineonly.Carriagereturnsandlinefeedsdonotbreaktheline. DT_TABSTOP设置TAB字符所占宽度Setstabstops.Thehigh-orderbyteofnFornutisthenumberofcharactersforeachtab.Thedefaultnumberofcharacterspertabiseight. )top定部对齐Specifiestop-justified(ext(singlelineonly). DT_VCENTER中部对齐Specifiesverticallycenteredtext(singlelineonly). DT_WORDBRE?K每行只在单词间被折行Specifiesword-breaking.1.inesareautomaticallybrokenbetweenwordsifawordwouldextendpasttheedgeoftherectanglespecifiedbyIpRect.Acarriagereturn托inefeedsequencewillalsobreaktheline.在输出文字时如果希望改变文字的颜色,你可以利用CDe:SetTeXICoIOr(CO1.oRREFCrCOIor)进行设置,如果你希望改变背景色就利用CDC:SetBkCoIOr(CO1.oRREFCrCOIor),很多时候你可能需要透明的背景色你可以利用CDC:SetBkMode(intnBkMode)设置,可接受的参数有,汨eihr字体高度(逻辑单位)等于零为缺省高度,否则取绝对值并和可用的字体高度进行匹配。nWidrh宽度(逻辑单位)如果为零则使用可用的横纵比进行匹配,nEscapement出口矢量与X轴间的角度nOriemation字体基线与X轴间的角度AWeig加字体粗细,可取以下值ConstantValueFW.DONTCARE0FW_THIN100FW.EXTRA1.IGHT200FW.U1.TRA1.IGHT200FW.1.IGHT300FW_NORMA1.400FW,REGU1.AR400FW_MEDIUM500FW_SEMIBO1.D600FW.DEMIBO1.D600FW_BO1.D700FW.EXTRABO1.D800FW-U1.TRABO1.D800FW_B1.ACK900Fwjieavy900bltalic是否为斜体bUnderline是否有下划线CStrikeOut是否带删除线,Q人如S”指定字符集合,可取以下值ConstantValueANSI.CHARSET0DEFAU1.T.CHARSET1symbol_charset2SHlFTJISCHARSET128OEM_CHARSET255nOutPrecision输出精度OUT_CHARACTER_PRECISOUT_STRING_PRECISOUT_DEFAU1.T_PRECISOUT_STROKE_PRECISOUT_DEVICE_PRECISOUT_TT_PRECISOUT_RASTER_PRECISnClipPrecision剪辑精度,可取以下值C1.IPCHARACTERPRECISC1.IPMASKC1.IP_DEFAU1.T_PRECISC1.IP_STROKE_PRECISC1.IP-ENCAPSU1.ATEC1.lPJrl'_A1.WAYSC1.IPJH_ANG1.ESnQuality输出质量,可取以下值 DEFAU1.T-QUA1.ITYAppearanceofthefontdoesnotmatter. DRAFT_QUA1.ITYAppearanceofthefontislessimportantthanwhenPROOF-QUA1.ITYisused.ForGDIrasterfonts,scalingisenabled.Bold,italic,underline,andstrikeoutfontsaresynthesizedifnecessary. PROOF-QUA1.ITYCharacterqualityofthefontismoreimportantthanexactmatchingofthelogical-fontallribu(cs.ForGDIrasterfonts,scalingisdisabledandthefontclosestinsizeischosen.Bold,italic,underline,andstrikeoutfontsaresynthesizedifnecessary.nPiichAndFamily字体间的间距psz尸指定字体名称,为了得到系统所拥有的字体可以利用EmunFontFamiliesExo(可以参考文章在同一系统中显示GB字符和BIG5字符)此外可以利用CFOnIDiak)g来得到用户选择的字体的1.oGFONT数据。最后我讲一下文本坐标的计算,利用CDC:GetTeXtEXIent(ConSICString&str何以得到字符串的在输出时所占用的宽度和高度,这样就可以在手工输出多行文字时使用正确的行距。另外如果需要更精确的对字体高度和宽度进行计算就需要使用CDe:GetTeXtMetrics(1.PTEXTMETRICIpMetrics)该函数将会填充TEXTMETRlC结构,该结构中的分量可以非常精确的描述字体的各种属性。12.3使用点,刷子,笔进行绘图在WindoWS中画点的方法很简单,只需要调用CO1.ORREFCDC:SCIPiXel(intX,inty,CO1.ORREFCrCOk>r)就可以在指定点画上指定颜色,同时返回原来的颜色。CO1.ORREFCDCnGetPixeKintx,inty)可以得到指定点的颜色。在WindoWS中应该少使用画点的函数,因为这样做的执行效率比较低。刷子和画笔在WindoWS作图中是使用最多的GUl对象,本节在讲解刷子和画笔使用方法的同时也讲述一写基本作图函数。在画点或画线时系统使用当前DC中的画笔,所以在创建画笔后必须将其选入DC才会在绘图时产生效果。画笔可以通过CPen对象来产生,通过调用CPCn:CrCaICPen(ininPcnStyle,intnWidh,CO1.ORREFelCoIOr)来创建。其中nPenStyle指名画笔的风格,可取如下值: PS_SO1.ID实线Createsasolidpen. PS_DASH虚线,宽度必须为一Createsadashedpen.ValidonlywhenthepenwidthisIorless,indeviceunits. PS_DOT点线,宽度必须为Createsadottedpen.Validonlywhenthepenwidthis1orless,indeviceunits. PS_DASHDOT点划线,宽度必须为一Createsapenwithalternatingdashesanddots.Validonlywhenthepenwidthis1orless,indeviceunits. PS_DASHDOTDOT双点戈J线,宽度必须为一Createsapenwithalternatingdashesanddoubledots.Validonlywhenthepenwidthis1orless,indeviceunits. PS_NU1.1.空线,使用时什么也不会产生Createsanullpen. PS_ENDCAP_ROUND结束处为圆形Endcapsareround. PS_ENDCAP_SQUARE结束处为方形Endcapsaresquare.Width和ClColor为线的宽度和颜色。刷子是在画封闭曲线时用来填充的颜色,例如当你画圆形或方形时系统会用当前的刷子对内部进行填充。刷子可利用CBrilSh对象产生。通过以下几种函数创建刷子: BOO1.CreateSolidBrush(CO1.ORREFCiColor);创建一种固定颜色的刷子 BOO1.CreateHatchBrush(intnlndex,CO1.ORREFcrColor);创建指定颜色和网格的刷子,nlndex可取以下值: HS-BDIAGON1.Downwardhatch(lefttoright)at45degrees HS-CROSSHorizontalandverticalcrosshatch HS_DIAGCROSSCrosshatchat45degrees HS-FDIAGONA1.Upwardhatch(lefttoright)at45degrees HS.HORIZONTA1.Horizontalhatch HS_VERTICA1.Verticalhatch BOO1.CrcatcPattemBrush(CBitmap*pBilmap);创建以8*8位图为模板的刷子在选择了画笔和刷子后就可以利用WindOWS的作图函数进行作图了,基本的画线函数有以卜几种 CDe:MoveTo(intx,inty);改变当前点的位置 CDC:1.ineTo(intx.inty);画一条由当前点到参数指定点的线 CDC:BOO1.Arc(1.PCRECTIpRecl,POINTplSiart,POINTptEnd);画弧线 CDC:BOO1.Polyline(1.PPOINTIpPoints.intnCount);将多条线依次序连接基本的作图函数有以下几种: CDC:BOO1.Rectangle(1.PCRECTIpRect);矩形 CDC二RoUndRCC1(1.PCRECTIpRcci,POINTpoint);圆角矩形 CDC:DraW3dRecl(intx,inty,intex,intcy,CO1.ORREFclrTop1.eft.CO1.ORREFClrBottomRight);3D边框 CDC:Chord(1.PCRECTIpRect.POINTptStart,POINTptEnd);扇形 CDC:EHiPSe(1.PCRECTIPRect);椭圆形 CDC:Pie(1.PCRECTIpRcct,POINTptStart,POINTptEnd); CDC:PoIygon(1.PPOINTIpPoints,intnCount);多边形对于矩形,圆形或类似的封闭曲线,系统会使用画笔绘制边缘,使用刷子填充内部。如果你不希望填充或是画出边缘,你可以选入空刷子(NU1.1._PEN)或是(NU1.1._BRUSH)空笔。下面的代码创建一条两