12864画点函数

12864画点函数,第1张

因为你不能贴程序,所以不能很确切知道你的问题。坦此姿不过让绝你说的问题我以前遇到过,画线只出现一些点绝对是程序问题。第一,在写命令与写数据函数后增加延时;第二,也可能扒早是你写水平地址错误。注重修改打点函数,最有可能问题就在那

WINDOWS图像编程

--------------------------------------------------------------------------------

图形设备接口(GDI,Graphics Device Interface)的主要目标之一是支持在输出设备(如视频显示器、打印机和绘图仪)上的与设备无关的图形。 GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无问题地在Windows支持的任何图形输出设备上运行。

Windows中的图形基本上是由从GDI.EXE模块中输出的函数处理的(尽管一些绘制函数实际上具有USER.EXE的入口点),GDI.EXE模块调用在不同驱动程序文件中的例程,其中有一个.DRV驱动程序文件用于控制显示屏幕,并且可能有一个或多个其他的.DRV驱动程序文件用来控制打印机或绘图仪。

Windows GDI使用两种坐标系统。使用虚拟坐标系统可以使程序不依赖于具体的硬件,使用设备坐标系统可以使程序和硬件紧密相联。

GDI含有在Windows应用程序内部执行、且与设备无关的图形 *** 作函数,这些函数可产生各种各样的线、正文和位图,它们可以输出到许多不同的输出设备上。GDI允许一个应用程序产生笔、刷子、字体和位图,以供特定的输出 *** 作使用。下面列出GDI中几组比较常用的函数:

·设备上下文函数

·椭圆和多边形函数

·绘图工具函数

·位图函数

·绘图属性函数

·正文函救

·映射函数。

·坐标函数

·元文件(metafile)函数

·区域函数

·裁剪(clipping)函数·

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

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

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

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

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

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

当想要在图形输出设备(例如屏幕或打印机)上绘制图形时,必须首先获得设备上下文的句柄。先给出这个句柄,Windows才允许程序使用设备,在GDI函数中将句柄作为一个参数传入,向Windows标明需要使用的设备。

设备上下文中包含许多属性,当GDI在不同的设备上工作时都要用到这些属性。使用这些属性可使GDI只关心起始和终止坐标的大小,而不必关心有关对象的其他属性,如颜色、背景等等,因为这些都是设备上下文的一部分。当需要修改这些属性时,只需调用一个修改歼凳物设备上下文中属性的参数,以后的程序中都使用修改后的设备上下文属性。设备上下文是连接Windows应用程序、设备驱动程序以及输出设备的纽带。

获取设备上下文句柄有多种方法。最一般的方法是当处理一条消息时获得了设备上下文、并在退出窗口之前释放它。一般的处理方法如下:

在处理WM_PAINT消息时

case WM_PAINT:

hdc=BeginPaint(hwnd,&ps)

EndPaint (hwnd,&ps);

其数据结构为:

HDC hWnd;

PAINTSTRUCT ps;

而在windows.h中定义了PAINTSTRUCT的数据结构。

type struct tagPAINTSTRUCT {

HDC hdC;

BOOL fErase;

RECT rcPaint;

BOOL fRestore;

BOOL flncUpdate;

BYTE rgbReserved[16];

}PAINTSTRUCT;

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

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

hdC=GetDc (hwnd );

…画图 *** 作…

ReleaseDC (hwnd , hdc );

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

hdC=GetWindowDc(hwnd);

…画图 *** 作…

ReleaseDc(hwnd,hdc);

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

hdc=CreateDC (lpszDriver ,lpszDevice ,lpszOutput , lpData);

…画图 *** 作…

ReleaseDC(hdc);

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

hdc=CreateDC("DISPLAY",NULL,NULL,NULL);

使用屏幕画图,而:

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

在打印机上输出图形,这里的lpData置为默认值,可以在WIN.INI中找到初始化值。

如果不需要获取设备上下文,即不需要在设备上下文中 *** 作,只需了解有关设备上下文的信息,可以用如下语句:

hdcInfo = CreateDC (lpszDriver, lpszDevice,lpszOutput, lpData );

……

DeteteDC (hdcInfo);

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

hdcMem = CreateCompatibleDC (hdc)

OeleteDc(hdcMem );

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

hdcMeta=CreateMetaFile(lpszFilename);

……

hmf=CloseMetaFile(hdCMeta);

在元文件设备上下文有效期间,使用hdcMeta所进行的任何GDI调用都成为元文件的一部分,当调用CloseMetaFile时,设备上下文句柄变化无效,函数返回元文件(hmf)的句柄。

