GDI介绍
GDI:图形设备接口:Windows的子系统,负责在视讯显示器和打印机上显示图形。
GDI常见名词解释:
直线
曲线
填入区域:直线或曲线构成的封闭区域,可以用画刷进行填充
位图:点阵图像
文字
映像模式:不同尺寸绘图的形式
图元:以二进制形式存储的GDI集合
绘图区域:允许绘制任意形状的绘图区域
路径:GDI内部存储直线或曲线的集合
剪裁:剪出不同区域
调色盘:输出设备允许使用颜色的范围
DC:设备上下文缩写,程序里可以进行绘制的部分
HDC:设备上下文句柄,包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构
hDC:DC的句柄,API中的一个类似指针的数据类型,用于表示绘图设备
如图:最外侧是屏幕区域,名称减号叉号等是窗口区域,除此以外是客户区
窗口区左上角是坐标轴x,y等于0的位置,向右向下xy增大
GDI绘图
我们在窗口进行绘制时,需要使用WM_PAINT消息进行绘制
WM_PAINT消息:
产生时间:当窗口需要绘制的时候。
附带信息:wParam : 0,lParam : 0。
专职用法:用于绘图。
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BgeinPaint(hWnd, &ps) 填入窗口句柄(hWnd),此处第一种接受窗口句柄的方式
//HDC hdc2 = GetDC(hWnd); 此处第二种接受窗口句柄的方式
以下编写我们自定义的代码,也就是正式绘图阶段
MyPaint(hdc); 此处为自定义绘制窗口的函数
自定义代码结束,也就是结束绘画阶段
ReleaseDC(hWnd,hdc2); 释放窗口句柄
}
绘制开始
BOOL MyPaint(HDC hDC){} 此处是绘制窗口的函数,此时可见,该函数并没有被书写
以下我们依次完善这个函数
设置背景板
API:SetBkMode( HDC hdc, int mode );
参数依次:
1.HDC hdc; 当前 DC ( device context ) 的句柄
2.int mode; 要设置的模式,其值可以为 OPAQUE 或 TRANSPARENT
功能:设置指定设备上下文的背景混合模式。
SetBkMode(hDC, TRANSPARENT); 设置透明背景色,不加的话,输出字体的背景一直是白色的
画笔
画笔可以设置绘制线的颜色、线型、线粗。
HPEN作为画笔句柄
画笔的使用流程
1. 创建画笔
2. 将画笔应用到DC中,注意保存原来DC当中画笔
3. 绘图
4. 取出DC中的画笔,将原来的画笔,使用SelectObject函数,放入到设备DC中,就会将我们创建
的画笔取出。
5. 释放画笔
BOOL DeleteObject
(
HGDIOBJ hObject GDI绘图对象句柄,画笔句柄
);
只能删除不被DC使用的画笔,所以在释放前,必须将画笔从DC中取出。
设置画笔
画笔用于绘画图像的边框
API:CreatePen(int nPenStyle, int nWidth, COLORREF crColor)
参数依次:
1.nPenStyle:画笔样式
2.nWidth:画笔的宽度
3.crColor:画笔的RGB颜色
功能:指定笔的样式、宽度和颜色创建画笔。
HPEN hBluePen = CreatePen(PS_SOLID, 3, RGB(0, 0, 255)); 创建画笔,并返回句柄
PS_SOILD - 实心线,可以支持多个像素宽其他线型只能是一个像素宽。
画笔的选择
API:SelectObject(HDC hdc, HGDIOBJ hgdiobj);
参数依次:
1.hDC:绘图设备句柄
2.hgdiobj:GDI绘图对象句柄,画笔句柄
功能:选择一对象到指定设备上下文环境中,新对象替换先前的相同类型的对象。
HGDIOBJ hGdiObj = SelectObject(hDC, hBluePen); 选择画笔,并返回原来的GDI绘图对象句柄
画笔位置初始化
API:MoveToEx( HDC hdc, int X, int Y, LPPOINT lpPoint );
参数依次:
1.hdc:设备上下文句柄。
2.X:新位置的X坐标。
3.Y:新位置的Y坐标。
4.lpPoint:一个指向POINT结构的指针,用来存放上一个点的位置,若此参数为NULL,则不保存
上一个点的位置
功能:将当前绘图位置移动到某个具体的点,同时也可以获得之前位置的坐标
POINT pt = { 0 }; 画笔当前位置的指针
MoveToEx(hDC, 100, 100, &pt); 移动画笔到起点
线条的绘画
API:LineTo(HDChdc,intX,intY):
参数依次:
1.hdc:设备场景句柄
2.X:线段终点X坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部分
3.Y:线段终点Y坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部分
功能:用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y。
LineTo(hDC, 200, 400); 此函数用于绘制线条
画笔矩形的绘画
API:Rectangle(int left, int top, int right, int bottom);
参数依次:
1.(left ,top )为矩形的左上坐标
2.(right,bottom)为矩形的右下坐标
功能:画一个矩形
Rectangle(hDC, 150, 100, 300, 200); 此函数绘制矩形
画刷
画刷 用于将封闭图形填充颜色、图案
HBRUSH - 画刷句柄
画刷的使用
1 创建画刷
CreateSolidBrush - 创建实心画刷
CreateHatchBrush - 创建纹理画刷
2 将画刷应用到DC中:SelectObject
3 绘图
4 将画刷从DC中取出:SelectObject
5 删除画刷:DeleteObject
画刷初始化
画刷用于填充图像颜色等等,此处介绍两种不同的画刷
API:CreateSolidBrush(COLORREF crColor)
参数:crColor:刷子的颜色
功能:创建一个具有指定颜色的实心刷子
API:CreateHatchBrush((int fnStyle, COLORREF clrref)
参数依次:
1.fnStyle:指定刷子的阴影样式
2.cirref:指定用于阴影的刷子的前景色。
功能:创建一个具有指定阴影模式和颜色的阴影刷子
HBRUSH hSolidBrush = CreateSolidBrush(RGB(0, 0, 255)); 创建实心画刷
HBRUSH hHatchBrush = CreateHatchBrush(HS_DIAGCROSS, RGB(0, 0, 255)); 创建阴影画刷
画刷矩形的绘画
HGDIOBJ hGdiObj2 = SelectObject(hDC, hHatchBrush); 选择阴影画刷
Rectangle(hDC, 150, 100, 300, 200); 绘制矩形,该函数临近原则,最近的hdc选择是哪个就用哪
个,此处是阴影画刷
DeleteObject(hGdiObj2); 使用完毕后,删除选择的工具,此处为阴影画刷
弧线的绘画
弧线输出:设计思路 n个点连成弧线
POINT pi[4] = {
10,120,
180,300,
300,180,
120,10
}; 申请多个点的数组
API:PolyBezier(HDC hdc, CONST POINT *lppt, DWORD cPoints);
参数依次:
1.hdc:指定的设备环境句柄。
2.lppt:POINT结构数组的指针,包括了样条端点和控制点的坐标,其顺序是起点的坐标、起点的
控制点的坐标、终点的控制点的坐标和终点的坐标。
3.cPoints:指明数组中的点的个数。
功能:用于画贝赛尔样条曲线
PolyBezier(hDC, pi, 4); 绘画一个贝塞尔曲线
圆的绘画
设计思路:利用一个矩形的对角点,延申出来圆
API:BOOL Arc( HDC hdc, int xLeft, int yTop, int xRight, int yBottom, int XStart, int YStart, int
XEnd, int YEnd);
参数依次:
1.hdc 绘画的窗口句柄
2.xLeft和nyTopt指定外接矩形左上角坐标
3.xRight和yBottom指定外接矩形右下角坐标
4.xStart和nyStart指定圆弧开始坐标
5.xEnd和nyEnd指定圆弧结束坐标
功能:画一个圆
Arc(hDC, 100, 200, 200, 100, 350, 50, 350, 350); 画一个圆
设置字体颜色
API:SetTextColor(HDC hdc, COLORREF crColor);
参数依次:
1.hdc; 当前DC的句柄
2.crColor; 要设置的颜色,可以使用RGB宏根据红绿蓝分量合成颜色值
SetTextColor(hDC, RGB(0, 0, 255)); 设置字体颜色
绘制普通文本
文本绘制:将文字绘制在指定坐标位置
API:TextOut( HDC hdc,int nXStart, int nYStart, LPCTSTR lpString, int cbString);
参数依次:
1.hdc:设备环境的句柄
2.nXStart:指定用于字符串对齐的基准点的逻辑X坐标。
3.nYStart:指定用于字符串对齐的基准点的逻辑Y坐标。
4.lpString:指向将被绘制字符串的指针。此字符串不必为以\0结束的,因为cbString中指定了字符
串的长度。
5.cbString:指定了字符串的长度。
TextOut(hDC, 100, 100, L"dfsf", wcslen(L"dfsf")); 窗口写字
字体的使用
1 创建字体
2 应用字体到:DCSelectObject
3 绘制文字:DrawText/TextOut
4 取出字体:SelectObject
5 删除字体:DeleteObject
设置高级字体
HFONT hFont = CreateFont(100, 50, 0, 0, 0, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, L"宋体"); 创
建高级文字,参数依次 字体的高度 宽度 剩下填0 字符集即字符编码 剩下填0 本地字体
SetTextColor(hDC, RGB(255, 0, 255)); 设置文字的颜色
选择字体
SelectObject(hDC, hFont); 选择字体
输出文字位置初始化
RECT rect; 定义输入文字的位置
API:SetRect(LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom);
参数依次:
1.lprc:指向RECT 结构的指针,该指针包含了所要设置的矩形。
2.xLeft:指定矩形左上角的X坐标。
3.yTop:指定矩形左上角的Y坐标。
4.xRight:指定矩形右下角的X坐标。
5.yBottom:指定矩形右下角的Y坐标。
功能:设置指定矩形的坐标
SetRect(&rect, 30, 300, 400, 200); 设置文字位置
文字输出
API:DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat );
参数依次:
1.hDC:设备描述表句柄
2.lpString:将要绘制的字符串,如果nCount为-1,则lpString指向的字符串被认为是以\0结束的
3.nCount:字符串的长度,当其为-1时表示该文字多长都可以
4.lpRect:指向矩形结构RECT的指针
5.uFormat:正文的绘制选项
功能:在指定的矩形里写入格式化文本,根据指定的方法对文本格式化
DrawText(hDC, L"这是一个实例", -1, &rect, DT_NOCLIP); 书写一个文字
DeleteObject(hFont); 文字输出完毕后,释放字体内存
位图
位图有以下几种:
光栅图形用于记录图像中每一点的颜色等信息。
矢量图形用于记录图像算法、绘图指令等。
HBITMAP为位图句柄
位图的使用
1 在资源中添加位图资源
2 从资源中加载位图LoadBitmap
3 创建一个与当前DC相匹配的DC(内存DC)
HDC CreateCompatibleDC
(
HDC hdc 当前DC句柄,可以为NULL(使用屏幕DC)
); 返回创建好的DC句柄
4 将位图放入匹配的DC中 SelectObject
5 成像(1:1)
6 取出位图:SelectObject
7. 释放位图:DeleteObject
8 释放匹配的DC:DeleteDC
加载位图
API:LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int cyDesired,UINT fuLoad);
参数依次:
1.hinst:处理包含被装载图像模块的实例。若要装载OEM图像,则设此参数值为0。
2.lpszName:处理图像装载。
3.uType:指定被装载图像类型
4.cxDesired:指定图标或光标的宽度,以像素为单位。
5.cyDesired:指定图标或光标的高度,以像素为单位。
6.fuLoad:根据复合值列表指定函数值。
功能:装载图标,光标,或位图。
HBITMAP hBitMap = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 500, 500,
LR_LOADFROMFILE); 将位图加载进来
设置dc
API:CreateCompatibleDC(HDC hdc);
参数hdc:现有设备上下文环境的句柄
功能:创建一个与指定设备兼容的内存设备上下文环境
HDC hMemoryDC = CreateCompatibleDC(hDC); 设置一个兼容设备环境的内存dc
选择对象
SelectObject(hMemoryDC, hBitMap);
贴图
API:BitBlt(HDC hdcDest, int nXDest,int nYDest, int nWidth, int nHeight, HDC hdcSrc,
int nXSrc, int nYSrc,DWORD dwRop);
参数依次:
1.hDestDC:指向目标设备环境的句柄。
2.x:指定目标矩形区域左上角的X轴逻辑坐标。
3.y:指定目标矩形区域左上角的Y轴逻辑坐标。
4.nWidth:指定源在目标矩形区域的逻辑宽度。
5.nHeight:指定源在目标矩形区域的逻辑高度。
6.hSrcDC:指向源设备环境的句柄。
7.xSrc:指定源矩形区域左上角的X轴逻辑坐标。
8.ySrc:指定源矩形区域左上角的Y轴逻辑坐标。
9.dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。
功能:对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。
BitBlt(hDC, 0, 0, 500, 500, hMemoryDC, 0, 0, SRCCOPY);贴图