您好,欢迎访问三七文档
Windows编程技术图形输出图形输出简介Windows应用程序不支持标准输出流(例如printf或cout)之类的输出函数,应用程序输出包括文字在内的所有数据均是以图形方式输出的,即数据“绘制”到窗口上。Windows通过图形设备接口GDI对图形输出进行支持。GDI由几百个函数和与此相关的数据类型、宏定义和结构体组成。主要有:获取和释放(或创建和删除)设备描述表函数、获取设备信息函数、使用GDI绘图对象函数、绘图函数、设置和获取设备参数函数等,其显示的图形类型(简称图元)有:直线、曲线、填充、位图、文本等。wingdi.h设备场境(1)设备场景指Windows对图形显示设备封装后形成的统一虚拟图形显示设备。用一个包含各种设备属性的数据结构来表示,称为设备场境,又称设备上下文,简称DC(devicecontent),可以用来输出图形。当程序员想在一个图形输出设备(例如屏幕或者打印机)上绘图时,必须首先获得设备场境句柄,然后以此为参数调用GDI函数绘图。Windows提供了几种获取设备场境句柄的方法。如果在处理一条消息时获取了设备场境句柄,那么应该在退出窗口过程WndProc之前释放它或者删除它。一旦释放了DC句柄,它就不能再使用了。设备场景(2)显示设备驱动程序图形设备接口GDI应用程序设备场境DC显示器图形图形设备场景(3)获取设备场境句柄的方法:1.处理WM_PAINT消息时,使用BeginPaint和EndPaint调用:hdc=BeginPaint(hWnd,&ps);//客户区准备绘图//GDI绘图调用......EndPaint(hWnd,&ps);//客户区绘图结束2.处理非WM_PAINT消息时获取设备场境句柄:hdc=GetDC(hWnd);//hdc得到客户区DC句柄//GDI绘图调用......ReleaseDC(hWnd,hdc);//释放客户区DC句柄设备场景(4)获取设备场境句柄的方法:3.获取整个窗口的设备场境句柄hdc=GetWindowDC(hWnd);//hdc得到窗口DC句柄//GDI绘图调用......ReleaseDC(hWnd,hdc);//释放窗口DC句柄4.hdc=CreateDC(lpszDriver,lpszDevice,lpszOutput,lpInitData);//hdc得到设备DC句柄//GDI绘图调用......DeleteDC(hdc);//删除设备DC句柄GDI绘图对象(1)GDI绘图对象是绘制图形的工具。工具类型说明画笔(Pen)画笔工具定义了绘制图形和文字所使用的宽度、颜色和线条类型。画刷(Brush)画刷工具定义了用于填充形状的图案和颜色。字体(Font)字体工具定义了绘制文本所使用的字体。调色板(Palette)调色板工具定义了在给定设备上绘制图形的颜色系统。裁剪区(Region)裁剪区工具定义了用于绘制复杂图形的裁剪区域。位图(Bitmap)位图工具定义了输出图形的图像数据。GDI绘图对象(2)GDI绘图对象的使用必须按如下步骤进行:①创建绘图对象或调用GetStockObject获取预定义绘图对象。②调用SelectObject将绘图对象选进设备场境DC中。③调用DeleteObject删除绘图对象(GetStockObject获取的对象除外)。创建和删除绘图对象一般有两个时机。一个时机是在WM_CREATE消息处理中创建绘图对象,在WM_DESTROY消息处理中删除绘图对象,即在窗口建立时创建对象,窗口销毁时删除对象。另一个时机是在设备场境句柄有效期间,例如在BeginPaint、GetDC、GetWindowDC、CreateDC、CreateCompatibleDC之后创建绘图对象,在EndPaint、ReleaseDC、DeleteDC之后删除绘图对象。Windows规定不能删除设备场境当前选择的绘图对象。GDI绘图对象(3)创建函数功能CreatePen创建逻辑画笔。CreatePenIndirect用给定的LOGPEN结构创建逻辑画笔。CreateSolidBrush创建逻辑画刷。CreatePatternBrush用给定的位图句柄创建画刷。CreateHatchBrush创建有阴影线的画刷。CreateDIBPatternBrushPt用给定的设备无关位图创建画刷。CreateBrushIndirect用给定的LOGBRUSH结构创建画刷。CreateBitmapIndirect创建以BITMAP结构数据为基础的位图。CreateBitmap创建以颜色值组成的数据块为基础的位图。CreateCompatibleBitmap创建与设备兼容的内存位图。CreateFont创建逻辑字体。CreateFontIndirect用给定的LOGFONT结构创建字体。CreatePalette创建逻辑调色板。CreateHalftonePalette创建半色调调色板。CreateRectRgn创建矩形裁剪区。CreateEllipticRgn创建椭圆形裁剪区。CreateEllipticRgnIndirect用给定的RECT结构创建椭圆形裁剪区。CreatePolygonRgn创建多边形裁剪区。CreatePolyPolygonRgn在多边形基础上创建裁剪区。CreateRectRgnIndirect用给定的RECT结构创建矩形裁剪区。CreateRoundRectRgn创建带圆角的矩形裁剪区。GDI绘图对象(4)Windows系统在应用程序初始化时提供了一套默认的绘图工具,例如默认的画笔工具颜色是黑色,所以这时绘制出来的线条都是黑色的。如果应用程序认为默认绘图工具不适用的话,则需要另行创建绘图对象,并将其选进设备场境中,函数原型为:HGDIOBJSelectObject(HDChdc,HGDIOBJhgdiobj);如:hPen=CreatePen(PS_SOLID,4,RGB(255,0,255));//创建紫色画笔hOldPen=SelectObject(hdc,hPen);//将画笔选进DC中,此后画线均用此画笔,直到另选画笔为止LineTo(hdc,300,100);//画紫色线hbr=CreateSolidBrush(RGB(255,0,0));//创建红色画刷hOldBrush=SelectObject(hdc,hbr);//将画刷选进DC中,此后填充均用此画刷,直到另选画刷为止Rectangle(hdc,300,100,400,200);//画矩形框且填充红色GDI绘图对象(5)画文字//在指定坐标开始输出cbString个字符,如果输出全部字符串,cbString设为-1BOOLTextOut(HDChdc,intnXStart,intnYStart,LPCTSTRlpString,intcbString);//在一个矩形范围内输出字符串,uFormat值表示使用对齐等格式intDrawText(HDChDC,LPCTSTRlpString,intnCount,LPRECTlpRect,UINTuFormat);//设置文本颜色COLORREFSetTextColor(HDChdc,COLORREFcrColor);//设置文本背景颜色COLORREFSetBkColor(HDChdc,COLORREFcrColor);//设置文本字符间距intSetTextCharacterExtra(HDChdc,intnCharExtra);//设置文本对齐方式UINTSetTextAlign(HDChdc,UINTfMode);//设置背景色模式,iBkMode=OPAQUE使用背景色,iBkMode=TRANSPARENT背景是透明的intSetBkMode(HDChdc,intiBkMode);GDI绘图对象(6)画位图和图标1.hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(IDB_PICTURE));//加载位图资源2.GetObject(hBmp,sizeof(BITMAP),&bm);//bm.bmWidth,bm.bmHeight分别为宽和高3.hdcMem=CreateCompatibleDC(hdc);//创建内存DChOldBmp=(HBITMAP)SelectObject(hdcMem,hBmp);//位图选进内存DC4.//等比复制hdcSrc的图形到hdcDest中,dwRop表示像素光栅运算模式BOOLBitBlt(HDChdcDest,intnXDest,intnYDest,intnWidth,intnHeight,HDChdcSrc,intnXSrc,intnYSrc,DWORDdwRop);//拉伸复制hdcSrc的图形到hdcDest中,dwRop表示像素光栅运算模式BOOLStretchBlt(HDChdcDest,intnXOriginDest,intnYOriginDest,intnWidthDest,intnHeightDest,HDChdcSrc,intnXOriginSrc,intnYOriginSrc,intnWidthSrc,intnHeightSrc,DWORDdwRop);5.BOOLDrawIcon(HDChDC,intX,intY,HICONhIcon);事件处理-----菜单LRESULTOnCommand(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){//命令消息处理WORDwID;wID=LOWORD(wParam);//菜单项标识或快捷键命令标识switch(wID){caseIDM_ABOUT://软件简介MessageBox(hWnd,菜单消息演示\n版本:1.01,软件简介,MB_OK);break;caseIDM_EXIT://退出DestroyWindow(hWnd);break;default://其他菜单调用默认处理returnDefWindowProc(hWnd,message,wParam,lParam);}return0;//处理了这条消息后必须返回0}菜单命令既可以使用按键选项,又可以使用鼠标选项,还可以使用快捷键来操作。无论何种操作方式,一旦执行菜单命令就产生WM_COMMAND消息,随消息传来的wParam参数低16位值,即LOWORD(wParam)为菜单项或快捷键资源标识。菜单事件响应需要增加WM_COMMAND消息处理,其函数结构如下:事件处理-----菜单LRESULTOnCommand(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){//命令消息处理WORDwID;wID=LOWORD(wParam);//菜单项标识或快捷键命令标识switch(wID){caseIDM_ABOUT://软件简介MessageBox(hWnd,菜单消息演示\n版本:1.01,软件简介,MB_OK);break;caseIDM_EXIT://退出DestroyWindow(hWnd);break;default://其他菜单调用默认处理returnDefWindowProc(hWnd,message,wParam,lParam);}return0;//处理了这条消息后必须返回0}菜单命令既可以使用按键选项,又可以使用鼠标选项,还可以使用快捷键来操作。无论何种操作方式,一旦执行菜单命令就产生WM_COMMAND消息,随消息传来的wParam参数低16位值,即LOWORD(wParam)为菜单项或快捷键资源标识。菜单事件响应需要增加WM_COMMAND消息处理,其函数结构如下:事件处理-----鼠标当用户移动鼠标或按动鼠标时会产生鼠标事件。鼠标在屏幕上显示为光标,光标有一个指向屏幕上位置的单个像素的“热点”,通常将热点的位置作为鼠标在屏幕上的位置。根据鼠标消息发生时鼠标所处的位置,鼠标消息分为客户区鼠标消息和非客户区鼠标消
本文标题:图形输出
链接地址:https://www.777doc.com/doc-3567110 .html