VC++编程基础知识_第1页
VC++编程基础知识_第2页
VC++编程基础知识_第3页
VC++编程基础知识_第4页
VC++编程基础知识_第5页
已阅读5页,还剩125页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.,VC+编程基础(补充),一、Windows应用程序二、VC+编程环境介绍三、VC+交互编程基础四、Windows图形编程,.,Windows应用程序的相关概念,Windows应用程序设计方法(1)使用Windows提供的WindowsAPI函数WindowsAPI是Windows系统和Windows应用程序间的标准程序接口,应用程序可以通过此接口访问系统(2)使用Microsoft提供的MFC类库MFC类库集成了大量已经预先定义好的类,用户可以根据编程的需要调用相应的类,或根据需要自定义有关的类。,.,Windows应用程序的相关概念,Windows应用程序开发模式值得注意的几个方面:,MessageProcessingTheWindowsGraphicsDeviceInterfaceResource-BasedProgrammingMemoryManagementDynamicLinkLibrariesTheWin32ApplicationProgrammingInterface,.,Windows应用程序的相关概念,Windows应用程序基本结构:,.,Windows应用程序的相关概念,Windows应用程序以消息为基础,以事件驱动之。,事件驱动程序设计是围绕着消息的产生与处理而展开的。一条消息是关于发生的事件的信息。作为一个Windows程序员,其工作就是对正开发的应用程序所要发出或要接收的消息进行排序和管理。,.,Windows应用程序的相关概念,Windows消息的结构MSG:,typedefstructtagMSGHWNDhwnd;UINTmessage;WPARAMwParam;LPARAMlParam;DWORDtime;POINTpt;MSG,*PMSG;,.,Windows应用程序的相关概念,Windows消息的处理:,MSGmsg/定义一个MSG类型的变量while(GetMessage(/将消息传递给窗口函数,以便处理相应的消息,.,Windows应用程序的相关概念,Windows应用程序中的数据类型及常量,typedefunsignedcharBYTEtypedefunsignedshortWORDtypedefunsignedlongDWORDtypedeflongLONGtypedefchar*PSTRtypedefcharNEAR*NPSTtypedefcharFAR*LPSTRtypedefvoidVOID#denfineWM_QUIT0X0012,.,Windows应用程序的相关概念,Windows应用程序中的数据类型及常量,类型说明CS窗口类的风格(ClassStyle)IDI预定义的图标对象的标识符(IDentityofIcon)IDC预定义的光标对象的标识符(IDentityofCursor)WS窗口的风格(WindowsStyle)CW创建窗口(CreateWindows)WM窗口消息(WindowsMessage)DT绘制文本(DrawingText),一些常见常量的前缀意义,.,Windows应用程序的相关概念,Windows应用程序中的数据类型及常量,在变量名的表示方法方面,Windows推荐使用一种称为“匈牙利表示法”的方法。每个变量名用小写字母或描述了变量的数据类型的字母作为前缀,变量的名字紧跟其后,且用大写字母开始的单词(一个或多个单词)表示其含义,这样每个变量都能附加上其数据类型的助记符。例如:WORDwOffset;/w表示WORD类型DWORDdwValue;/dw表示DWORD类型,.,Windows应用程序的相关概念,Windows应用程序中的数据类型及常量,类型说明bBOOL,布尔类型byBYTE类型cchar类型dwDWORD类型lLONG类型lp远(长)指针(longpointer)n短整型p指针s字符串,.,VC+编程环境介绍,1VisualC+简介,是Windows环境下最主要的应用开发系统之一是C+语言的集成开发环境与Win32紧密相连强大的调试功能为大型复杂软件的开发提供了有效的排错手段,2可视化,指软件开发阶段的可视化利用计算机图形技术和方法,.,VC+编程环境介绍,3开发环境,.,(1)VC+的菜单栏-File菜单,.,.,断点作用:中断程序的执行过程,以便检查程序代码、变量和寄存器值,用来设置删除和查看断点,.,提供有效的成员名,.,.,在View菜单中可以:改变窗口改变工具栏的显示方式检查源代码激活调试等,.,(a-1)ClassWizard中的MessageMaps选项卡,为窗口、对话框、控件、菜单选项和加速键等对象映射消息,创建或删除消息处理函数,查看编辑消息处理函数的代码,.,(a-2)MemberVariables选项卡:定义成员变量用于自动初始化其中:ControlIDs是映射到成员变量的控件ID值Type是成员变量的类型Member是成员变量名,.,(b)ResourceSymbols选项该选项将打开资源符号浏览器,从中可以浏览资源编辑符号,资源编辑符号是映射到整数值上的一串字符,相当于资源的一个代号,在同一个程序中,资源编辑符号不能重复,.,(c)ResourceIncludes选项,该对话框包含资源符号头文件名和预处理指令。,.,.,(a)NewClass选项该选项用来创建新类并添加到项目中,(4)VC+的菜单栏-Insert菜单,.,.,使用Project可以创建、修改和存储正在编辑的工程文件工程文件组合了一个应用程序的所有源文件的组成部分。工程文件包含在扩展名为.MAK的文件中。,(5)VC+的菜单栏-Project菜单,.,(b)AddToProject选项选择该选项将打开一个级联子菜单,通过级连子菜单,可以把文件、文件夹、数据链接以及VC组件或控件添加到当前工程文件中,(a)SetActiveProject选项设定指定的项目为工作区的活动项目,.,(c)Settings选项选择该选项将弹出ProjectSettings对话框,其中General选项卡用来设置基础类用法和目录,指出应用程序与MFC的链接方式,指出所建立的应用程序的缺省位置为Debug目录,输出文件的位置,.,Build菜单用于编译、建立和执行应用程序,(6)VC+的菜单栏-Build菜单,.,.,(e)StartDebug选项,从当前语句开始执行程序直到遇到断点或遇到程序结束,单步执行程序,并在遇到函数调用时进入函数内部再从头单步执行,使程序在运行到当前光标所在位置时停止(相当于设置一个临时断点),调试过程中直接进入到正在运行的进程中,.,(a)SourceBrowse选项编译器在建立项目时会创建与项目中每一程序文件信息有关的.SBR文件。BSCMAKE程序将这些.SBR文件汇编为单个浏览信息数据库,选择SourceBrowse将弹出浏览窗口,它显示与程序中所有符号(类、函数、数据、宏和类型)有关的信息,(7)VC+的菜单栏-Tools菜单,.,在工作区中添加项目:用File-Open选项可打开已存在的项目;通过New对话框的Projects选项卡创建新的项目,并选择Addtocurrentworkspace复选框。,VC以项目工作区的形式来组织文件、项目和项目配置,1.创建新的项目工作区,创建新的空工作区步骤:(a)File-New-Workspaces-输入工作区名字并指定工作区目录,.,.,在VC中,源代码或资源编辑器为了引用资源和用户自定义的其它对象,于是就引入了一种与资源一一对应的符号即资源符号,使之能够以字符串的方式被引用。资源符号是映射到整数值上的一串字符,是一种标识符。每当创建一个新的资源或资源对象时,系统就会为其提供一个缺省的资源符号名称并赋一个整数值,该定义保存在resource.h文件中。,资源是一种界面元素,用户可以从中获得信息并在其中执行某个动作,资源及资源编辑器,.,.,VCProgrammersGuide:VC程序员指南。VCUsersGuide:VC用户指南。VCTutorials:VC教程。MFCandTemplates:微软基础类库和模板参考信息。LanguagesandLibrariesforC+:C+语言和库文件信息。,VC帮助系统主要提供五个方面内容,联机帮助,.,VC+交互编程基础,MFC是用来编写Windows应用程序的C+类集,该类集以层次结构组织起来,其中封装了大部分WindowsAPI函数和Windows控件,它所包含的功能涉及到整个Windows操作系统。MFC不仅为用户提供了Windows图形环境下应用程序的框架,而且还提供了创建应用程序的组件。,.,MFC库中的类按层次关系划分类:(1)根类:CObject(2)应用程序体系结构类(3)窗口、对话框和控件类(4)绘图和打印类(5)简单数据类型类(6)数组、列表和映射类(7)文件和数据库类(8)Internet和网络工作类(9)OLE类(10)调试和异常类,VC+交互编程基础,.,应用程序体系结构类,.,应用程序体系结构类,.,可视对象类,1窗口类:CWnd类,CWnd提供了MFC中所有窗口类的基本功能,是CCmdTarget类的子类,.,可视对象类,.,可视对象类,.,可视对象类,.,VC+交互编程基础,MFC中全局函数和全局变量,AfxAbort:无条件终止一个应用程序AfxBeginThread:创建一个新线程并执行它AfxEndThread:终止当前正在执行的线程AfxMessageBox:显示一个Windows消息框AfxGetApp:返回当前应用程序对象的指针AfxGetInstanceHandle:返回标识当前应用程序对象的句柄AfxRegisterWndClass:注册用于创建Windows窗口的窗口类theApp应用程序唯一的全局对象,.,应用程序向导,.,应用程序向导,.,应用程序向导,.,应用程序向导,.,应用程序向导,.,应用程序向导,.,应用程序向导,.,应用程序向导,.,图形设备接口GDI,Windows图形设备接口(GDI)是为与设备无关的图形设计的。所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置。GDI负责系统与用户或绘图程序之间的信息交换,并控制在输出设备上显示图形或文字。,.,GDI的一些概念绘图工具对象绘图函数文本的显示,图形设备接口GDI,.,GDI的一些概念绘图工具对象绘图函数文本和字体,图形设备接口GDI,.,Windows系统,外设,直接访问,统一的设备环境(DC),使应用程序与设备相连,用户,GDI的一些概念,设备环境(上下文)DC,.,GDI的一些概念,CDC类,CDC类提供与绘图有关的所有操作函数,如:绘图工具对象的选择;绘图属性、映射模式、视口等的设置;提供坐标转换、裁剪和绘制简单图形、显示文本的函数等。派生自CDC类的还有CPaintDC、CClientDC、CWindowDC、CMetaFileDC。,.,GDI的一些概念,CDC类,CreateDC、CreateCompatibleDC、DeleteDCAttach、DetachGetCurrentBrush、GetCurrentFont、GetCurrentPalette、GetCurrentPen、GetWindowSelectObject、SelectStockObjectSelectPalette、RealizePaletteGetBkColor、SetBkColor、GetBkMode、SetBkMode、GetPolyFillMode、SetPolyFillMode、GetROP2、SetROP2、GetStretchBltMode、SetStretchBltMode、GetTextColor、SetTextColorGetMapMode、SetMapMode、GetViewportExt、SetViewportExt、GetWindowExt、SetWindowExtPatBlt、BitBlt、StretchBlt、GetPixel、SetPixel,.,图形刷新,(1)刷新请求,窗口大小的调整窗口移动被覆盖后的恢复,GDI的一些概念,.,GDI的一些概念,(2)系统对刷新请求的响应当用户区的内容需要刷新时,系统向应用程序消息队列发送WM_PAINT消息,三种刷新,窗口移动后的刷新被覆盖区域的刷新对象穿越后的刷新(系统自动完成),用户区移动或显示用户窗口大小改变程序通过滚动条滚动窗口,窗口被另一个窗口覆盖的恢复如下拉式菜单关闭等,光标穿过用户区图标拖过用户区,.,窗口被另一个窗口覆盖的区域称为无效区域。Windows系统为每个窗口建立了一个PAINTSTRUCT结构,该结构中包含了包围无效区域的一个最小矩形的结构RECT,应用程序可以根据这个无效矩形执行刷新操作。,typedefstructtagPAINTSTRUCTHDChdc;/设备环境句柄BOOLfErase;/一般取真值,表示擦除无效矩形的背景RECTrcPaint;/无效矩形标识BOOLfRestore;/系统保留BOOLfIncUpdate;/系统保留BYTErgbReserved32;/系统保留PAINTSTRUCT;,GDI的一些概念,.,常用的windows应用程序刷新窗口的方法,保存副本。刷新时将副本拷贝到相应的窗口中。,记录事件。刷新时重新执行这个曾经发生的事件。,重新绘制。将图形绘制处理程序放在消息WM_PAINT响应模块中,刷新时重绘图形。,(3)有效的刷新方法,GDI的一些概念,.,激活刷新的MFC窗口类的函数,GDI的一些概念,BOOLInvalidateRect(LPCRECTlpRect,BOOLbErase=TRUE);,BOOLInvalidate(BOOLbErase=TRUE);,voidInvalidateRgn(HRGNhRgn,BOOLbErase=TRUE);,.,获取设备环境DC的方法,获取设备环境是应用程序输出图形的先决条件,常用的两种方法是调用函数BeginPaint或GetDC,1、应用程序响应WM_PAINT消息进行图形刷新时,主要通过调用BeginPaint函数获取设备环境hdc=BeginPaint(hwnd,CDC*GetWindowDC();CClientDC(CWnd*pWnd);,由GetDC函数获取的设备环境必须用ReleaseDC函数释放。,GDI的一些概念,.,GDI的一些概念,获取设备环境DC的方法,.,映像模式映像模式定义了将逻辑单位转化为设备的度量单位以及设备的x方向和y方向,程序员可在一个统一的逻辑坐标系中操作而不必考虑输出设备的坐标系。,窗口:对应逻辑坐标系上程序员设定的区域视口:对应实际输出设备上程序员设定的区域,GDI的一些概念,.,GDI的一些概念,窗口视区变换通常解决下面几个方面的问题:(1)窗口逻辑坐标与视区设备坐标之间的转换。(2)用户坐标系到屏幕坐标系,坐标轴方向可能改变,还有坐标原点的映射问题;(3)用户坐标系中窗口区的图形坐标转换到视图区上的坐标需要取整。(4)如果视图区水平分辨率和垂直分辨率不同,为了保持图形不变形,还要进行比例变换。,.,GDI的一些概念,.,应用程序可获取设备环境的当前映像模式,并根据需要设置映像模式。,GDI的一些概念,CDC:GetMapModeCDC:SetMapModeintGetMapMode()const;virtualintSetMapMode(intnMapMode);,.,图形设备接口GDI,GDI的一些概念绘图工具对象绘图函数文本的显示,.,CGdiObject,绘图工具对象,.,1.画笔(CPen),画笔的创建CPen(intnPenStyle,intnWidth,COLORREFcrColor);CPen(intnPenStyle,intnWidth,constLOGBRUSH*pLogBrush,intnStyleCount=0,constDWORD*lpStyle=NULL);BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);BOOLCreatePen(intnPenStyle,intnWidth,constLOGBRUSH*pLogBrush,intnStyleCount=0,constDWORD*lpStyle=NULL);,绘图工具对象,PS_DASHPS_DASHDOTPS_DASHDOTDOTPS_DOTPS_INSIDEFRAMEPS_NULLPS_SOLID,.,创建画笔后,必须调用SelectObject函数将其选入设备环境。,不再使用当前画笔时,需删除画笔,以免占内存DeleteObject(hP);,绘图工具对象,CPenpen(0,width,color);CPen*oldPen=pDC-SelectObject(,.,2.画刷(CBrush),CBrush(COLORREFcrColor);CBrush(intnIndex,COLORREFcrColor);CBrush(CBitmap*pBitmap);BOOLCreateSolidBrush(COLORREFcrColor);BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);BOOLCreateBrushIndirect(constLOGBRUSH*lpLogBrush);BOOLCreatePatternBrush(CBitmap*pBitmap);BOOLCreateDIBPatternBrush(HGLOBALhPackedDIB,UINTnUsage);BOOLCreateDIBPatternBrush(constvoid*lpPackedDIB,UINTnUsage);BOOLCreateSysColorBrush(intnIndex);,绘图工具对象,.,CBrushbrush;brush.CreateSysColorBrush(COLOR_BTNFACE);/Selectthebrushintothedevicecontext.CBrush*pOldBrush=(CBrush*)pDC-SelectObject(,绘图工具对象,2.画刷(CBrush),.,BOOLCreatePalette(LPLOGPALETTElpLogPalette);BOOLCreateHalftonePalette(CDC*pDC);UINTGetPaletteEntries(UINTnStartIndex,UINTnNumEntries,LPPALETTEENTRYlpPaletteColors)const;UINTSetPaletteEntries(UINTnStartIndex,UINTnNumEntries,LPPALETTEENTRYlpPaletteColors);,绘图工具对象,3.调色板(CPalette),typedefstructtagPALETTEENTRYBYTEpeRed;BYTEpeGreen;BYTEpeBlue;BYTEpeFlags;PALETTEENTRY;,typedefstructtagLOGPALETTEWORDpalVersion;WORDpalNumEntries;PALETTEENTRYpalPalEntry1;LOGPALETTE;,.,BOOLCreateRectRgn(intx1,inty1,intx2,inty2);BOOLCreateRectRgnIndirect(LPCRECTlpRect);BOOLCreateEllipticRgn(intx1,inty1,intx2,inty2);BOOLCreateEllipticRgnIndirect(LPCRECTlpRect);BOOLCreatePolygonRgn(LPPOINTlpPoints,intnCount,intnMode);BOOLCreatePolyPolygonRgn(LPPOINTlpPoints,LPINTlpPolyCounts,intnCount,intnPolyFillMode);BOOLCreateRoundRectRgn(intx1,inty1,intx2,inty2,intx3,inty3);intCombineRgn(CRgn*pRgn1,CRgn*pRgn2,intnCombineMode);,绘图工具对象,4.CRgn,.,图形设备接口GDI,GDI的一些概念绘图工具对象绘图函数文本的显示,.,CDC的绘图函数:CPointGetCurrentPosition()const;CPointMoveTo(intx,inty);CPointMoveTo(POINTpoint);BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);,绘图函数,.,CDC的绘图函数:BOOLAngleArc(intx,inty,intnRadius,floatfStartAngle,floatfSweepAngle);BOOLLineTo(intx,inty);BOOLPolyline(LPPOINTlpPoints,intnCount);BOOLPolyPolyline(constPOINT*lpPoints,constDWORD*lpPolyPoints,intnCount);BOOLPolyBezier(constPOINT*lpPoints,intnCount);BOOLDrawIcon(intx,inty,HICONhIcon);voidDrawDragRect(LPCRECTlpRect,SIZEsize,LPCRECTlpRectLast,SIZEsizeLast,CBrush*pBrush=NULL,CBrush*pBrushLast=NULL);voidDraw3dRect(LPCRECTlpRect,COLORREFclrTopLeft,COLORREFclrBottomRight);,绘图函数,.,CDC的绘图函数:BOOLChord(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLChord(LPCRECTlpRect,POINTptStart,POINTptEnd);BOOLPie(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLPie(LPCRECTlpRect,POINTptStart,POINTptEnd);,绘图函数,.,CDC的绘图函数:BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);BOOLPolygon(LPPOINTlpPoints,intnCount);intSetPolyFillMode(intnPolyFillMode);BOOLPolyPolygon(LPPOINTlpPoints,LPINTlpPolyCounts,intnCount);BOOLRectangle(intx1,inty1,intx2,inty2);BOOLRectangle(LPCRECTlpRect);voidDrawFocusRect(LPCRECTlpRect);BOOLRoundRect(intx1,inty1,intx2,inty2,intx3,inty3);BOOLRoundRect(LPCRECTlpRect,POINTpoint);,绘图函数,.,图形设备接口GDI,GDI的一些概念绘图工具对象绘图函数文本和字体,.,文本和字体,使用定义好的与设备无关的字体集,Windows就能维护它的设备无关性,提供“所见即所得”的好处,即屏幕所见与设备输出的文本是一样的。,.,文本和字体,逻辑字体定义的字符集是设备无关的,它可以精确标度,因此得到广泛应用,物理字体是为特殊设备设计的,因而是设备相关的,字体说明ANSI_FIXEDANSI标准的固定宽度的字体ANSI_VARANSI标准的可变宽度的字体DEFAULT_GUI当前GUI的缺省字体OEM_FIXED由标准原设备制造商(OEM)提供DEVICE_DEFAULT当前图形设备的字体SYSTEM_FIXEDWindows的标准固定宽度的字体SYSTEMWindows提供的可变宽度的字体,Windows系统提供了七种基本字体,.,文本和字体,CFont类BOOLCreateFontIndirect(constLOGFONT*lpLogFont);BOOLCreateFont(intnHeight,intnWidth,intnEscapement,intnOrientation,intnWeight,BYTEbItalic,BYTEbUnderline,BYTEcStrikeOut,BYTEnCharSet,BYTEnOutPrecision,BYTEnClipPrecision,BYTEnQuality,BYTEnPitchAndFamily,LPCTSTRlpszFacename);BOOLCreatePointFont(intnPointSize,LPCTSTRlpszFaceName,CDC*pDC=NULL);BOOLCreatePointFontIndirect(constLOGFONT*lpLogFont,CDC*pDC=NULL);,.,文本和字体,typedefstructtagLOGFONTLONGlfHeight;LONGlfWidth;/字体高度、宽度LONGlfEscapement;LONGlfOrientation;/字体角度LONGlfWeight;/字体粗细度BYTElfItalic;/字体是否倾斜BYTElfUnderline;/字体是否有下划线BYTElfStrikeOut;/字体是否有中划线BYTElfCharSet;/字体所属字符集BYTElfOutPrecision;BYTElfClipPrecision;BYTElfQuality;BYTElfPitchAndFamily;TCHARlfFaceNameLF_FACESIZE;/字体名LOGFONT,*PLOGFONT;,.,文本和字体,CFont类CClientDCdc(this);CFontfont;VERIFY(font.CreatePointFont(120,Arial,.,文本和字体,设置字体和背景颜色(CDC),virtualCOLORREFSetBkColor(COLORREFcrColor);intSetBkMode(intnBkMode);virtualCOLORREFSetTextColor(COLORREFcrColor);,输出文字(CDC),virtualBOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount);BOOLTextOut(intx,inty,constCString,.,GDI编程的几个问题,CRgn类位图相关知识映射模式与窗口-视口变换MFC中的MVC模式编程实例解析,.,CRgn类,CRgn类的主要方法:,1、创建各类多边形区域:BOOLCreateRectRgn(intx1,inty1,intx2,inty2);BOOLCreateEllipticRgn(intx1,inty1,intx2,inty2);BOOLCreateRoundRectRgn(intx1,inty1,intx2,inty2,intx3,inty3);BOOLCreatePolygonRgn(LPPOINTlpPoints,intnCount,intnMode);BOOLCreatePolyPolygonRgn(LPPOINTlpPoints,LPINTlpPolyCounts,intnCount,intnPolyFillMode);BOOLCreateFromPath(CDC*pDC);BOOLCreateFromData(constXFORM*lpXForm,intnCount,constRGNDATA*pRgnData);,.,CRgn类,CRgn类的主要方法:,2、用于多边形区域的交互拾取:BOOLPtInRegion(intx,inty)const;BOOLRectInRegion(LPCRECTlpRect)const;,CRgn类还用于CDC类的裁剪操作:intSelectClipRgn(CRgn*pRgn,intnMode);virtualBOOLPtVisible(intx,inty)const;virtualBOOLRectVisible(LPCRECTlpRect)const;virtualintOffsetClipRgn(intx,inty);intExcludeUpdateRgn(CWnd*pWnd);,.,CRgn类,CRgn用于多边形区域的交互拾取例子,鼠标当前位置,构造线段的选择矩形区域,直线的交互拾取,.,CRgn类,CRgn用于多边形区域的交互拾取例子,椭圆的交互拾取实例代码BOOLCGDI_ExeDoc:GetEllipseAt(CRect,.,位图相关知识,1、位图相关数据结构2、DIB/位图文件类型,“BM”DWORDbfSize;/位图文件大小,单位字节WORDbfReserved1;/保留字,取0WORDbfReserved2;/保留字,取0DWORDbfOffBits;/文件头到位图数据的偏移量BITMAPFILEHEADER,*PBITMAPFILEHEADER;,.,位图相关知识,1、位图相关数据结构,typedefstructtagBITMAPINFOHEADERDWORDbiSize;LONGbiWidth;LONGbiHeight;WORDbiPlanes;WORDbiBitCountDWORDbiCompression;DWORDbiSizeImage;LONGbiXPelsPerMeter;LONGbiYPelsPerMeter;DWORDbiClrUsed;DWORDbiClrImportant;BITMAPINFOHEADER,*PBITMAPINFOHEADER;,.,位图相关知识,1、位图相关数据结构,typedefstructtagBITMAPINFOBITMAPINFOHEADERbmiHeader;RGBQUADbmiColors1;BITMAPINFO,*PBITMAPINFO;typedefstructtagRGBQUADBYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgbReserved;RGBQUAD;,.,位图相关知识,1、位图相关数据结构,typedefstructtagBITMAPLONGbmType;/位图类型LONGbmWidth;/位图宽LONGbmHeight;/位图高LONGbmWidthBytes;/位图数据每行字节数WORDbmPlanes;/位图色平面数WORDbmBitsPixel;/位图像素的位数LPVOIDbmBits;/位图像素数据BITMAP,*PBITMAP;,.,位图相关知识,2、DIB(Device-IndependentBitmap)DDB(Device-DependentBitmap),在Windows系统中,那些以BMP或DIB为扩展名的文件都是设备无关位图文件。DIB文件由四个部分组成:BITMAPFILEHEADERBITMAPINFOHEADERRGBQUAD位图图像数据设备相关位图则通常在内存中创建,它不带调色板信息,其颜色由与它相关的设备决定。通常由CBitmap类来创建管理。,.,位图相关知识,3、CBitmap类,1、位图数据操作:intGetBitmap(BITMAP*pBitMap);DWORDSetBitmapBits(DWORDdwCount,constvoid*lpBits);DWORDGetBitmapBits(DWORDdwCount,LPVOIDlpBits)const;CSizeSetBitmapDimension(intnWidth,intnHeight);CSizeGetBitmapDimension()const;,.,位图相关知识,3、CBitMap类,2、创建位图:BOOLLoadBitmap(UINTnIDResource);BOOLCreateBitmap(intnWidth,intnHeight,UINTnPlanes,UINTnBitcount,constvoid*lpBits);BOOLCreateBitmapIndirect(LPBITMAPlpBitmap);BOOLCreateCompatibleBitmap(CDC*pDC,intnWidth,intnHeight);BOOLCreateDiscardableBitmap(CDC*pDC,intnWidth,intnHeight);,.,位图相关知识,4、CDC中相关位图操作,/将一个位图从一个DC拷贝至另一个DCBOOLBitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop);/将样式画刷相关的位图拷贝至DCBOOLPatBlt(intx,inty,intnWidth,intnHeight,DWORDdwRop);,.,位图相关知识,4、CDC中相关位图操作,intSetStretchBltMode(intnStretchMode);/将一个位图从一个DC拷贝至另一个DC,可显示压缩位图BOOLStretchBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,intnSrcWidth,intnSrcHeight,DWORDdwRop);,.,位图相关知识,4、CDC中相关位图操作,BOOLMaskBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,CBitmap,.,位图相关知识,位图应用实例,C*View:C*View()m_pMapBmp=newCBitmap;m_bEnableUpDateClientWindow=FALSE;voidC*View:OnInitialUpdate()CClientDCdc(this);intnBmpWidth=:GetSystemMetrics(SM_CXSCREEN);intnBmpHeight=:GetSystemMetrics(SM_CYSCREEN);m_pMapBmp-CreateCompatibleBitmap(,.,位图相关知识,位图应用实例,voidC*View:OnDraw(CDC*pDC)CDC*pMemDC=newCDC;if(!pMemDC-CreateCompatibleDC(pDC)return;CBitmap*pOldBmp=pMemDC-SelectObject(m_pMapBmp);if(m_bEnableUpDateClientWindow=TRUE)BeginWaitCursor();m_GMDataManage.GMF_ShowWorkSpace(pMemDC,rClient);EndWaitCursor();m_bEnableUpDateClientWindow=FALSE;pDC-BitBlt(0,0,rClient.Width(),rClient.Height(),pMemDC,0,0,SRCCOPY);pMemDC-SelectObject(pOldBmp);deletepMemDC;,.,映射模式与窗口-视口变换,窗口-视口变换通常完成逻辑坐标系和设备坐标系之间的坐标变换,在GIS软件中通常是地理坐标系(或高斯直角坐标系)与设备坐标系之间的变换。坐标变换与映射模式有着直接的关联。,.,映射模式与窗口-视口变换,CDC类中关于坐标变换的函数:/设备坐标到逻辑坐标voidDPtoLP(LPPOINTlpPoints,intnCount=1)const;voidDPtoLP(LPRECTlpRect)const;voidDPtoLP(LPSIZElpSize)const;/设备坐标到逻辑坐标voidLPtoDP(LPPOINTlpPoints,intnCount=1)const;voidLPtoDP(LPRECTlpRect)const;voidLPtoDP(LPSIZElpSize)const;,.,映射模式与窗口-视口变换,CDC类中关于坐标变换的函数:voidDPtoHIMETRIC(LPSIZElpSize)const;voidHIMETRICtoDP(LPSIZElpSize)const;voidLPToHIMETRIC(LPSIZElpSize)const;voidHIMETRICtoLP(LPSIZElpSize)const;/与映射模式和窗口、视口设置有关的主要函数virtualintSetMapMode(intnMapMode);virtualCPointSetViewportOrg(intx,inty);virtualCSizeSetViewportExt(intcx,intcy);CPointSetWindowOrg(intx,inty);virtualCSizeSetWindowExt(intcx,intcy);,.,映射模式与窗口-视口变换,例程坐标变换实例,/设备坐标转换为逻辑坐标,映射模式为MM_TEXTvoidCGDI_ExeView:ClientToDoc(CPoint,.,映射模式与窗口-视口变换,例程坐标变换实例,/逻辑坐标转换为设备坐标,注意不同映射模式的转换结果不同voidCGDI_ExeView:DocToClient(CPoint,.,映射模式与窗口-视口变换,GIS中坐标变换实例,CPointDocToClient(GMS_3DPOINT,.,映射模式与窗口-视口变换,GIS中坐标变换实例,GMS_3DPOINTClientToDoc(CPointpoint)GMS_3DPOINTdpoint;dpoint.X=(point.x-m_dDX)/m_dScale;dpoint.Y=(point.y-m_dDY)/(-m_dScale);dpoint.H=0.0;returndpoint;,.,MFC中的MVC模式,MVC模式,.,MFC中的MVC模式,MVC模式,MVC(Model-View-Controller)模式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论