GDI:图形设备接口:Windows的子系统,负责在视讯显示器和打印机上显示图形。
GDI常见名词解释:
直线
曲线
填入区域:直线或曲线构成的封闭区域,可以用画刷进行填充
位图:点阵图像
文字
映像模式:不同尺寸绘图的形式
图元:以二级制形式存储的GDI集合
绘图区域:允许绘制任意形状的绘图区域
路径:GDI内部存储直线或曲线的集合
剪裁:剪出不同区域
调色盘:输出设备允许使用颜色的范围 打印
HDC:设备上下文即用于绘制到屏幕、打印机或者图元文件。
如图:最外侧是屏幕区域,名称减号叉号等是窗口区域,除此以外是客户区
窗口区左上角是坐标轴x,y等于0的位置,向右向下xy增大
设备环境(DC):设备上下文缩写,程序里可以进行绘制的部分
接下来讲述如何应用GDI来进行绘图
绘制入口
在桌面程序中找到该处
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hWnd, &ps);
HDC hdc = BgeinPaINT(hWnd, &ps) 在桌面程序的此处进行绘制,此处我们填入一个封装好的
HDC hdc2 = GetDC(hWnd); 两种接受窗口句柄的方式
MyPaint(hdc); 此处为绘制窗口的函数
ReleaseDC(hWnd,hdc2); 释放窗口句柄
}
BOOL MyPaint(HDC hDC){} 此处是绘制窗口的函数,此时可见,该函数并没有被书写
SetBkMode(hDC, TRANSPARENT); 设置透明背景色,不加的话,输出字体的背景一直是白色的
画笔用于绘画图像的边框
HPEN hBluePen = CreatePen(PS_SOLID, 3, RGB(0, 0, 255)); 创建画笔,参数依次 笔样式 划线
的宽度 划线的颜色:三原色
HGDIOBJ hGdiObj = SelectObject(hDC, hBluePen); 选择画笔,参数依次设备上下文句柄 画笔
此处设置画笔起始位置:
POINT pt = { 0 }; 画笔当前位置的指针
MoveToEx(hDC, 100, 100, &pt); 移动画笔到起点 参数依次 设备上下文句柄 起点的xy轴 接受画
笔当前位置结构的指针
LineTo(hDC, 200, 400); 此函数用于绘制线条 参数依次 句柄 xy最终位置坐标
Rectangle(hDC, 150, 100, 300, 200); 此函数绘制矩形 参数依次 句柄 左上右下顶点的坐标
画刷用于填充图像颜色等等,此处介绍两种不同的画刷
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
}; 申请多个点的数组
PolyBezier(hDC, pi, 4); 曲线绘制:参数依次 句柄 点位置 点数数量
设计思路:一个矩形的对角点,延申出来圆
Arc(hDC, 100, 200, 200, 100, 350, 50, 350, 350); 用于存储点集合 参数依次 正方形两个对角点 圆
的起点终
点径向线的xy坐标,根据坐标的不同画出的圆可以闭口或不闭口
SetTextColor(hDC, RGB(0, 0, 255)); 设置字体颜色 参数依次句柄 三原色
TextOut(hDC, 100, 100, L"rkvir", wcslen(L"rkvir")); 窗口写字 参数依次 句柄 xy坐标 要输出的话 输
出话的长度
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; 定义输入文字的位置
SetRect(&rect, 30, 300, 400, 200); 设置文字位置的具体参数:上下左右
DrawText(hDC, L"这是一个实例", -1, &rect, DT_NOCLIP); 文字输出:参数依次 句柄 要输出的文
字 -1此处文字以00结尾,可以用-1表该文字多长都可以,若不以00结尾,则填写文字实际长度 文
字位置:包含上下左右
DeleteObject(hFont); 文字输出完毕后,释放字体内存
HBITMAP hBitMap = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 500, 500,
LR_LOADFROMFILE); 将位图加载进来:以位图句柄接收 LoadImage需要类型强转 参数依次
NULL 相对路径:该图像文件需要在源程序文件夹中 默认类型 大小 声明从文件来
HDC hMemoryDC = CreateCompatibleDC(hDC); 2.设置一个兼容设备环境的内存dc
SelectObject(hMemoryDC, hBitMap); 3.选择对象 参数依次 句柄 位图句柄
BitBlt(hDC, 0, 0, 500, 500, hMemoryDC, 0, 0, SRCCOPY);4.贴图 参数依次 目标句柄 目标被贴矩
形左上角xy坐标 源位图和目标矩形的宽度和高度 源位图句柄 原位图左上角xy坐标 操作代码:F1
跟进去该函数查看参数选择