Windows图像编程概要

这篇博客详细介绍了Windows图形设备接口(GDI)的工作原理,包括设备上下文、映射方式、坐标系统、绘图操作如画线、填充、位图处理等,并讨论了如何在窗口中进行图形输出,涉及各种函数的使用和设备属性的设置。GDI通过设备无关的方式,确保Windows应用程序能在不同输出设备上正常工作。
摘要由CSDN通过智能技术生成

图形设备接口(GDIGraphics Device Interface)的主要目标之一是支持在输出设备(如视频显示器、打印机和绘图仪)上的与设备无关的图形。 GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无问题地在Windows支持的任何图形输出设备上运行。Windows中的图形基本上是由从GDIEXE模块中输出的函数处理的(尽管一些绘制函数实际上具有USEREXE的入口点),GDIEXE模块调用在不同驱动程序文件中的例程,其中有一个.DRV驱动程序文件用于控制显示屏幕,并且可能有一个或多个其他的.DRV驱动程序文件用来控制打印机或绘图仪。Windows GDI使用两种坐标系统。使用虚拟坐标系统可以使程序不依赖于具体的硬件,使用设备坐标系统可以使程序和硬件紧密相联。GDI含有在Windows应用程序内部执行、且与设备无关的图形操作函数,这些函数可产生各种各样的线、正文和位图,它们可以输出到许多不同的输出设备上。GDI允许一个应用程序产生笔、刷子、字体和位图,以供特定的输出操作使用。下面列出GDI中几组比较常用的函数:

·设备上下文函数

·椭圆和多边形函数

·绘图工具函数

·位图函数

·绘图属性函数

·正文函救

·映射函数。

·坐标函数

·元文件(metafile)函数

·区域函数

·裁剪(clipping)函数·

窗口应用程序输出图形的操作步骤如下:

①取得指定窗口的当前显示设备上下文,显示设备上下文实际上是一个数据结构,它包括该窗口的参数及各种图形、文字属性的现行设定值,它们对以后的图形、文字输出命令起控制作用。

②选择用户坐标系及映射方式。

③设定用户坐标系中的观察窗口和设备坐标系中的显示视区。

④输出图形、文字和图象。

⑤释放所使用的显示设备上下文。

当想要在图形输出设备(例如屏幕或打印机)上绘制图形时,必须首先获得设备上下文的句柄。先给出这个句柄,Windows才允许程序使用设备,在GDI函数中将句柄作为一个参数传入,向Windows标明需要使用的设备。设备上下文中包含许多属性,当GDI在不同的设备上工作时都要用到这些属性。使用这些属性可使GDI只关心起始和终止坐标的大小,而不必关心有关对象的其他属性,如颜色、背景等等,因为这些都是设备上下文的一部分。当需要修改这些属性时,只需调用一个修改设备上下文中属性的参数,以后的程序中都使用修改后的设备上下文属性。设备上下文是连接Windows应用程序、设备驱动程序以及输出设备的纽带。获取设备上下文句柄有多种方法。最一般的方法是当处理一条消息时获得了设备

上下文、并在退出窗口之前释放它。一般的处理方法如下:

在处理WM_PAINT消息时

case WM_PAINT

hdc=BeginPainthwnd&ps

       //代码

EndPaint hwnd&ps);

其数据结构为:

HDC hWnd

PAINTSTRUCT ps

而在windowsh中定义了PAINTSTRUCT的数据结构。

type struct tagPAINTSTRUCT {

HDC hdC

BOOL fErase

RECT rcPaint

BOOL fRestore

BOOL flncUpdate

BYTE rgbReserved[16]

PAINTSTRUCT

其中,hdc用于标识显式上下文,fErase指出背景是否重画,rcPaint是涂色矩形,其余的域均为保留。这里的hdcBeginPaint返回的设备上下文句柄,有了从BeginPaint获取的设备上下文句柄,就可以也只能在ps指出的rcPaint的矩形内绘图,EndPaint调用使这一区域有效。

第二种方法如下所示,使用这种方法获取和释放设备上下文可以在整个用户区内画图,图形在整个用户区域内都有效:

hdCGetDc hwnd );

