[Win32]画刷、矩形、不规则区域和剪裁

本文介绍了Win32图形编程中关于画刷的基本概念,包括其在抖动色彩技术中的作用,以及画刷的创建和删除。此外,文章详细阐述了矩形操作,特别是如何在程序空闲时利用PeekMessage显示随机矩形。接着,文章探讨了区域的概念,区域剪裁的原理,以及如何建立和合并规则与不规则区域。最后,文章讨论了如何利用区域进行剪裁,包括InvalidateRgn和ValidateRgn函数的作用,以及SelectObject和SelectClipRgn在限制绘制范围中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 画刷简介:

    1) Windows就是使用画刷来实现抖动色彩技术的(即显示比通常显示器可用颜色更多的色彩的技术),比如实心画刷就是通过建立抖动位图进行填充,因此其颜色并不一定是最接近的纯色,而是更为丰富的色彩;

    2) 画刷其实是一个8×8像素的小位图,即用该位图反复在水平方向和垂直方向使用来填充某一区域;

    3) 5种建立画刷的方式对应着三种画刷:

hBrush = CreateSolidBrush( crColor ); // 利用抖动位图建立实心画刷(不一定是最接近纯色)

// 阴影线样式画刷,crColor为阴影线颜色(非抖动技术,最接近纯色),fnStlye指定阴影线的风格
// 阴影线之间的空隙利用空隙背景填充来决定(即SetBk函数)
hBrush = CreateHatchBrush( fnStlye, crColor );

// 建立自定义的画刷(要使用位图技术以及资源编译器等),之后会讲
hBrush = CreatePatternBrush( hbmp );
hBrush = CreateDIBPatternBrushPt( lpPackedDIB, iUsage );
以上即三种类型的画刷,前两种是内部已经定义好的,第三种是自定义的,而最后一种建立画刷的方式包含以上所有函数的功能,即先建立逻辑画刷结构LOGBRUSH,再通过CreaeBrushIndirect来建立真正的画刷资源(出现在内存中),最后再使用SelecObject将画刷选入设备环境,首先看一下LOGBRUSH的定义:

typedef struct tagLOGBRUSH { 
	UINT     lbStyle; 
	COLORREF lbColor; 
	LONG     lbHatch; 
} LOGBRUSH, *PLOGBRUSH;

其中第一个字段将决定后两个字段被如何解释:


和上述4个函数的参数一模一样!

    4) 由于画刷也是GDI对象,因此建立的画刷同样需要删除(但是StockObject画刷不能Delete),用DeleteObject来删除;

    5) 获取画刷信息通过GetObject( hBrush, sizeof( LOGBRUSH ), (LPVOID)&logbrush )函数调用即可;


2. 12个操作矩形的神器:

// 以下两个函数无需将画刷选入设备环境而可以直接指定画刷!

// 用hBrush填充一个矩形区域(无边框)
FillRect( hdc, &rect, hBrush ); 
// 用hBrush绘制矩形边框(不填充),用画刷而不用画笔的好处就是可以使用抖动色!
FrameRect( hdc, &rect, hBrush ); 

// 将矩形区域中所有像素点反转(二进制位01反转),即变成相反色(黑变白、白变黑、绿变洋红)
InvertRect( hdc, &rect ); 

// 设定rect结构的各个字段(可以当成C++的构造函数)
SetRect( &rect, xLeft, yTop, xRight, yBottom );

// 将矩形朝x方向或y方向移动
OffsetRect( &rect, x, y ); // x和y表示位移距离,负表示x左移y上移

// 增大或减小矩形尺寸
InflateRect( &rect, x, y ); // x和y表示x方向和y方向上的长度该变量,负表示减少

// 将RECT各字段设为0
SetRectEmpty( &rect );

// 复制矩形结构
CopyRect( &DestRect, &SrcRect );

// 矩形求交
IntersectRect( &DestRect, &SrcRect1, &SrcRect2 ); // 求交的结果必然为一矩形

// 矩形求并
UnionRect( &DestRect, &SrcRect1, &SrcRect2 ); // 结果是能包含两个Src的最小面积矩形

// 判空,即判断各字段是否为空
IsRectEmpty( &
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值