一个设备上下文通常涉及物理设备,如视频显示器、打印机等,所以需要获取有关该设备的信息,如显示器大小和彩色能力等。可以通过调用GetDeviceCaps函数来获取这样的信息:

nValue=GetDeviceCaps (hdc,nIndex);

这里的hdc标识设备上下文,nIndex确定返回值,它可以是window.h中所定义的28个标识符中的一个,例如nIndex=DRIVEVERSION,则该函数返回的是版本号。

真正影响在用户区域上绘制过程的设备上下文属性是“映射方式”,与映射方式属性密切相关的还有如下四个设备上下义属性:窗口原点、视窗原点、窗口范围和视窗范围。

Windows定义了八种映射方式,即:

这里的TWIP指的是1/1440英寸,in.代表英寸。

可以调用函数setMapMode(hdc,MapMode)来设置这八种映射方式中的一种。hdc用来标识设备上下文,nMapMode可以取MM_TEXT、MM_LOMETRIC、MM_HIMETRIC等八个值中的一个。在设置了映射方式之后,到下一次设置映射方式之前,Windows一直使用这种映射方式。如果想要获取当前的映射方式,可用:

nMapMode= GetMapMode (hdc)

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

SetMapMode(hdc ,MM_TEXT);

TextOut(hdc,8 ,16,szBuffer ,nLength)

即正文从用户区域左起第八个象素,顶边起第16个象素的位置开始写 *** 作。不管映射方式如何,Windows函数中所有坐标规定为-32768 到 32767之间的带符号短整救。

注意映射方式只是一个设备上下文属性,因此映射方式唯一起作用的是将映射方式作为设备上下文句柄属性,而将该句柄当作参数的GDI函数,因此象GetSystemMetrics这样的非GDI函数,将继续以设备单位(象素值)返回尺寸值。

用GDI的SetPixel函数可以绘制一特定颜色的象素:

rgbActualColor =SetPixel (hdc,x,y,rgbColor);

这里hdc标识设备上下文,x ,y表示点坐标,rgbColor为一无符号的长整数,其结构为:

COLORREF rgbColor;

其中低位字节为红基色的相对亮度值,第二个字节包含绿基色的相对亮度值,第三个字节包含蓝基色的相对亮度值,高位字节必须为零。可以使用RGB函数来获取rgbColor。

rgbColor =RGB(byRed ,byGreen,byBlue);

这里的byRed、byGreen、byBlue取值范围为0~255,分别代表红色、绿色、蓝色的亮度。给出正确的参数之后,SetPixel返回的是调色板中最靠近所需彩色的颜色。还可以使用如下方法来取得一个特定象素的颜色:

rgbCotor= GetPixel(hdc,x,y);

画线函数主要有三种, LineTo、Polyline 和 Arc。还有五个设备上下文属性会影响这些函数画出的线的外观:笔的当前位置(仅对LineTo有影响)、笔、背景方式(对非实心笔有影响)、背景颜色(对 OPAQUE背景方式)以及绘制方式。

在这些设备上下文的属性中,笔的当前位置影响画线的起点,笔影响线的粗细等形状,背景方式影响非实心笔画出的线的模板图形,背景颜色影响线模板背景色,绘制方式影响实心线、虚线等线属性。

以下是典型的画线 *** 作步骤:

MoveTo(hdc,xStart,yStart);

LineTo(hdc ,xEnd ,yEnd);

上面两句画出一条从(xStart,yStart)到(xEnd,yEnd)的直线。

可以使用语句:

dwPoint = GetCurrentPosition (hdc);

获得笔的当前位置。这里,dwPoint返回值是一个无符号长整数(或双倍长字),其中低位字含有X坐标,高位字含有Y坐标。

可以使用MAKEPOINT函数将dwPoint转换为POINT结构;

point = MAKEPOINT (dwPoint);

point的类型为POINT:

typedef struct togPOINT {kk1}

int x;

int y;

}POINT;

Polyline用于绘制折线,例:

Polyline(hdc,&pt,5)

将数组pt中的5个点之间用线段相连。

Arc用于画椭圆的周边:

Arc (hdc,xLeft,yTop,xRight,yBottom,xStart,yStart,XEnd,yEnd );

画出的椭圆以左上角为(xLeft,yTop),右下角为(xRight,yBottom)的矩形为界,圆弧开始于椭圆和(xStart,yStart)与椭圆中心的连线的交点处,沿着椭圆周边的过时针方向绘制,并终止于椭圆和(xEnd,yEnd)与椭圆中小的连线的交点处。