…画图操作…

ReleaseDC hwnd hdc );

使用下面第三种方法获取和释放设备上下文,可以在整个窗口内画图,图形在整个窗口内有效:

hdC=GetWindowDchwnd);

…画图操作…

ReleaseDchwndhdc);

使用下面第四种方法获取和释放设备上下文,可以在整个显示器区域内画图,图形在整个显示器区域内部有效:

hdcCreateDC lpszDriver lpszDevice lpszOutput lpData);

…画图操作…

ReleaseDChdc);

其中lpszDriver指向设备驱动程序的DOS文件名(不带扩展名),lpszDevice指向专用设备名(例如Epson Fx-80),lpszOutput指向物理输出介质(文件或输出端口)的DOS文件名或设备名,lpData指向含有设备驱动程序的设备专用的初始化数据的DEVMODE数据结构。例如:

hdcCreateDC"DISPLAY"NULLNULLNULL);

使用屏幕画图,而:

hdc= CreateDC "IBMGRX""IBM Graphics""LPT1"NULL );

在打印机上输出图形,这里的lpData置为默认值,可以在WININI中找到初始化值。如果不需要获取设备上下文,即不需要在设备上下文中操作,只需了解有关设备上

下文的信息,可以用如下语句:

hdcInfo CreateDC lpszDriver lpszDevicelpszOutput lpData );

 

……

DeteteDC hdcInfo);

另外,还可以使用设备上下文来对位图的内存进行控制,如下所示:

hdcMem CreateCompatibleDC hdc

DeleteDchdcMem );

一个元文件是以二进制形式编码的GDI调用集合,可通过获取一个元文件设备上下文来建立一个文件:

hdcMeta=CreateMetaFilelpszFilename);

……

hmf=CloseMetaFilehdCMeta);

在元文件设备上下文有效期间,使用hdcMeta所进行的任何GDI调用都成为元文件的一部分,当调用CloseMetaFile时,设备上下文句柄变化无效,函数返回元文件(hmf)的句柄。一个设备上下文通常涉及物理设备,如视频显示器、打印机等,所以需要获取有关该设备的信息,如显示器大小和彩色能力等。可以通过调用GetDeviceCaps函数来获取这样的信息:nValue=GetDeviceCaps hdcnIndex);

这里的hdc标识设备上下文,nIndex确定返回值,它可以是windowh中所定义的28个标识符中的一个,例如nIndex=DRIVEVERSION,则该函数返回的是版本号。真正影响在用户区域上绘制过程的设备上下文属性是“映射方式”,与映射方式属性密切相关的还有如下四个设备上下义属性:窗口原点、视窗原点、窗口范围和视窗范围。Windows定义了八种映射方式。可以调用函数setMapModehdcMapMode)来设置这八种映射方式中的一种。hdc用来标识设备上下文,nMapMode可以取MM_TEXTMM_LOMETRICMM_HIMETRIC等八个中的一个。在设置了映射方式之后,到下一次设置映射方式之前,Windows一直使用

这种映射方式。如果想要获取当前的映射方式,可用:

nMapMode GetMapMode hdc

在设置了映射方式之后,就规定了逻辑单位的大小和增量的方式,在GDI画图函数中,可以不必考虑这些内容而直接使用逻辑数字,如:

SetMapModehdc MM_TEXT);

TextOuthdc8 16szBuffer nLength

即正文从用户区域左起第八个象素,顶边起第16个象素的位置开始写操作。不管映射方式如何,Windows函数中所有坐标规定为-32768 32767之间的带符号短整救。注意映射方式只是一个设备上下文属性,因此映射方式唯一起作用的是将映射方式作为设备上下文句柄属性,而将该句柄当作参数的GDI函数,因此象GetSystemMetrics这样的非GDI函数,将继续以设备单位(象素值)返回尺寸值。

GDISetPixel函数可以绘制一特定颜色的象素:

rgbActualColor SetPixel hdc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值