【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制(下)

简介: 【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制

三.GDI绘图对象–画笔

  • 画笔的作用:
    更改线条的颜色,线形,线粗。
  • 画笔句柄:HPEN

画笔的使用:

我们在上文中将设备上下文比喻为画家,在这里我们继续使用上文的比喻,能够帮助大家更好地理解。

- 1.创建画笔

CreatePen函数创建具有指定样式,宽度和颜色的逻辑笔。

MSDN官方文档解释CreatePen函数

HPEN CreatPen(
  int isStyle,          //笔样式
  int cWisth,           //笔的宽度
  COLORREF color        //笔的颜色
  );

注意: 笔样式中,PS_SOILD是实心线,可以支持多个像素宽度,其他线性只能是一个像素宽。

- 2.将画笔给到设备上下文(DC)

SelectObject 函数将对象选择到指定的设备上下文中, (DC) 。 新对象替换同一类型的上一个对象。

这一步骤相当于将创建好的新画笔给画家,让画家拿着我们创建的新画笔绘图。

MSDN官方文档解释SelectObject函数

SelectObject(
  HDC hdc,                //设备上下文句柄
  HGDIOBJ h               //GDI绘图对象句柄,画笔句柄
  );
  • 返回值:返回原来的GDI绘图对象句柄
    注意保存原来的GDI绘图对象句柄

- 3.绘图

这一步骤中使用绘图函数,绘制我们想要的图形

- 4.取出设备上下文(DC)中的画笔

在这一步骤中,将原来的画笔使用SelectObject函数,放入到设备上下文(DC)中,就会将我们的画笔取出

- 5.释放画笔

在绘图完成后,我们需要将我们的画笔释放:

MSDN官方文档解释SelectObject函数

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成像,大家可以使用其他方法,使程序更加美观。

六.文本绘制

文字绘制:

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.字体的使用

  • 函数功能: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.删除字体

本篇文章就分享到这里,大家如果有什么不理解的随时可以私信我,如果发现文章中的问题,希望大家及时指出来,我会非常虚心地学习,希望我们共同进步!!!

相关文章
|
11月前
Easyx绘制基本图形
Easyx绘制基本图形
|
API 图形学
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制(上)
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制
|
前端开发
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
361 0
Delphi绘图功能[2] —— 窗体的绘图属性、圆弧类图形、获取Canvas对象(ClientRect解析)
|
前端开发
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
402 0
Delphi绘图功能[1] —— 入门(绘制直线和矩形)
【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )
【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )
270 0
【OpenGL】十一、OpenGL 绘制多个点 ( 绘制单个点 | 绘制多个点 )
OpenGL几种简单图形的绘制
圆、五角星、正弦函数图形的绘制
316 0
|
图形学
GDI+——使用Graphics类绘制基本图形
GDI+——使用Graphics类绘制基本图形
373 0
GDI+——使用Graphics类绘制基本图形