画笔、画刷等句柄

每次使用完这些句柄后,最好把原来的句柄还回去, 填参数的时候记得强制转换

所有的句柄确定不使用之后一定要DeleteObject()

先创建后赋值

画笔、画刷、字体、位图、区域、调色板等的函数

HBRUSH : 画刷的句柄
HPEN : 画笔的句柄
SelectObject(hdc, GetStockObject(BLACK_BRUSH)); // 设置画笔/画刷……的句柄, 返回旧的句柄
GetStockObject() // 获得Windows预设的画笔/画刷/字体/区域等句柄
DeleteObject(); //删除画笔、画刷、字体、位图、区域、调色板句柄, 由 GetStockObject() 返回的Windows的默认不可以删除,正在使用的画笔不可以删除, 只有自定义的才可以删除
GetObject(); // 获取指定的画笔等句柄的信息
GetCurrentObject(); // 获取被选入指定环境设备中的指定对象类型的句柄

画笔

CreatePen(); // 使用指定的颜色、样式、宽度等创建画笔,默认向两边扩展, 可以设置向内扩展
CreatePenIndirect(); // 与 CreatePen() 创建的画笔相同, LOGPEN 结构

背景颜色和背景模式

默认的背景模式:OPAQUE, 不透明
默认的背景颜色(不是指客户区的背景颜色):白色
SetBkColor(); // 设置背景颜色, 模式应当为不透明, 用来填充CreatePen非实线画笔的空隙、阴影画刷和字符的背景颜色, 填充TextOut输出字符的背景颜色, 不会填充ExtCreatePen() 函数创建的画笔
SetBkMode(); // 设置背景模式:透明和不透明
GetBkMode(); // 获取背景模式

绘图模式(混合模式)

光栅操作:Raster Operation, ROP
二元光栅操作ROP2
一个画笔画到客户区上时, 出现的颜色是两者颜色按位进行位操作
SetROP2(); // 默认显示的是画笔的颜色, 设置背景色和前景色的混合模式
GetROP2();

画刷

填充内部
Rectangle(); // 矩形
Ellipse(); // 椭圆
RoundRect(); // 圆角矩形
Chord(); // 圆弧和弦的封闭区域
Pie(); // 扇形封闭区域
Polygon(); //多边形,
PolyPolygon(); // 多个多边形
设置的画刷为 NULL_BRUSH 和 HOLLOW_BRUSH (空画刷)时, 就不会填充
画刷的本质:是一个 8 * 8 像素的位图, 位图填充比像素点填充好一些
CreateSolidBrush(); // 创建一个实心画刷
CreateHatchBrush(); // 创建一个阴影画刷
CreateBrushIndirect(); // 创建一个指定的画刷
多边形的填充模式
Polygon(); //多边形,
PolyPolygon(); // 多个多边形
SetPolyFillMode(); // 设置多边形填充模式
ALTERNATE(交替式, 默认)
WINDING(螺旋式)
仅会在绘制复杂的,重叠的d多边形才会有区别

区域

默认的客户区范围就是一个剪切区域!
SelectClipRgn(); // 指定一个区域作为当前设备环境的剪切区域
HRGN : 区域
一个区域是对显示器一块空间的描述, 这个空间可以是矩形、多边形和椭圆的组合
我们可以使用区域进行绘图或裁剪
将区域选入设备环境, 就可以使用这个区域来剪裁(就是将绘制动作限制在客户区的一个特定部分)
CreateRectRgn(); // 创建矩形区域
CreateRectRgnIndirect(); // 创建矩形区域(参数不同)
CreateEllipticRgn(); // 创建椭圆形区域
CreateEllipticRgnIndrect(); // 创建椭圆形区域(参数不同)
CreatePolygonRgn(); // 创建多边形区域
CreatePolyPolygonRgn(); // 创建多个多边形区域
CreateRoundRectRgn(); // 创建圆角矩形区域
FillRgn(); // 填充区域
FillFrame(); // 绘制区域边框
区域之间可以合并,产生一个新的区域!
CombineRgn(hrgnDest, hrgnSrc1, hrgnSrc2, fnCombinMode); // 将两个区域合并起来,并产生一个新的组合区域 hrgnDest, 第一个参数可以暂时赋为一个像素的区域, 具体用法参考文档

位图(暂时)

HBITMAP : 位图句柄
资源视图--添加资源--导入/新建--保存
LoadBitmap(hInstance, MAKEINTRESOUCE(IDB_BITMAP1)); // 将图片加载到程序中, 将当前实例句柄作为全局变量
MAKEINTSOURCE(); // 类型强转
需要包含资源头文件
"resource*.h" // 定义ID对应的唯一值
#define IDB_BITMAP1 1
"Bmp.rc" // 定义图片ID对应的文件路径
如果报错 : #include "afxres.h" 换成 #include "winres.h"

双缓冲

HDC hdc = GetDC(hwnd);
HDC hMemdc = CreateCompatibleDC(hdc); // 内存设备环境, 创建一个与指定设备兼容的内存设备环境 DC
HBITMAP hBitmap = CreateCompatibleBitmap(); // 创建兼容性位图, 大小为想要绘制的区域
SelectObject(hMemdc, hBitmap);
// 再创建一个多个兼容性 DC, 存放多个位图
HDC hMemdc1 = CreateCompatibleDC(hdc);
SelectObject(hMemdc1, hBitmap1); // 选入位图
BitBlt(); //
……
BitBlt(); // 将hMemdc1 等兼容性 DC 拷贝到 hMemdc上
BitBlt(); // 将 hMemdc 拷贝到 hdc 上
DeleteObject(hBitmap);
DeleteDC(hMemdc);
ReleaseDC(hwnd, hdc);