下载
加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 vc++

vc++.doc

vc++

王凯
2011-05-23 0人阅读 举报 0 0 暂无简介

简介:本文档为《vc++doc》,可适用于高等教育领域

没什么技术含量,就是对vc的一个基本认识知道怎么从对话框取值图片:一个基于对话框的MFC程序有两个输入框:IDCEDIT和IDCEDIT一个按钮:IDCBUTTON一个Label:IDCLabel然后给按钮添加一个事件:voidCCalDlg::OnButtonClicked()事件的代码voidCCalDlg::OnButtonClicked(){CStringstr,str保存取到的字符charstrResult保存结果字符intnum,num保存转换的整数GetDlgItem(IDCEDIT)>GetWindowText(str)取得Edit文本num=atoi(str)字符串转为整数GetDlgItem(IDCEDIT)>GetWindowText(str)num=atoi(str)num=numnumitoa(num,strResult,)整数转为字符串SetDlgItemText(IDCLabel,strResult)显示结果}相关知识:如何取得对话框中的文本两种方法:intGetDlgItemText(intnID,控件IDLPTSTRlpStr,字符串数组intnMaxCount最大的字符数)const在一个窗口控件中读取文本到字符数组中注意:它的返回值是字符串长度GetDlgItem(IDCEDIT)>GetWindowText(Cstring)如何把字符串转换为整数,整数转为字符串•字符串转整数intatoi(constchar*string)把一个字符串转为INT类型的数值•整数转字符串char*itoa(intvalue,要换的数值char*string,转换成的字符串intradix数值的进制)把一个数值转换成字符串,一步到位,直接取输入的数字:•UINTGetDlgItemInt(intnID,控件IDBOOL*lpTrans=,控件文本是否有非数字字符,当设为时,不进行报错BOOLbSigned=TRUE)是否为有符号数值const获得控件文本,并转换成数值类型•voidSetDlgItemInt(intnID,控件IDUINTnValue,数值BOOLbSigned=TRUE是否为有符号数值)把一个数值设置成控件文本•精简后的代码intnum,numnum=GetDlgItemInt(IDCEDIT,,true)num=GetDlgItemInt(IDCEDIT,,true)SetDlgItemInt(IDCLabel,numnum,true)本文来自CSDN博客转载请标明出处:http:blogcsdnnetgreenerycnarchiveaspxVCMFC如何入门(转载)C语言::阅读评论  字号:大中小 订阅 VC开发指南如何学好VC  这个问题很多朋友都问过我当然流汗是必须的但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难为了帮助朋友们更快的掌握VC开发下面我将自己的一点体会讲一下:  、需要有好的CC基础。正所谓“磨刀不误砍柴工”最开始接触VC时不要急于开始Windows程序开发而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语言的熟悉程度同时也训练自己的思维和熟悉一些在编程中常犯的错误。更重要的是理解并能运用C的各种特性这些在以后的开发中都会有很大的帮助特别是利用MFC进行开发的朋友对C一定要能熟练运用。   、理解Windows的消息机制窗口句柄和其他GUI句柄的含义和用途。了解和MFC各个类功能相近的API函数。  、一定要理解MFC中消息映射的作用。  、训练自己在编写代码时不使用参考书而是使用HelpOnline。  、记住一些常用的消息名称和参数的意义。  、学会看别人的代码。  、多看书少买书买书前一定要慎重。  、闲下来的时候就看参考书。  此外我将一些我在选择参考书时的原则:  对于初学者:应该选择一些内容比较全面的书籍并且书籍中的内容应该以合理的方式安排在使用该书时可以达到循序渐进的效果书中的代码要有详细的讲解。尽量买翻译的书因为这些书一般都比较易懂而且语言比较轻松。买书前一定要慎重如果买到不好用的书可能会对自己的学习积极性产生打击。  对于已经掌握了VC的朋友:这种程度的开发者应该加深自己对系统原理技术要点的认识。需要选择一些对原理讲解的比较透彻的书籍这样一来才会对新技术有更多的了解最好书中对技术的应用有一定的阐述。尽量选择示范代码必较精简的书可以节约银子。  此外最好涉猎一些辅助性的书籍。理解Windows消息机制Windows系统是一个消息驱动的OS什么是消息呢?我很难说得清楚也很难下一个定义(谁在嘘我)我下面从不同的几个方面讲解一下希望大家看了后有一点了解。 、消息的组成:一个消息由一个消息名称(UINT)和两个参数(WPARAMLPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WMCOMMAND消息发送WPARAM的高字中(HIWORD(wParam))是命令的ID号对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称也可以利用自定义消息来发送通知和传送数据。 、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WMCOMMAND进行处理的代码如果希望在窗口中进行图形输出就必须对WMPAINT进行处理。 、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送而我们都可以不予理睬让系统自己去处理。 、窗口句柄:说到消息就不能不说窗口句柄系统通过窗口句柄来在整个系统中唯一标识一个窗口发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。、示例:下面有一段伪代码演示如何在窗口过程中处理消息 LONGyourWndProc(HWNDhWnd,UINTuMessageType,WPARAMwP,LPARAM) {switch(uMessageType){使用SWITCH语句将各种消息分开case(WMPAINT):doYourWindow()在窗口需要重新绘制时进行输出breakcase(WMLBUTTONDOWN):doYourWork()在鼠标左键被按下时进行处理breakdefault:callDefaultWndProc()对于其它情况就让系统自己处理break}}接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法: while(){id=getMessage()if(id==quit)breaktranslateMessage()}当该程序没有消息通知时getMessage就不会返回也就不会占用系统的CPU时间。图示消息投递模式 在位的系统中系统中只有一个消息队列所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。WindowsX就是这种系统。而位的系统中每一运行的程序都会有一个消息队列所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。WindowsNT就是这种系统。 利用VisualCMFC开发Windows程序的优势MFC借助C的优势为Windows开发开辟了一片新天地同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。更令人兴奋的是利用C的封装功能使开发者摆脱Windows中各种句柄的困扰只需要面对C中的对象这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系统原理对开发很有帮助) 正因为MFC是建立在C的基础上所以我强调CC语言基础对开发的重要性。利用C的封装性开发者可以更容易理解和操作各种窗口对象利用C的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码利用虚拟性可以在必要时更好的控制窗口的活动。而且C本身所具备的超越C语言的特性都可以使开发者编写出更易用更灵活的代码。 在MFC中对消息的处理利用了消息映射的方法该方法的基础是宏定义实现通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法: 代码如下BEGINMESSAGEMAP(CMainFrame,CFrameWnd) {{AFXMSGMAP(CMainFrame)ONWMCREATE() }}AFXMSGMAPONCOMMAND(IDFONTDROPDOWN,DoNothing)ENDMESSAGEMAP()经过编译后代码被替换为如下形式(这只是作讲解实际情况比这复杂得多):BEGINMESSAGEMAP(CMainFrame,CFrameWnd) CMainFrame::newWndProc(){switch(){{{AFXMSGMAP(CMainFrame)ONWMCREATE() case(WMCREATE):OnCreate()break}}AFXMSGMAPONCOMMAND(IDFONTDROPDOWN,DoNothing)case(WMCOMMAND):if(HIWORD(wP)==IDFONTDROPDOWN){DoNothing()}breakENDMESSAGEMAP()}}newWndProc就是窗口过程只要是该类的实例生成的窗口都使用该窗口过程。 所以了解了Windows的消息机制在加上对消息映射的理解就很容易了解MFC开发的基本思路了。 利用MFC进行开发的通用方法介绍 以下是我在最初学习VC时所常用的开发思路和方法希望能对初学VC的朋友有所帮助和启发。、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。、开发注重交互的简单应用程序可以使用对话框为基础的窗口如果文件读写简单这可利用CFile进行。、开发注重交互并且文件读写复杂的的简单应用程序可以利用以CFormView为基础视的单文档视结构。、利用对话框得到用户输入的数据在等级提高后可使用就地输入。、在对多文档要求不强烈时尽量避免多文档视结构可以利用分隔条产生单文档多视结构。、在要求在多个文档间传递数据时使用多文档视结构。、学会利用子窗口并在自定义的子窗口包含多个控件达到封装功能的目的。、尽量避免使用多文档多视结构。、不要使用多重继承并尽量减少一个类中封装过多的功能。MFC中常用类宏函数介绍常用类CRect:用来表示矩形的类拥有四个成员变量:topleftbottomright。分别表是左上角和右下角的坐标。可以通过以下的方法构造: CRect(intl,intt,intr,intb)指明四个坐标CRect(constRECTsrcRect)由RECT结构构造 CRect(LPCRECTlpSrcRect)由RECT结构构造 CRect(POINTpoint,SIZEsize)有左上角坐标和尺寸构造 CRect(POINTtopLeft,POINTbottomRight)有两点坐标构造 下面介绍几个成员函数: intWidth()const得到宽度 intHeight()const得到高度 CSizeSize()const得到尺寸 CPointTopLeft()得到左上角坐标 CPointBottomRight()得到右下角坐标 CPointCenterPoint()const得当中心坐标 此外矩形可以和点(CPoint)相加进行位移和另一个矩形相加得到“并”操作后的矩形。 CPoint:用来表示一个点的坐标有两个成员变量:xy。可以和另一个点相加。CString:用来表示可变长度的字符串。使用CString可不指明内存大小CString会根据需要自行分配。下面介绍几个成员函数: GetLength得到字符串长度 GetAt得到指定位置处的字符 operator相当于strcat voidFormat(LPCTSTRlpszFormat,)相当于sprintf Find查找指定字符字符串 Compare比较 CompareNoCase不区分大小写比较 MakeUpper改为小写 MakeLower改为大写 CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数: Add增加CString RemoveAt删除指定位置CString对象 RemoveAll删除数组中所有CString对象 GetAt得到指定位置的CString对象 SetAt修改指定位置的CString对象 InsertAt在某一位置插入CString对象 常用宏RGBTRACEASSERTVERIFY常用函数CWindApp*AfxGetApp()HINSTANCEAfxGetInstanceHandle()HINSTANCEAfxGetResourceHandle()intAfxMessageBox(LPCTSTRlpszText,UINTnType=MBOK,UINTnIDHelp=)用于弹出一个消息框和GUI有关的各种对象在Windows中有各种GUI对象(不要和C对象混淆)当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性下面分别讲述各种GUI对象和拥有的属性。字体对象CFont用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体是否为粗体字体名称是否有下划线等。颜色和背景色不属于字体的属性。关于如何创建和使用字体在在窗口中输出文字中会详细讲解。刷子CBrush对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属性为颜色是否采用网格和网格的类型如水平的垂直的交叉的等。你也可以利用*的位图来创建一个自定义模板的刷子在使用这种刷子填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在使用刷子笔进行绘图中会详细讲解。画笔CPen对象在画点和画线时有用。它的属性包括颜色宽度线的风格如虚线实线点划线等。关于如何创建和使用画笔在使用刷子笔进行绘图中会详细讲解。位图CBitmap对象可以包含一幅图像可以保存在资源中。关于如何使用位图在在窗口中绘制设备相关位图图标设备无关位图中会详细讲解。还有一种特殊的GUI对象是多边形利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在多边形和剪贴区域中会详细讲解。在Windows中使用GUI对象必须遵守一定的规则。首先需要创建一个合法的对象不同的对象创建方法不同。然后需要将该GUI对象选入DC中同时保存DC中原来的GUI对象。如果选入一个非法的对象将会引起异常。在使用完后应该恢复原来的对象这一点特别重要如果保存一个临时对象在DC中而在临时对象被销毁后可能引起异常。有一点必须注意每一个对象在重新创建前必须销毁下面的代码演示了这一种安全的使用方法: OnDraw(CDC*pDC){CPenpen,penpenCreatePen(PSSOLID,,RGB(,,))创建对象penCreatePen(PSSOLID,,RGB(,,))创建对象CPen*pPenOld=(CPen*)pDC>SelectObject(pen)选择对象进DCdrawWithPen(CPen*)pDC>SelectObject(pen)选择对象进DCdrawWithPenpenDeleteObject()再次创建前先销毁penCreatePen(PSSOLID,,RGB(,,))再次创建对象(CPen*)pDC>SelectObject(pen)选择对象进DCdrawWithPenpDC>SelectObject(pOldPen)恢复}此外系统中还拥有一些库存GUI对象你可以利用CDC::SelectStockObject(SelectStockObject(intnIndex)选入这些对象它们包括一些固定颜色的刷子画笔和一些基本字体。 BLACKBRUSHBlackbrushDKGRAYBRUSHDarkgraybrushGRAYBRUSHGraybrushHOLLOWBRUSHHollowbrushLTGRAYBRUSHLightgraybrushBRUSHbrushWHITEBRUSHWhitebrushBLACKPENBlackpenPENpenWHITEPENWhitepenANSIFIXEDFONTANSIfixedsystemfontANSIVARFONTANSIvariablesystemfontDEVICEDEFAULTFONTDevicedependentfontOEMFIXEDFONTOEMdependentfixedfontSYSTEMFONTThesystemfontBydefault,Windowsusesthesystemfonttodrawmenus,dialogboxcontrols,andothertextInWindowsversionsandlater,thesystemfontisproportionalwidthearlierversionsofWindowsuseafixedwidthsystemfontSYSTEMFIXEDFONTThefixedwidthsystemfontusedinWindowspriortoversionThisobjectisavailableforcompatibilitywithearlierversionsofWindowsDEFAULTPALETTEDefaultcolorpaletteThispaletteconsistsofthestaticcolorsinthesystempalette 这些对象留在DC中是安全的所以你可以利用选入库存对象来作为恢复DC中GUI对象。 大家可能都注意到了绘图时都需要一个DC对象DC(DeviceContext设备环境)对象是一个抽象的作图环境可能是对应屏幕也可能是对应打印机或其它。这个环境是设备无关的所以你在对不同的设备输出时只需要使用不同的设备环境就行了而作图方式可以完全不变。这也就是Windows耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出而不需要对画进行任何调整。DC的使用会穿插在本章中进行介绍。在窗口中输出文字在这里我假定读者已经利用ApplicationWizard生成了一个SDI界面的程序代码。接下来的你只需要在CView派生类的OnDraw成员函数中加入绘图代码就可以了。在这里我需要解释一下OnDraw函数的作用OnDraw函数会在窗口需要重绘时自动被调用传入的参数CDC*pDC对应的就是DC环境。使用OnDraw的优点就在于在你使用打印功能的时候传入OnDraw的DC环境将会是打印机绘图环境使用打印预览时传入的是一个称为CPreviewDC的绘图环境所以你只需要一份代码就可以完成窗口打印预览打印机绘图三重功能。利用Windows的设备无关性和M$为打印预览所编写的上千行代码你可以很容易的完成一个具有所见即所得的软件。输出文字一般使用CDC::BOOLTextOut(intx,inty,constCStringstr)和CDC::intDrawText(constCStringstr,LPRECTlpRect,UINTnFormat)两个函数对TextOut来讲只能输出单行的文字而DrawText可以指定在一个矩形中输出单行或多行文字并且可以规定对齐方式和使用何种风格。nFormat可以是多种以下标记的组合(利用位或操作)以达到选择输出风格的目的。 DTBOTTOM底部对齐SpecifiesbottomjustifiedtextThisvaluemustbecombinedwithDTSINGLELINEDTCALCRECT计算指定文字时所需要矩形尺寸DeterminesthewidthandheightoftherectangleIftherearemultiplelinesoftext,DrawTextwillusethewidthoftherectanglepointedtobylpRectandextendthebaseoftherectangletoboundthelastlineoftextIfthereisonlyonelineoftext,DrawTextwillmodifytherightsideoftherectanglesothatitboundsthelastcharacterinthelineIneithercase,DrawTextreturnstheheightoftheformattedtext,butdoesnotdrawthetextDTCENTER中部对齐CenterstexthorizontallyDTENDELLIPSISorDTPATHELLIPSISReplacespartofthegivenstringwithellipses,ifnecessary,sothattheresultfitsinthespecifiedrectangleThegivenstringisnotmodifiedunlesstheDTMODIFYSTRINGflagisspecified YoucanspecifyDTENDELLIPSIStoreplacecharactersattheendofthestring,orDTPATHELLIPSIStoreplacecharactersinthemiddleofthestringIfthestringcontainsbackslash()characters,DTPATHELLIPSISpreservesasmuchaspossibleofthetextafterthelastbackslashDTEXPANDTABSExpandstabcharactersThedefaultnumberofcharacterspertabiseightDTEXTERNALLEADINGIncludesthefont抯externalleadinginthelineheightNormally,externalleadingisnotincludedintheheightofalineoftextDTLEFT左对齐AlignstextflushleftDTMODIFYSTRINGModifiesthegivenstringtomatchthedisplayedtextThisflaghasnoeffectunlesstheDTENDELLIPSISorDTPATHELLIPSISflagisspecified NoteSomeuFormatflagcombinationscancausethepassedstringtobemodifiedUsingDTMODIFYSTRINGwitheitherDTENDELLIPSISorDTPATHELLIPSISmaycausethestringtobemodified,causinganassertionintheCStringoverrideDTNOCLIPDrawswithoutclippingDrawTextissomewhatfasterwhenDTNOCLIPisusedDTNOPREFIX禁止使用前缀TurnsoffprocessingofprefixcharactersNormally,DrawTextinterpretstheampersand()mnemonicprefixcharacterasadirectivetounderscorethecharacterthatfollows,andthetwoampersand()mnemonicprefixcharactersasadirectivetoprintasingleampersandByspecifyingDTNOPREFIX,thisprocessingisturnedoffDTPATHELLIPSIS DTRIGHT右对齐AlignstextflushrightDTSINGLELINE单行输出SpecifiessinglelineonlyCarriagereturnsandlinefeedsdonotbreakthelineDTTABSTOP设置TAB字符所占宽度SetstabstopsThehighorderbyteofnFormatisthenumberofcharactersforeachtabThedefaultnumberofcharacterspertabiseightDTTOP定部对齐Specifiestopjustifiedtext(singlelineonly)DTVCENTER中部对齐Specifiesverticallycenteredtext(singlelineonly)DTWORDBREAK每行只在单词间被折行SpecifieswordbreakingLinesareautomaticallybrokenbetweenwordsifawordwouldextendpasttheedgeoftherectanglespecifiedbylpRectAcarriagereturn杔inefeedsequencewillalsobreaktheline 在输出文字时如果希望改变文字的颜色你可以利用CDC::SetTextColor(COLORREFcrColor)进行设置如果你希望改变背景色就利用CDC::SetBkColor(COLORREFcrColor)很多时候你可能需要透明的背景色你可以利用CDC::SetBkMode(intnBkMode)设置可接受的参数有 OPAQUEBackgroundisfilledwiththecurrentbackgroundcolorbeforethetext,hatchedbrush,orpenisdrawnThisisthedefaultbackgroundmodeTRANSPARENTBackgroundisnotchangedbeforedrawing 接下来讲讲如何创建字体你可以创建的字体有两种:库存字体CDC::CreateStockObject(intnIndex)和自定义字体。在创建非库存字体时需要填充一个LOGFONT结构并使用CFont::CreateFontIndirect(constLOGFONT*lpLogFont)(可以参考文章在同一系统中显示GB字符和BIG字符)或使用CFont::CreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbItalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRlpszFacename)其中的参数和LOGFONT中的分量有一定的对应关系。下面分别讲解参数的意义:nHeight字体高度(逻辑单位)等于零为缺省高度否则取绝对值并和可用的字体高度进行匹配。nWidth宽度(逻辑单位)如果为零则使用可用的横纵比进行匹配。nEscapement出口矢量与X轴间的角度nOrientation字体基线与X轴间的角度nWeight字体粗细可取以下值ConstantValue FWDONTCARE FWTHIN FWEXTRALIGHT FWULTRALIGHT FWLIGHT FWNORMAL FWREGULAR FWMEDIUM FWSEMIBOLD FWDEMIBOLD FWBOLD FWEXTRABOLD FWULTRABOLD FWBLACK FWHEAVY bItalic是否为斜体bUnderline是否有下划线cStrikeOut是否带删除线nCharSet指定字符集合可取以下值ConstantValue ANSICHARSET DEFAULTCHARSET SYMBOLCHARSET SHIFTJISCHARSET OEMCHARSET nOutPrecision输出精度OUTCHARACTERPRECISOUTSTRINGPRECIS OUTDEFAULTPRECISOUTSTROKEPRECIS OUTDEVICEPRECISOUTTTPRECIS OUTRASTERPRECIS nClipPrecision剪辑精度可取以下值CLIPCHARACTERPRECISCLIPMASK CLIPDEFAULTPRECISCLIPSTROKEPRECIS CLIPENCAPSULATECLIPTTALWAYS CLIPLHANGLES nQuality输出质量可取以下值DEFAULTQUALITYAppearanceofthefontdoesnotmatterDRAFTQUALITYAppearanceofthefontislessimportantthanwhenPROOFQUALITYisusedForGDIrasterfonts,scalingisenabledBold,italic,underline,andstrikeoutfontsaresynthesizedifnecessaryPROOFQUALITYCharacterqualityofthefontismoreimportantthanexactmatchingofthelogicalfontattributesForGDIrasterfonts,scalingisdisabledandthefontclosestinsizeischosenBold,italic,underline,andstrikeoutfontsaresynthesizedifnecessary nPitchAndFamily字体间的间距lpszFacename指定字体名称为了得到系统所拥有的字体可以利用EmunFontFamiliesEx。(可以参考文章在同一系统中显示GB字符和BIG字符)此外可以利用CFontDialog来得到用户选择的字体的LOGFONT数据。最后我讲一下文本坐标的计算利用CDC::GetTextExtent(constCStringstr)可以得到字符串的在输出时所占用的宽度和高度这样就可以在手工输出多行文字时使用正确的行距。另外如果需要更精确的对字体高度和宽度进行计算就需要使用CDC::GetTextMetrics(LPTEXTMETRIClpMetrics)该函数将会填充TEXTMETRIC结构该结构中的分量可以非常精确的描述字体的各种属性。使用点刷子笔进行绘图在Windows中画点的方法很简单只需要调用COLORREFCDC::SetPixel(intx,inty,COLORREFcrColor)就可以在指定点画上指定颜色同时返回原来的颜色。COLORREFCDC::GetPixel(intx,inty)可以得到指定点的颜色。在Windows中应该少使用画点的函数因为这样做的执行效率比较低。刷子和画笔在Windows作图中是使用最多的GUI对象本节在讲解刷子和画笔使用方法的同时也讲述一写基本作图函数。在画点或画线时系统使用当前DC中的画笔所以在创建画笔后必须将其选入DC才会在绘图时产生效果。画笔可以通过CPen对象来产生通过调用CPen::CreatePen(intnPenStyle,intnWidth,COLORREFcrColor)来创建。其中nPenStyle指名画笔的风格可取如下值: PSSOLID实线CreatesasolidpenPSDASH虚线宽度必须为一CreatesadashedpenValidonlywhenthepenwidthisorless,indeviceunitsPSDOT点线宽度必须为一CreatesadottedpenValidonlywhenthepenwidthisorless,indeviceunitsPSDASHDOT点划线宽度必须为一CreatesapenwithalternatingdashesanddotsValidonlywhenthepenwidthisorless,indeviceunitsPSDASHDOTDOT双点划线宽度必须为一CreatesapenwithalternatingdashesanddoubledotsValidonlywhenthepenwidthisorless,indeviceunitsPS空线使用时什么也不会产生CreatesapenPSENDCAPROUND结束处为圆形EndcapsareroundPSENDCAPSQUARE结束处为方形EndcapsaresquarenWidth和crColor为线的宽度和颜色。 刷子是在画封闭曲线时用来填充的颜色例如当你画圆形或方形时系统会用当前的刷子对内部进行填充。刷子可利用CBrush对象产生。通过以下几种函数创建刷子: BOOLCreateSolidBrush(COLORREFcrColor)创建一种固定颜色的刷子 BOOLCreateHatchBrush(intnIndex,COLORREFcrColor)创建指定颜色和网格的刷子nIndex可取以下值: HSBDIAGONALDownwardhatch(lefttoright)atdegreesHSCROSSHorizontalandverticalcrosshatchHSDIAGCROSSCrosshatchatdegreesHSFDIAGONALUpwardhatch(lefttoright)atdegreesHSHORIZONTALHorizontalhatchHSVERTICALVerticalhatch BOOLCreatePatternBrush(CBitmap*pBitmap)创建以*位图为模板的刷子 在选择了画笔和刷子后就可以利用Windows的作图函数进行作图了基本的画线函数有以下几种 CDC::MoveTo(intx,inty)改变当前点的位置 CDC::LineTo(intx,inty)画一条由当前点到参数指定点的线 CDC::BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd)画弧线 CDC::BOOLPolyline(LPPOINTlpPoints,intnCount)将多条线依次序连接 基本的作图函数有以下几种: CDC::BOOLRectangle(LPCRECTlpRect)矩形 CDC::RoundRect(LPCRECTlpRect,POINTpoint)圆角矩形 CDC::DrawdRect(intx,inty,intcx,intcy,COLORREFclrTopLeft,COLORREFclrBottomRight)D边框 CDC::Chord(LPCRECTlpRect,POINTptStart,POINTptEnd)扇形 CDC::Ellipse(LPCRECTlpRect)椭圆形 CDC::Pie(LPCRECTlpRect,POINTptStart,POINTptEnd) CDC::Polygon(LPPOINTlpPoints,intnCount)多边形 对于矩形圆形或类似的封闭曲线系统会使用画笔绘制边缘使用刷子填充内部。如果你不希望填充或是画出边缘你可以选入空刷子(PEN)或是(BRUSH)空笔。 下面的代码创建一条两象素宽的实线并选入DC。并进行简单的作图: {CPenpenpenCreatePen(PSSOLID,,RGB(,,))CPen*pOldPen=(CPen*)dcSelectObject(pen)dcSelectStockObject(BRUSH)选入空刷子dcRectangle(CRect(,,,))画矩形在窗口中绘制设备相关位图图标设备无关位图在Windows中可以将预先准备好的图像复制到显示区域中这种内存拷贝执行起来是非常快的。在Windows中提供了两种使用图形拷贝的方法:通过设备相关位图(DDB)和设备无关位图(DIB)。DDB可以用MFC中的CBitmap来表示而DDB一般是存储在资源文件中在加载时只需要通过资源ID号就可以将图形装入。BOOLCBitmap::LoadBitmap(UINTnIDResource)可以装入指定DDB但是在绘制时必须借助另一个和当前绘图DC兼容的内存DC来进行。通过CDC::BitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop)绘制图形同时指定光栅操作的类型。BitBlt可以将源DC中位图复制到目的DC中其中前四个参数为目的区域的坐标接下来是源DC指针然后是源DC中的起始坐标由于BitBlt为等比例复制所以不需要再次指定长宽(StretchBlt可以进行缩放)最后一个参数为光栅操作的类型可取以下值: BLACKNESS输出区域为黑色TurnsalloutputblackDSTINVERT反色输出区域InvertsthedestinationbitmapMERGECOPY在源和目的间使用AND操作CombinesthepatternandthesourcebitmapusingtheBooleanANDoperatorMERGEPAINT在反色后的目的和源间使用OR操作CombinestheinvertedsourcebitmapwiththedestinationbitmapusingtheBooleanORoperatorNOTSRCCOPY将反色后的源拷贝到目的区CopiestheinvertedsourcebitmaptothedestinationPATINVERT源和目的间进行XOR操作CombinesthedestinationbitmapwiththepatternusingtheBooleanXORoperatorSRCAND源和目的间进行AND操作CombinespixelsofthedestinationandsourcebitmapsusingtheBooleanANDoperatorSRCCOPY复制源到目的区CopiesthesourcebitmaptothedestinationbitmapSRCINVERT源和目的间进行XOR操作CombinespixelsofthedestinationandsourcebitmapsusingtheBooleanXORoperatorSRCPAINT源和目的间进行OR操作CombinespixelsofthedestinationandsourcebitmapsusingtheBooleanORoperatorWHITENESS输出区域为白色Turnsalloutputwhite 下面用代码演示这种方法: CYourView::OnDraw(CDC*pDC){CDCmemDC定义一个兼容DCmemDCCreateCompatibleDC(pDC)创建DCCBitmapbmpDrawbmpDrawLoadBitmap(IDBMP)装入DDBCBitmap*pbmpOld=memDCSelectObject(bmpDraw)保存原有DDB并选入新DDB入DCpDC>BitBlt(,,,,memDC,,,SRCCOPY)将源DC中(,,,)复制到目的DC(,,,)pDC>BitBlt(,,,,memDC,,,SRCAND)将源DC中(,,,)和目的DC(,,,)中区域进行AND操作memDCSelectObject(pbmpOld)选入原DDB}(图标并不是一个GDI对象所以不需要选入DC)在MFC中没有一个专门的图标类因为图标的操作比较简单使用HICONCWinApp::LoadIcon(UINTnIDResource)或是HICONCWinApp::LoadStandardIcon(LPCTSTRlpszIconName)装入后就可以利用BOOLCDC::DrawIcon

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/53

vc++

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利