当调用LineTo、Polyline和Arc时,Windows使用当前在设备上下文中选择的笔来画线,笔决定了线的颜色、密度和型式,而线型可以是实线、点线或短划(虚)线,缺省设备上下文中的笔叫做BLACK_PEN,不管映射方式如何选支笔以一个象素的宽度画黑色的实线, BLACK_PEN是Windows提供的三支“备用笔”之一,其他两支是WHITE_PEN和NULL_PEN,NULL_PEN是一支什么都不画的空笔,当然用户也可以自己建立定制的笔。

可以通过一个句柄来引用所需的笔:

HPEN hPen;

hPen =GetStockObject(WHITE_PEN);

SelectObjeCt (hdc ,hPen) ;

SelectObject (hdc , hBrush ) ;

将逻辑刷送入设备上下文中。如果使用结束,可以用:

DeletObject (hBrush ) ;

删除一把已建立的刷子,如果在程序中需要获取有关于刷子的信息,则可以调用:

3.像素格式结构

每个OpenGL显示设备都支持一种指定的像素格式。一般用一个名为PIXELFORMATDESCRIPTOR的结构来表示某个特殊的像素格式,这个结构包含26个属性信息。Win32定义PIXELFORMATDESCRIPTOR如下所示:

typedef struct tagPIXELFORMATDESCRIPTOR

{ kk1}

// pfd

WORD nSize;

WORD nVersion;

DWORD dwFlags;

BYTE iPixelType;

BYTE cColorBits;

BYTE cRedBits;

BYTE cRedShift;

BYTE cGreenBits;

BYTE cGreenShift;

BYTE cBlueBits;

BYTE cBlueShift;

BYTE cAlphaBits;

BYTE cAlphaShift;

BYTE cAccumBits;

BYTE cAccumRedBits;

BYTE cAccumGreenBits;

BYTE cAccumBlueBits;

BYTE cAccumAlphaBits;

BYTE cDepthBits;

BYTE cStencilBits;

BYTE cAuxBuffers;

BYTE iLayerType;

BYTE bReserved;

DWORD dwLayerMask;

DWORD dwVisibleMask;

DWORD dwDamageMask;

} PIXELFORMATDESCRIPTOR;

4.初始化PIXELFORMATDESCRIPTOR结构

PIXELFORMATDESCRIPTOR中每个变量值的具体含义和设置可以参考有关资料,下面举出一个PIXELFORMATDESCRIPTOR初始化例子来简要说明相关变量的意义。定义PIXELFORMATDESCRIPTOR结构的pfd如下:

PIXELFORMATDESCRIPTOR pfd = { kk1}

sizeof(PIXELFORMATDESCRIPTOR), . //size of this pfd 1

PFD_DRAW_TO_WINDOW| // support window

PFD_SUPPORT_OPENGL| // support OpenGL

PFD_DOUBLEBUFFER, // double buffered

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth

0,0,0,0,0,0, // color bits ignored

0, // no alpha buffer

0, // shift bit ignored

0, // no accumulation buff

0,0,0,0, // accum bits ignored

32, // 32-bit z-buffer

0, // no stencil buffer

0, // no auxiliary buffer

PFD_MAIN_PLANE, // main layer

0, // reserved

0,0,0 // layer masks ignored

};

在这个结构里,前两个变量的含义十分明显。第三个变量dwFlags的值是

PFD_DRAW_TO_WINDOW |PFD_SUPPORT_OPENGL ,

表明应用程序使用OpenGL函数来绘制窗口

第四个:

PFD_DOUBLEBUFFER,

表明当前采用RGBA颜色模式,第五个采用24位真彩色,既1.67千万种颜色,如果是256色系统则自动实现颜色抖动;因为没有使用alpha缓存和累计缓存,所以从变量cAlphaBits到cAccumAlphaBits都设置为0;深度缓存设置为32位,这个缓存能解决三维场景的消隐问题;变量cAuxBuffers设置为0,在Windows 95下不支持辅助缓存;Windows 95下针对OpenGL变量ilayerType只能设置为PFD_MAIN_PLANE,但在其它平台也许支持PFD_MAIN_PLANE或PFD_MAIN_UNDERLAYPLANE;接下来bReserved变量只能设为0,而最后三个变量Windows 95都不支持,故全设置为0。

void far putpixel(int x,int y,int pixelcolor)

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理粗差低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多核滚低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准改凳余规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12448348.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存