win32(6)--GDI绘图基础

来源:互联网 发布:广联达破解软件下载 编辑:程序博客网 时间:2024/05/16 04:35

GDI概念:(图形设备接口Graphics Device Interface)

GDI是图形设备接口,微软设计的一套API,负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。GDI的出现使程序员无需关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,方便了开发工作。

GDI的特点:

  1. 不允许程序直接访问物理显示硬件,通过称为“设备环境”的抽象接口间接访问显示硬件;
  2. 程序需要与显示硬件(显示器、打印机等) 进行通讯时,必须首先获得与特定窗口相关联的设备环境;
  3. 用户无需关心具体的物理设备类型;
  4. Windows参考设备环境的数据结构完成数据的输出。

 

设备环境:(DC:Device Context)

简称DC,也叫做设备上下文,设备描述表。DC就是程序可以进行绘图的地方。例如我们要在屏幕上绘图,设备就是屏幕,DC就是屏幕上的绘图层。

设备句柄:设备上下文句柄,设备环境句柄,简称HDC。如果需要绘图,首先得得到句柄,绘图完成之后必须释放句柄。

获取HDC的几个方法:

  • 在WM_PAINT消息处理里面,使用PAINTSTRUCT ps={0}; HDC hdc= BeginPaint(hWnd,&ps); 这里处理绘图; EndPaint(hWnd,&ps);
  • HDC hdc=GetDC(hWnd); 这里处理绘图; ReleaseDC(hWnd,hdc);
  • HDC hdc=CreateDC…; 这里处理绘图 ;DeleteDC(hdc);

 

颜色:RGB

计算机三原色:红(R)、绿(G)、蓝(B)

COLORREF :DWORD — unsigned long类型,0x00BBGGRR

COLORREF color = RGB(255,0,0); //红色

BYTE — unsigned char

BYTE byRed = GetRValue(color); //获取红色分量

BYTE byGreen = GetGValue(color); //获取绿色分量

BYTE byBlue = GetBValue(color); //获取蓝色分量

 

画笔和画刷:

在绘图的时候,比如我们要画点、画线、画矩形、画圆,画笔决定了线型、线宽、颜色;画刷决定了在画封闭区域的时候,区域内部如何填充。

 

画笔:HPEN

1、创建画笔:

HPEN WINAPI CreatePen( int iStyle, int cWidth, COLORREF color);

参数iStyle:PS_SOLID实线、PS_DASH虚线、PS_DOT点线、PS_DASHDOT点划线、PS_DASHDOTDOT 双点划线、PS_NULL不可见。除PS_SOLID可通过cWidth指定线宽外,其它线型只支持一像素线宽,若cWidth>1,则按一律按实线画。

2、将画笔应用到设备上下文(DC)中:

HGDIOBJ WINAPI SelectObject(HDC hdc, HGDIOBJ h);

返回值:成功将返回原GDI对象句柄,失败返回NULL。

3、恢复原画笔

以第一次调用SelectObject函数的返回值作为参数再次调用该函数。因为windows默认有个黑色的实线画笔,所以,我们即使不设置自己的画笔,也是可以使用系统默认画笔的,我们使用完自己的画笔以后,一般需要将画笔设置为原先的系统默认画笔。

4、释放画笔

BOOL WINAPI DeleteObject( HGDIOBJ ho);

注意:不能删除设备上下文正在使用的GDI对象,因此必须先恢复原画笔,再删除新画笔。

 

画刷:HBRUSH

1、创建单色画刷

HBRUSH  WINAPI CreateSolidBrush(COLORREF color);

2、创建阴影线画刷

HBRUSH  WINAPI CreateHatchBrush( int iHatch, COLORREF color);

HS_HORIZONTAL 水平阴影(-)   HS_VERTICAL垂直阴影(|)  HS_CROSS正交阴影(+)

HS_BDIAGONAL  正斜阴影(/)    HS_FDIAGONAL 反斜阴影(\)    HS_DIAGCROSS 斜交阴影(X)

3、创建位图画刷

HBRUSH  WINAPI CreatePatternBrush( HBITMAP hbm);

4、将画刷应用到DC,恢复原画刷、释放画刷,与画笔完全一样。SelectObject,DeleteObject。

 

获取系统对象:GetStockObject

对于画笔、画刷,Windows系统提供了一些已经创建好的,这些获取以后,不需要释放。

HGDIOBJ WINAPI GetStockObject( int i);

参数i:HOLLOW_BRUSH、NULL_BRUSH、BLACK_BRUSH、WHITE_BRUSH、NULL_PEN、BLACK_PEN、WHITE_PEN等等。

原创粉丝点击