编程学习
💻Win32编程(4) - GDI绘图基础
00 分钟
2023-4-13
2023-11-23
type
status
date
slug
summary
tags
category
icon
password
Email

基础概念

  • HDC:Handle of Device Context: 图形设备上下文句柄。
字符界面的基本单位是字符。
图形界面的基本单位是像素。
像素:px,表示一个点。
绘图与贴图的消息处理: WM_PAINT 消息。
当然你也可以指定 Timer 计时器来每隔多长时间刷新一次。

绘图

基础绘图

首先要获取HDC:
检索DC的窗口句柄,并且返回在指定窗口工作的DC句柄。
ReleaseDC HDC的释放:

SetPixel 来绘制像素点
  • HDC:设备上下文句柄
  • x,y:绘制的坐标
  • color:颜色
绘制一条线:
的位置绘制了100个像素点,即绘制了一条线。

MoveToEx 来更新当前的焦点坐标:
  • HDC:设备上下文句柄。
  • x,y:需要移动的位置。
  • lppt:可用于保存上一个的位置
LineTo 来绘制一条线的路径:
参数同样需要指定HDC与到达的坐标。
示例:来绘制一个简单的三角形:
解释:
  • 首先绘制一条线,从
  • 首先移动到的位置,然后调用LineTo移动到(300,300)的位置,表示我们绘制了一条从一条线路径。
  • 然后我们使用MoveToEx的最后一个参数来保存当前点的坐标,并且移动到的位置,然后再次绘制到当前位置。
最后效果如下:
notion image
🍎当然,我们这样做只是为了测试这几个函数的功能,一定还有其他的更加简便的方法。

使用画笔

我们首先需要创建画笔,然后需要将画笔交给画家,然后画家再画画,这是一个绘图的编程模型:
  1. 创建画笔。
  1. 传递画笔给画家。
  1. 绘制。
CreatePen 创建画笔:
  • iStyle:画笔的样式,比较常用的有PS_SOLID,PS_DASH等等。
  • cWidth:画笔的宽度,以像素点为单位。
  • color:画笔的颜色。
SelectObject 传递画笔给画家:
所谓画家其实就是HDC,即绘图设备上下文句柄。
  • hdc:绘图的上下文句柄。
  • h:是一个函数指针,表示的是对象句柄,这个对象可以是画笔,画刷,Bitmap,区域 等等。
  • 返回值为HGDIOBJ对象。
接下来就是绘图的过程了,我们只需要传递绘制指定图形的函数即可,这个例子中我绘制了一个矩形:
注意:我创建了两个画笔,然后分别使用这两种样式的画笔绘制了图形,我们只需要 SelectObject 选择相应的画笔即可,然后便可以直接绘制图形。
我们使用这个函数的返回值来保存当前的绘图画笔,然后再下面可以复原此次画笔
notion image

使用画刷

使用画刷与画笔的过程是一样的,我们只需要:
  1. 创建画刷。
  1. 传递画刷给画家。
  1. 绘图。
CreateSolidBrush
  • color:画刷的颜色。
  • 返回值是一个HBRUSH,即一个画刷对象
然后 SelectObject 可以传递画刷给画家(使得HDC为此画刷类型)。
接着绘图即可:
notion image

贴图

贴图的过程比较复杂,大致可以分为如下的四个步骤:
  1. 加载图片。
  1. 创建兼容DC。
  1. 图片选择到兼容DC中。
  1. 兼容DC绘制到HDC上。
我们需要获得HDC与HINSTANCE等信息,因此首先需要获得他们的信息:
LoadImage 加载图片:
注意我们必须加载图片是 bmp 类型
  • hInst:贴图位置的实例句柄。
  • name:图片的路劲
  • type:要加载的图片的类型,位图,游标,或者是图标。
  • cx,cy:加载的图片的宽度与高度。
  • fuLoad:图片加载方式,可以选择从指定文件中打开: LR_LOADFROMFILE
CreateCompatibleDC 创建兼容DC:
  • hdc:需要为NULL,则会创建与当前窗口兼容的DC。
  • 返回值是我们创建的兼容DC
SelectObject 图片选择到兼容DC,没错,又是这个函数。
BitBlt 兼容DC绘制到HDC:
这个函数完成的是从指定源设备上下文目标设备上下文中的像素矩形对应的颜色数据的位块传输
  • hdc:绘制的目标设备上下文句柄
  • x,y,cx,cy:绘制的左上角坐标,与绘制宽度高度。
  • hdcSrc:原设备的上下文句柄。
  • x1,y1:原设备的左上角坐标
  • rop:对于颜色的操作,常见的有:SRCCOPY SRCAND SRCPAINT

简单的操作示例:
效果如下所示:
notion image

多级缓冲绘图

我们使用上面的绘图方式是可以的,但是有可能会出现闪烁的情况,因此我们必须使用多级缓冲绘图,来解决这种问题,使得图片可以稳定加载。
步骤如下:
  1. 加载图片。
  1. 创建兼容位图。
  1. 创建兼容DC。
  1. 兼容位图选择到兼容DC。
  1. 图片选择到兼容DC。
  1. 兼容DC绘制到最终兼容DC。
  1. 最终兼容DC绘制到HDC。
notion image
CreateCompatibleBitmap :创建兼容位图:
  • HDC:设备上下文句柄
  • cx,cy:宽度与高度
其他的函数与上面基本一致。
TransparentBlt 是另一种绘图方式,与 BitBlt 是一样的:
  • hdcDest:目标HDC
  • 目标HDC的坐标与宽高。
  • 源HDC的信息。
  • crTransparent:与 BitBlt 的最后一个参数相同
代码示例:

文字

CreateFont 来创建字体的样式:
参考链接:
然后便可以使用 TestOut 来创建文字了:
notion image

评论
  • Twikoo
  • Valine