【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.删除字体

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

相关文章
|
8月前
|
机器学习/深度学习 算法 数据可视化
数据驱动是什么?数据驱动的深层次理解!
在企业数字化转型中,“数据驱动”常被提及,但其内涵却未必人人明晰。本文从应用层次与价值实现机制两方面解读“数据驱动”,分为四个层次:监测(记录事实)、分析(诊断问题)、挖掘(深度算法)和使能(赋能业务)。同时提出DIPOA模型,将数据视为生产原材料,通过链条完成价值转化。
|
8月前
|
机器学习/深度学习 Docker 容器
飞桨x昇腾生态适配方案:01_基础环境准备
本指南详细介绍在ARM环境中准备CANN环境、安装Paddle深度学习框架及PaddleCustomDevice的过程。首先下载并加载CANN镜像,启动Docker容器;接着通过日构建包或源码编译安装PaddlePaddle和PaddleCustomDevice;可选更新CANN版本时需注意环境变量配置与路径设置。最后提供基础功能检查方法,包括硬件后端、版本验证及框架健康检查,确保环境搭建成功。
566 0
|
消息中间件 SQL RocketMQ
【RocketMQ系列五】消息示例-顺序消息&延迟消息&广播消息的实现
【RocketMQ系列五】消息示例-顺序消息&延迟消息&广播消息的实现
808 1
|
人工智能 安全 数据可视化
2024黑帽大会最热门的九大AI网络安全工具
在2024年的黑帽大会(Black Hat 2024)上,AI驱动的网络安全工具和技术成为焦点,引领了网络安全行业新趋势。众多安全厂商和初创公司展示了他们的最新成果,利用生成式AI来管理风险、检测并对抗网络犯罪,保障企业安全。以下是大会上一些备受瞩目的AI驱动网络安全产品和服务:
|
机器学习/深度学习 自然语言处理 算法
基于python旅游景点满意度分析设计与实现
本文介绍了一个基于Python的情感分析系统,旨在通过CNN算法、LDA主题模型和jieba分词等自然语言处理技术,对海口市旅游景点的网络评论进行满意度分析,以客观评估和提升游客体验及景点服务质量。
614 1
|
C++
解决VS中的_CRT_SECURE_NO_WARNINGS 1的警告问题
解决VS中的_CRT_SECURE_NO_WARNINGS 1的警告问题
483 1
|
人工智能
[MGeo应用]使用python+AI模型拆分Excel中地址的省市区街道
[MGeo应用]使用python+AI模型拆分Excel中地址的省市区街道
|
编解码 前端开发 JavaScript
前端框架与库 - Bootstrap响应式设计
【7月更文挑战第19天】Bootstrap是流行的前端框架,以其响应式设计和组件库闻名。响应式设计确保网站在不同设备上显示良好。关键包括:**网格系统**,基于12列布局,适应屏幕尺寸;和**媒体查询**,用于根据设备特性应用样式。开发者常遇到的问题有:网格列超过12、忽视断点和自定义样式冲突。解决方法涉及正确使用断点类、测试多设备及清晰注释代码。借助官方文档和实践,可有效掌握响应式设计。
276 1
|
网络安全 开发工具 数据安全/隐私保护
如何把 ipa 文件 (iOS 安装包) 安装到 iPhone 手机上? 附方法汇总
如何把 ipa 文件 (iOS 安装包) 安装到 iPhone 手机上? 附方法汇总