windows游戏编程 绘图基础
本系列文章由jadeshu编写,转载请注明出处。http://blog.csdn.net/jadeshu/article/details/22451353
作者:jadeshu 邮箱: jadeshu@qq.com 欢迎邮件交流
很快到第八小节了,前面部分些许晦涩难懂,尤其寄存器和内存几节!先有个概念,慢慢熟悉!接着按下面一节节的学习就行了
这节主要说下绘图基础相关的东西
绘制图形,我们平时在白纸上绘制个图形如一条直线就很简单,但在计算上实现确实很复杂的过程,学习它需要许多图形这块的知识,然后在windows 程序设计这块我们不必太过纠结这些!因为windows系统具有丰富的GDI API供我们使用,直接就可以画出图形出来。关于图形方面的我们后面会介绍的。
学习绘制图形方面需要学习GDI ,那么我们先来介绍什么是GDI!从我们的角度说GDI是由几百个函数以及相关的一些数据类型,宏和结构组成。GDI主要目的是支持与设备无关的图形。图形输出设备被分为两大类:光栅设备和矢量设备。大多数PC输出的是光栅设备。GDI基本图形包括 线条和曲线,区域,位图,文本。
GDI是图形设备接口(Graphics Device Interface)的英文首字母的简称。
•Windows图形编程就是针对Windows自带的图形设备接口函数库和设备环境(DC)进行操作。通过调用这些函数库中的函数来完成绘制工作。
GDI是一个抽象的接口,是一个关于图形显示的函数库。通过这个接口可以实现对图形的颜色、线条的粗细等属性的控制。它是我们的程序与计算机硬件之间的一个桥梁。
设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。
在Win32编程中,设备环境是用HDC 来标识。H的意思Handle句柄的意思。
获取HDC
1、通过GetDC函数来获得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制。
{
HDC hDC = ::GetDC(hWnd);
//其他的绘图操作代码
……
::ReleaseDC(hWnd,hDC);
}
GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
2、通过BeginPaint函数获得所在窗口的HDC
3、通过CreateDC和CreateCompatibleDC函数获得HDC
BeginPaint函数是将窗口上所有内容清除干净,然后在上面绘制。
{
PAINTSTRUCT ps;
HDC hDC = ::BeginPaint(hWnd,&ps);
//其他的绘图操作代码
::EndPaint(hWnd,&ps);
}
typedef struct tagPAINTSTRUCT {
HDC hdc; // 显示器的设备环境句柄
BOOL fErase; //是否擦除背景
RECT rcPaint; //指定了需要绘图的窗口区域
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;
3、通过CreateDC和CreateCompatibleDC函数获得HDC
常用的GDI对象的介绍
选用库存GDI对象,库存对象有如下图:
画笔Pen:
在GDI中,用HPEN来表示画笔。H是代表句柄的意思。
在GDI中,画线,画边框(如矩形边框,圆边框,饼边框)都是采用画笔来操作的。
GDI默认的画笔是黑色,宽度为1,样式为实线的画笔。
画刷Brush:
在GDI中,用HBRUSH来表示画刷。H是代表句柄的意思。
在GDI中,填充矩形,填充圆,填充饼等以及刷窗口背景都是通过画刷来操作的。
GDI默认的画刷是白色的画刷。
字体Font:
在GDI中,用HFONT来表示字体。H是代表句柄的意思。
在GDI中,所有的文本绘制,都是要基于具体的字体对象来绘制的。
GDI中默认的字体,是系统等宽字体,比如对话框标题一般就采用这个字体。
区域Region:
在GDI中,用HRGN来表示区域。H是代表句柄的意思。
在窗口中,一个区域可以是椭圆形,多边形,或是更常见的矩形。
位图Bitmap:
在GDI中,用HBITMAP来表示位图。H是代表句柄的意思。
GDI的绘制,从大体上,分为图形绘制跟图像绘制。对于线,矩形,圆,饼等的绘制是属于图形绘制。而对位图的绘制是属于图像绘制。
HGDIOBJ WINAPI SelectObject(HDC hdc ,//设备DC
HGDIOBJ h //其实是一个void* 。这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的相同类型的GDI对象);
SelectObject把GDI对象选入相应的DC中
像画笔(句柄HPEN),画刷(HBURSH),位图(HBITMAP)等都是GID对象。因为画图函数,如画圆,画矩形,画直线,它们所画出图形,默认属性都是不变的,如线的宽度。那么想要改变画出来时线的宽度,比如我想画出来的图形它的线条宽度为5(像素),那么就要创建一个宽度为5的画笔,然后再通过SelectObject函数,给这个画笔选入,就可以了.
选择GDI对象实例
HPEN pen=CreatePen(PS_SOLID,3,RGB(255,78,99));//创建画笔
HBRUSH brush=CreateSolidBrush(RGB(22,182,111));//创建画刷
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps); //BeginPaint只能在响应WM_PAINT
SelectObject(hDC,pen);//选入画笔
SelectObject(hDC,brush);//选入画刷