一、概要
GDI 是WINDOWS极其重要的一部分,从程序员的角度来说,GDI由几百个函数以及相关的一些数据类型、宏和结构组成。GDI的一个主要目的是支持与设备无关的图形。
二、GDI的结构
1、GDI的函数分类
1) 获取(或建立)和释放(或销毁)设备环境的函数:BeginPaint\EndPaint\GetDc\ReleaseDc……
2) 获取设备环境信息的函数:GetTextMetrics……
3) 绘制函数:TextOut……
4) 设置和获取设置环境属性的函数:SetTextColor\SetTextAlign……
5) 使用GDI对象的函数:CreatPen\CreatePenIndirect\ExtCreatePen…….
2、GDI的基本图形
1) 线条和曲线
2) 可被填充的封闭区域
3) 位图
4) 文本
三、设备环境
希望在图形输出设备上绘制图形,必须首先获得设备环境的句柄,当windows把这个句柄交给你的程序,windows也就给予你使用这个句柄的权限。
1、获取设备环境句柄
1)hdc = BeginPaint(hwnd, &ps);
……
EndPaint(hwnd, &ps);
2) hdc = GetDC(hwnd);
……
ReleaseDC(hwnd, hdc);
3)hdc = GetWindowDC(hwnd);
……
ReleaseDC(hwnd, hdc);
4)hdc = CreateDC(pszDriver, pszDevice, pszOutput, pData);
……
DeleteDC(hdc);
2、获取设备环境的信息
函数:GetDevicecaps(hdc, iIndex);
3、设备尺寸
像素尺寸(像素规模):设备在水平或垂直方向上显示的总的像素数。
度量尺寸(度量规模):以英寸或者毫米为单位的设备的客户区域的大小。
分辨率= 像素尺寸 /度量尺寸,即每度量单位中含有的像素
正方形像素:设备的水平分辨率等于垂直分辨率。
函数:GetSystemMetrics函数,GetDeviceCaps函数
4、色彩ABC
真彩:每个像素24位,8位红,8位绿,8位蓝
高彩:每像素16位,5位红,6位绿,5位蓝
COLORREF:32位无符号长整型,表示一种特定的颜色。
GetRValue\ GetGValue\ GetBValue从COLORREF值中提取RGB的原色值。
5、保存设备环境
函数:SaveDC
四、点和线的绘制
1、设定像素
SetPixel(hdc, x, y, crcolor):将坐标为x,y的像素点设定为某个特定的颜色。
GetPixel(hdc, x, y):返回指定坐标位置的像素的颜色。
2、画图形
函数 | 功能 |
LineTo | 画直线 |
PolyLine\PolylineTo | 画一条由多条首尾相连的直线构成的折线 |
PolyPolyline | 画多条折线 |
Arc | 画椭圆弧线 |
PolyBezier\PolyBezierTo | 画贝塞尔样条曲线 |
Rectangle | 画矩形 |
Ellipse | 画椭圆 |
RoundRect | 画圆角矩形 |
Pie | 画椭圆的一部分,使其看起来像一个扇形 |
Chord | 画出由弦割出的部分椭圆,形状呈弓形 |
3、GDI对象
一个程序可以创建6种GDI对象:画笔、画刷、位图、区域、字体、调色板
使用GDI对象的三条规则:
1) 最终应删除你所创建的所有GDI对象
2) 当GDI对象被选入一个有效的设备环境时,不要删除它
3) 不要删除备用对象
4、画笔
1)使用现有画笔
Hpen =GetStockObject(WHITE_PEN) :获取画笔的句柄
SelectObject(hdc,hPen) :将画笔选入设备环境
2)创建画笔
CreatePen\CreatePenIndirect
3)选择画笔
SelectObject
4)删除画笔
DeleteObject
5、填充空隙
1、Polygon函数和多边形填充模式
2、用画刷填充内部
6、GDI映射模式
1)与映射模式相关的设备环境属性:窗口原点、视口原点、窗口范围、视口范围
2)设备坐标、逻辑坐标
3)设备坐标系统:屏幕坐标、全窗口坐标、客户区坐标
五、矩形、区域、剪裁
1、处理矩形
函数 | 功能 |
FillRect | 使用指定画刷填充矩形 |
FrameRect | 使用画刷绘制矩形,但不填充 |
InvertRect | 翻转矩形内的所有像素 |
2、GetMessage和PeekMassage
3、建立和绘制区域
函数 | 功能 |
CreateRectRgn | 绘制矩形区域 |
CreateRectRgnIndirect | |
CreateEllipticRgn | 绘制椭圆区域 |
CreateEllipticRgnIndirect |
4、矩形与区域的剪裁
函数 | 功能 |
InvalidateRgn | 使区域无效 |
ValidateRgn | 使区域有效 |
SelectObject | 将一个区域选入设备环境来创建自己的剪裁区域 |
SelectClipRgn |