Useful Documents
intAfGMessageBoG(LPCTSTRlpszTeGt,UINTnType=MB_OA,UINTnIDHelp=0);用于弹出一个消息框 第二章图形输出
2.1和GUI有关的各种对象
在Windows中有各种GUI对象(不要和C++对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。
字体对象CFont用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。颜色和背景色不属于字体的属性。关于如何创建和使用字体在2.2 在窗口中输出文字中会详细讲解。
刷子CBrush对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格和网格的类型如水平的,垂直的,交叉的等。你也可以利用8G8的位图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在2.3 使用刷子,笔进行绘图中会详细讲解。
画笔CPen对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。关于如何创建和使用画笔在2.3 使用刷子,笔进行绘图中会详细讲解。
位图CBitmap对象可以包含一幅图像,可以保存在资源中。关于如何使用位图在2.4 在窗口中绘制设备相关位图,图标,设备无关位图中会详细讲解。
还有一种特殊的GUI对象是多边形,利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在2.6 多边形和剪贴区域中会详细讲解。
在Windows中使用GUI对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该GUI对象选入DC中,同时保存DC中原来的GUI对象。如果选入一个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在DC中,而在临时对象被销毁后可能引起异常。有一点必须注意,每一个对象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法:
Useful Documents
11
Useful Documents
OnDraw(CDCGpDC) { }
此外系统中还拥有一些库存GUI对象,你可以利用
CDC::SelectStocAObject(SelectStocAObject(intnIndeG)选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体。
? BLACA_BRUSHBlacAbrush. ? DAGRAY_BRUSHDarAgraybrush. ? GRAY_BRUSHGraybrush. ? HOLLOW_BRUSHHollowbrush. ? LTGRAY_BRUSHLightgraybrush. ? NULL_BRUSHNullbrush.
CPenpen1,pen2;
pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//创建对象 pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//创建对象
CPenGpPenOld=(CPenG)pDC->SelectObject(&pen1);//选择对象进DC drawWithPen1...
(CPenG)pDC->SelectObject(&pen2);//选择对象进DC drawWithPen2...
pen1.DeleteObject();//再次创建前先销毁
pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次创建对象 (CPenG)pDC->SelectObject(&pen1);//选择对象进DC drawWithPen1...
pDC->SelectObject(pOldPen);//恢复
Useful Documents
12
Useful Documents
? WHITE_BRUSHWhitebrush. ? BLACA_PENBlacApen. ? NULL_PENNullpen. ? WHITE_PENWhitepen.
? ANSI_FIGED_FONTANSIfiGedsystemfont. ? ANSI_VAR_FONTANSIvariablesystemfont. ? DEVICE_DEFAULT_FONTDevice-dependentfont. ? OEM_FIGED_FONTOEM-dependentfiGedfont.
? SYSTEM_FONTThesystemfont.Bydefault,Windowsusesthesystemfonttodrawmenus,di
alog-boGcontrols,andotherteGt.InWindowsversions3.0andlater,thesystemfontisproportionalwidth;earlierversionsofWindowsuseafiGed-widthsystemfont.
? SYSTEM_FIGED_FONTThefiGed-widthsystemfontusedinWindowspriortoversion3.0.Th
isobjectisavailableforcompatibilitywithearlierversionsofWindows.
? DEFAULT_PALETTEDefaultcolorpalette.Thispaletteconsistsofthe20staticcolorsinthesy
stempalette.
这些对象留在DC中是安全的,所以你可以利用选入库存对象来作为恢复DC中GUI对象。 大家可能都注意到了绘图时都需要一个DC对象,DC(DeviceConteGt设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是Windows耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出,而不需要对画进行任何调整。DC的使用会穿插在本章中进行介绍。 2.2在窗口中输出文字
在这里我假定读者已经利用ApplicationWizard生成了一个SDI界面的程序代码。接下来的你只需要在CView派生类的OnDraw成员函数中加入绘图代码就可以了。在这里我需要解释一下OnDraw
Useful Documents
13
Useful Documents
函数的作用,OnDraw函数会在窗口需要重绘时自动被调用,传入的参数CDCGpDC对应的就是DC环境。使用OnDraw的优点就在于在你使用打印功能的时候传入OnDraw的DC环境将会是打印机绘图环境,使用打印预览时传入的是一个称为CPreviewDC的绘图环境,所以你只需要一份代码就可以完成窗口/打印预览/打印机绘图三重功能。利用Windows的设备无关性和M$为打印预览所编写的上千行代码你可以很容易的完成一个具有所见即所得的软件。 输出文字一般使用CDC::BOOLTeGtOut(intG,inty,constCString&str)和
CDC::intDrawTeGt(constCString&str,LPRECTlpRect,UINTnFormat)两个函数,对TeGtOut来讲只能输出单行的文字,而DrawTeGt可以指定在一个矩形中输出单行或多行文字,并且可以规定对齐方式和使用何种风格。nFormat可以是多种以下标记的组合(利用位或操作)以达到选择输出风格的目的。
? DT_BOTTOM
底部对齐
Specifiesbottom-justifiedteGt.ThisvaluemustbecombinedwithDT_SINGLELINE.
? DT_CALCRECT
计算指定文字时所需要矩形尺寸
Determinesthewidthandheightoftherectangle.IftherearemultiplelinesofteGt,DrawTeGtwillusethewidthoftherectanglepointedtobylpRectandeGtendthebaseoftherectangletoboundthelastlineofteGt.IfthereisonlyonelineofteGt,DrawTeGtwillmodifytherightsideoftherectanglesothatitboundsthelastcharacterintheline.Ineithercase,DrawTeGtreturnstheheightoftheformattedteGt,butdoesnotdrawtheteGt.
? DT_CENTER
中部对齐CentersteGthorizontally.
? DT_END_ELLIPSISorDT_PATH_ELLIPSISReplacespartofthegivenstringwithellipses,ifne
cessary,sothattheresultfitsinthespecifiedrectangle.ThegivenstringisnotmodifiedunlesstheDT_MODIFYSTRINGflagisspecified.
YoucanspecifyDT_END_ELLIPSIStoreplacecharactersattheendofthestring,orDT_PATH_ELLIPSIStoreplacecharactersinthemiddleofthestring.IfthestringcontainsbacAslash(
Useful Documents
14
Useful Documents
\\)characters,DT_PATH_ELLIPSISpreservesasmuchaspossibleoftheteGtafterthelastbacAslash.
? DT_EGPANDTABSEGpandstabcharacters.Thedefaultnumberofcharacterspertabiseight
.
? DT_EGTERNALLEADINGIncludesthefont抯
eGternalleadinginthelineheight.Normally,eGternalleadingisnotincludedintheheightofalineofteGt.
? DT_LEFT
左对齐AlignsteGtflush-left.
? DT_MODIFYSTRINGModifiesthegivenstringtomatchthedisplayedteGt.Thisflaghasnoef
fectunlesstheDT_END_ELLIPSISorDT_PATH_ELLIPSISflagisspecified.
NoteSomeuFormatflagcombinationscancausethepassedstringtobemodified.UsingDT_MODIFYSTRINGwitheitherDT_END_ELLIPSISorDT_PATH_ELLIPSISmaycausethestringtobemodified,causinganassertionintheCStringoverride.
? DT_NOCLIPDrawswithoutclipping.DrawTeGtissomewhatfasterwhenDT_NOCLIPisuse
d.
? DT_NOPREFIG
禁止使用&前缀
TurnsoffprocessingofprefiGcharacters.Normally,DrawTeGtinterpretstheampersand(&)mnemonic-prefiGcharacterasadirectivetounderscorethecharacterthatfollows,andthetwo-ampersand(&&)mnemonic-prefiGcharactersasadirectivetoprintasingleampersand.ByspecifyingDT_NOPREFIG,thisprocessingisturnedoff.
? DT_PATH_ELLIPSIS ? DT_RIGHT
右对齐AlignsteGtflush-right.
单行输出
? DT_SINGLELINE
Specifiessinglelineonly.CarriagereturnsandlinefeedsdonotbreaAtheline.
Useful Documents
15