您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 图形设备接口及绘图(PPT66页)
§3Windows图形设备接口及绘图1.响应WM_PAINT消息2.图形设备接口(GDI)3.使用设备描述表3.获取设备描述表句柄5.CDC及其派生类6.使用CDC成员函数绘制文本7.使用CDC成员函数绘制图形8.正确使用GDI对象9.设备坐标与逻辑坐标10.OpenGL绘图实验作业1.习题2,3,41.WM_PAINT消息的产生无效矩形打开一个窗口改变窗口大小移动窗口切换窗口最小化、最大化窗口调用InvalidateRect函数调用UpdateWindow函数2.响应WM_PAINT消息OnPaint§3.1响应WM_PAINT消息§3.2图形设备接口(GDI)1.图形设备接口—提供专门的数据结构即设备描述表(DC)和对DC操作的绘图函数。2.设备描述表(DC)—用于代表图形输出设备如显示屏、打印机;3.设备无关性—利用GDI,所有的绘图操作都对设备描述表而不是具体的物理设备。设备描述表•一种专门用于代表图形输出设备(如屏幕、打印机和绘图仪等)的数据结构–画布–绘图工具(设备描述表属性)•使用句柄(HDC)访问设备描述表–设置设备描述表属性–绘制图形和文本设备描述表属性缺省值设置属性值函数获取属性值函数映射方式MM_TEXTSetMapModeGetMapMode窗口原点(0,0)SetWindowOrgGetWindowOrgOffsetWindowOrg视口原点(0,0)SetViewportOrgGetViewportOrgOffsetViewportOrg窗口限度(1,1)SetWindowExtGetWindowExtSetMapMode视口限度(1,1)SetViewportExtGetViewportExtSetMapMode画笔BLACK_PESelectObjectSelectObject画刷WHITE_BRUSHSelectObjectSelectObject字模SISTEM_FONTSelectObjectSelectObject位图NONESelectObjectSelectObject当前画笔位置(0,0)MoveToLineToGetCurrentPosition背景方式OPAQUESetBkModeGetBkMode背景色彩WhiteSetBkColorGetBkColor文本色彩BlackSetTextColorGetTextColor作图方式R2_COPYPENSetROP2GetROP2伸展方式BLACK_ONWHIESetPollyFillModeGetPollyFillMode多边形填充方式ALTERNATESetPollyFillModeGetPollyFillMode字符间距0SetTextCharacterExtraGetTextCharacterExtra画刷原点(0,0)屏幕坐标SetBrushOrgGetBrushOrg裁剪区NONESelectObjectSelectClipRgnIntersectClipRectOffsetClipRgnExcludeClipRectSelectObjectGetClipBox设备描述表属性GDI对象•画笔•画刷•字体•位图•裁剪区caseWM_PAINT:hdc=BeginPaint(hWnd,&ps);RECTrt;GetClientRect(hWnd,&rt);SetTextColor(hdc,RGB(255,0,0));SetBkColor(hdc,RGB(0,0,255));DrawText(hdc,szHello,strlen(szHello),&rt,DT_CENTER);EndPaint(hWnd,&ps);break;(1)获取设备描述表句柄(2)设置设备描述表属性(3)调用绘图函数绘图(4)释放设备描述表3.3使用设备描述表绘图1.BeginPaint和EndPaint函数(1)BeginPaintfunction•准备在窗口绘图•获得代表窗口的设备描述表句柄•把有关绘图的信息放到PAINTSTRUCT结构变量中。•响应WM_PAINT消息绘图,必须调用该函数获取设备描述表句柄。3.4获取窗口设备描述表句柄HDCBeginPaint(HWNDhwnd,//handletowindowLPPAINTSTRUCTlpPaint//pointertostructureforpaintinformation);•函数原型:PAINTSTRUCT•typedefstructtagPAINTSTRUCT{HDChdc;BOOLfErase;RECTrcPaint;BOOLfRestore;BOOLfIncUpdate;BYTErgbReserved[32];}PAINTSTRUCT•标志对指定窗口的绘图结束•释放设备描述表句柄•必须与BeginPaint函数成对调用•函数原型BOOLEndPaint(HWNDhWnd,CONSTPAINTSTRUCT*lpPaint);(2)EndPaintfunction2.GetDC和RealeaseDC函数(1)GetDCfunction获取窗口设备描述表句柄用于响应非WM_PAINT消息绘图。函数原型:HDCGetDC(HWNDhWnd);(2)ReleaseDCfunction释放设备描述表句柄必须与GetDC函数成对调用函数原型:intReleaseDC(HWNDhWnd,//handletowindowHDChDC//handletodevicecontext);3.5CDC及其派生类CDC:封装了所有与设备描述表有关的数据和操作。绘图函数:Ellipse()…文本输出:TextOut()…设置设备描述表属性:SelectObject(),SetTextColor()…数据成员m_hdc:设备描述表句柄。CPaintDC:constructionCWnd::BeginPaintdestructionCWnd::EndPaintCClientDC:constructionCWnd::GetDCdestructionCWnd::ReleaseDCCWindowDCGetWindowDCReleaseDC3.6GDI对象与CGDIObject类•GDI对象与句柄•使用GDI对象•使用CGDIObject类句柄对象HGDIOBJ所有GDI对象HBRUSH画刷HPEN画笔HBITMAP位图HRGN区域HPALETTE调色板GDI对象与句柄使用GDI对象基本规则(1)创建对象(2)用SelectObject函数把新创建的对象选入设备描述表,并保留原对象(3)完成绘图函数的调用后,把旧对象选入设备描述表,置换出创建的对象(4)删除创建的对象,由DeleteObject函数完成caseWM_PAINT:hdc=BeginPaint(hWnd,&ps);HPENhNewPen,hOldPen;hNewPen=CreatePen(PS_DASH,1,RGB(255,0,0));hOldPen=(HPEN)SelectObject(hdc,hNewPen);MoveToEx(hdc,0,0,NULL);LineTo(hdc,100,100);hNewPen=(HPEN)SelectObject(hdc,hOldPen);DeleteObject(hNewPen);EndPaint(hWnd,&ps);break;使用CGDIObject类•数据成员m_hObject•Attach函数Detach函数•派生类:CPen、CBrush、CFont、CBitmap、CPallete和CRgn类逻辑坐标系TextOut(hdc,x,y,szBuffer,nLength)设备坐标系屏幕坐标系窗口坐标系窗口工作区坐标系视口(设备坐标)与窗口(逻辑坐标)§3.7设备坐标与逻辑坐标映像模式定义了逻辑坐标与设备坐标的转换CDC::SetMapMode();映射模式逻辑单元坐标轴方向MM_TEXT象素X:向右Y:向下MM_ISOTROPIC任意(X=Y)X:向右Y:向上MM_ANISOTROPIC任意(X!=Y)X:向右Y:向上MM_HIENGLISH0.001英寸X:向右Y:向上MM_HIMETRIC0.01MMX:向右Y:向上MM_LOENGLISH0.01英寸X:向右Y:向上MM_LOMETRIC0.1MMX:可选Y:可选MM_TWIPS1/1440英寸X:可选Y:可选•窗口原点和视口原点–调整逻辑坐标的原点•窗口限度和视口限度–调整逻辑坐标轴的方向和单位•逻辑坐标与设备坐标的转换公式–xViewport=(xWindow-xWinOrg)*(xViewExt/xWinExt)+xViewOrg;–yViewport=(yWindow-yWinOrg)*(yViewExt/yWinExt)+xViewOrg;•设置逻辑坐标系的原点–SetViewportOrgEx函数BOOLSetViewportOrgEx(HDChdc,//设备描述表句柄intX,//使用设备单位,视口原点的X坐标值intY,//使用设备单位,视口原点的Y坐标值LPPOINTlpPoint//指向POINT结构变量,存放原始的视口原点坐标);SetViewportOrgEx(hdc,cx/2,cy/2,NULL);–SetWindowOrgExBOOLSetWindowOrgEx(HDChdc,//设备描述表句柄intX,//使用逻辑单位,窗口原点的X坐标值intY,//使用逻辑单位,窗口原点的Y坐标值LPPOINTlpPoint//指向POINT结构变量,存放原始的窗口原点坐标)•SetWindowOrgEx(hdc,-cx/2,-cy/2,NULL);1.设置映射方式MM_ANISOTROPIC,MM_ISOTROPIC(做适当调整)2.设置窗口限度SetWindowExt()BOOLSetWindowExtEx(HDChdc,//设备描述表句柄intnXExtent,//新设置的水平方向窗口限度intnYExtent,//新设置的垂直方向窗口限度LPSIZElpSize//原始窗口限度);任意逻辑坐标系的设置3.设置视口限度BOOLSetViewportExtEx(HDChdc,//设备描述表句柄intnXExtent,//新设置的水平方向视口限度intnYExtent,//新设置的垂直方向视口限度LPSIZElpSize//原始视口限度);坐标系的转换1.DPToLP()2.LPToDP()3.ClientToScreen()4.ScreenToClient()3.8使用CDC类绘制图形•绘制点和线–COLORREFSetPixel(POINTpoint,COLORREFcrColor);–CPointMoveTo(POINTpoint);–BOOLLineTo(POINTpoint);–BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);–BOOLAngleArc(intx,inty,intnRadius,floatfStartAngle,floatfSweepAngle);–BOOLPolyline(LPPOINTlpPoints,intnCount);–BOOLPolyPolyline(constPOINT*lpPoints,constDWORD*lpPolyPoints,intnCount);–BOOLPolyBezier(constPOINT*lpPoints,intnCount);•绘制封闭图形–BOOLEllipse(LPCRECTlpRect);–BOOLRectangle(LPCRECTlpRect)–BOOLRoundRect(LPCRECTlpRect,POINTpoint);–BOOLPie(LPCRECTlpRect,POINTptStart,POINTptEnd);–BOOLPolygon(LPP
本文标题:图形设备接口及绘图(PPT66页)
链接地址:https://www.777doc.com/doc-1310201 .html