三.GDI绘图对象–画笔
- 画笔的作用:
更改线条的颜色,线形,线粗。 - 画笔句柄:HPEN
画笔的使用:
我们在上文中将设备上下文比喻为画家,在这里我们继续使用上文的比喻,能够帮助大家更好地理解。
- 1.创建画笔
CreatePen
函数创建具有指定样式,宽度和颜色的逻辑笔。
HPEN CreatPen( int isStyle, //笔样式 int cWisth, //笔的宽度 COLORREF color //笔的颜色 );
注意: 笔样式中,PS_SOILD是实心线,可以支持多个像素宽度,其他线性只能是一个像素宽。
- 2.将画笔给到设备上下文(DC)
SelectObject 函数将对象选择到指定的设备上下文中, (DC) 。 新对象替换同一类型的上一个对象。
这一步骤相当于将创建好的新画笔给画家,让画家拿着我们创建的新画笔绘图。
SelectObject( HDC hdc, //设备上下文句柄 HGDIOBJ h //GDI绘图对象句柄,画笔句柄 );
- 返回值:返回原来的GDI绘图对象句柄
注意保存原来的GDI绘图对象句柄
- 3.绘图
这一步骤中使用绘图函数,绘制我们想要的图形
- 4.取出设备上下文(DC)中的画笔
在这一步骤中,将原来的画笔使用SelectObject
函数,放入到设备上下文(DC)中,就会将我们的画笔取出
- 5.释放画笔
在绘图完成后,我们需要将我们的画笔释放:
BOOL SelectObject( HGDIOBJ ho //逻辑笔,画笔,字体,位图,区域或调色板的句柄 );
如果函数成功,返回非零值。
注意: 只能删除不被DC使用的画笔,所以在释放之前,必须将画笔从DC中取出。
我们来到回调函数中处理:
case WM_PAINT: { sprintf(output, "检测到WM_PAINT消息\n"); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); PAINTSTRUCT ps = { 0 }; HDC hdc = BeginPaint(hwnd, &ps); /* MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, 500, 500);*/ //绘制直线 // Rectangle(hdc, 100, 100, 200, 200); //绘制矩形 HPEN hPen = CreatePen(PS_SOLID, 3, RGB(50, 80, 99)); HGDIOBJ hOldPen = SelectObject(hdc, hPen); Ellipse(hdc, 100, 100, 50, 50); //绘制圆形 EndPaint(hwnd, &ps); SelectObject(hdc, hOldPen); DeleteObject(hOldPen); break; }
我们看看处理效果:
四.GDI绘图对象-画刷
- 作用:封闭图形填充的颜色,图案
- 画刷句柄:HBRUSH
画刷的使用:
- 1.创建画刷
CreateSoildBrush
函数:创建实心画刷CreateHatchBrush
函数:创建纹理画刷 - 2.将画刷应用到DC中
- 3.绘图
- 4.将画刷从DC中取出
- 5.删除画刷
我们看看回调函数处理过程:
case WM_PAINT: { sprintf(output, "检测到WM_PAINT消息\n"); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); PAINTSTRUCT ps = { 0 }; HDC hdc = BeginPaint(hwnd, &ps); /* MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, 500, 500);*/ //绘制直线 // Rectangle(hdc, 100, 100, 200, 200); //绘制矩形 HPEN hPen = CreatePen(PS_SOLID, 3, RGB(50, 80, 99)); HGDIOBJ hOldPen = SelectObject(hdc, hPen); HGDIOBJ hBrush = CreateSolidBrush(RGB(255, 0, 0)); HGDIOBJ hOldBrush = SelectObject(hdc, hBrush); SelectObject(hdc, hBrush); Ellipse(hdc, 100, 100, 50, 50); //绘制圆形 EndPaint(hwnd, &ps); SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); DeleteObject(hPen); DeleteObject(hBrush); break;
我们来看看处理效果:
五.位图的使用
- 1.位图相关:
光栅图形:记录图像中每一个点的颜色信息
矢量图形:记录图像算法,绘图指令等
- 位图句柄:HBITMAP
- 2.位图的使用
- 1.可视化图形界面添加位图资源:
添加好之后,将我们需要的位图导入或我们自己画一个,在文章中我自己画一个: - 2.从资源中加载位图
LoadBitmap
函数:
LoadBitmap 函数从模块的可执行文件加载指定的位图资源。
MSDN官方文档解释LoadBitmap函数
LoadBitmap( HINSTANCE hInstance, //其可执行文件包含要加载的位图模块实例的句柄 LPSTR lpBitmapName //指向包含要加载的位图资源名称的空终止字符串的指针 );
- 返回值:如果函数成功,则返回指定位图的句柄
- 3.创建一个与当前DC相匹配的DC(内存DC)
HDC CreateCompatibleDC( HDC hdc //当前DC句柄,可以为NULL(屏幕DC) );创建成功,返回DC句柄
- 4.将为图放入匹配DC中(SeleteObject函数)
- 5.成像:
这里指示简单介绍了一个1:1成像的函数,其他函数可以自行查找
BitBle函数
MSDN官方文档解释BitBle函数
BOOL BitBlt( HDC hdc, //目标设备上下文句柄 int x, //目的矩形左上角x坐标 int y, //目的矩形左上角y坐标 int cx, //源矩形和目标矩形的宽度 int cy, //源矩形和目标矩形的高度 HDC hdcsrc, //源设备上下文句柄 int x1, //源矩形左上角的x坐标 int y1, //源矩形左上角的y坐标 DWORD ROP //光栅操作代码 );如果函数成功,则返回非零值
- 6.取出位图
SeleteObject
函数 - 7.释放位图
DeleteObject
函数 - 8.释放匹配DC
我们来到回调函数中处理:
//绘制窗口消息 case WM_PAINT: { sprintf(output, "检测到WM_PAINT消息\n"); WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0); PAINTSTRUCT ps = { 0 }; HDC hdc = BeginPaint(hwnd, &ps); /* MoveToEx(hdc, 0, 0, NULL); LineTo(hdc, 500, 500);*/ //绘制直线 // Rectangle(hdc, 100, 100, 200, 200); //绘制矩形 /*HPEN hPen = CreatePen(PS_SOLID, 3, RGB(50, 80, 99)); HGDIOBJ hOldPen = SelectObject(hdc, hPen); HGDIOBJ hBrush = CreateSolidBrush(RGB(255, 0, 0)); HGDIOBJ hOldBrush = SelectObject(hdc, hBrush); SelectObject(hdc, hBrush); Ellipse(hdc, 100, 100, 50, 50); //绘制圆形 EndPaint(hwnd, &ps); SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); DeleteObject(hPen); DeleteObject(hBrush);*/ //位图: HBITMAP hBitmap = LoadBitmap(hIns, (LPCSTR)IDB_BITMAP1); //加载位图 HDC hNewHdc = CreateCompatibleDC(hdc); //创建与当前DC匹配的内存DC HGDIOBJ hOldBitmap = SelectObject(hNewHdc, hBitmap); BitBlt(hdc, 100, 100, 100,100, hNewHdc, 0, 0, SRCCOPY); SelectObject(hNewHdc, hOldBitmap); DeleteObject(hBitmap); DeleteDC(hNewHdc); break;
我们来看看处理效果:
这里我们只是将位图1:1成像,大家可以使用其他方法,使程序更加美观。
六.文本绘制
文字绘制:
- TextOut函数:功能不是很强大,我们今天来学习一种更加强大的函数:
- DrawText函数
MSDN官方文档解释DrawText函数
int DrawText( HDC hdc, //设备上下文句柄 LPCTSTR lpchText, //指向指定要绘制的文本的字符串的指针 int cchText, //字符串的长度 LPRECT lprc, //指向RECT结构的指针 UINT format //设置文本格式的方法 );
- 文字颜色以及背景的设置:
- 文字颜色
SetTextColor
函数 - 文字背景颜色:
SetBkColor
函数(只有在OPAQUE模式下适用) - 文字背景模式:
SetBkMode
函数,其中参数设置为OPANQUE(不透明),TRANSPARENT(透明)
七.字体
1.字体相关
- 字体文件路径:一般在C:\Windows\Fonts目录下
- Windows常用字体为TrueType格式字体
- 字体名:标识字体类型,注意这里的字体名要以文件中的字体名为准:
2.字体的使用
- 1.使用
CreateFont
函数到硬盘查找字体文件MSDN官方文档解释CreateFont函数
- 函数功能:CreateFont函数创建具有指定特征的逻辑字体
- 语法:
HFONT CreateFintA( int cHeight, //字体字符单元格时或字符的高度 int cWidth, //请求字体中字符的平均宽度 int cEscapement, //转义向量与设备x轴之间的角度 int cOrientation, //每个字符的基线与设备x轴之间的角度 int cWeight, //字体粗细值(0到1000) DWORD bItalic, //如果设置为TRUE 则指定斜体 DWORD bUnderline, //如果指定为TRUE,则指定带下划线字体 DWORD bStrikeOut, //如果设置为TRUE,则为删除线字体 DWORD iCharSet, //字符集 DWORD iOutPracision, //输出精度 DWORD iClipPrecision, //剪辑精度 DWORD iQuality, //输出质量 DWORD iPitchAndFamily, //字体的音调和系列 LPCSTR pszFaceName //指向指定字体字号的 null 终止字符串的指针 );
- 2.应用字体到DC(使用SelectObject函数)
- 3.绘制字体文字(DrawText/TextOut函数)
- 4.取出字体(SeleteObject函数)
- 5.删除字体
本篇文章就分享到这里,大家如果有什么不理解的随时可以私信我,如果发现文章中的问题,希望大家及时指出来,我会非常虚心地学习,希望我们共同进步!!!