一、序言
在绝大多数的 Windows 应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我
们常用的,“记事本”,“扫雷”,等等。矩形窗体,具有编程实现简单,风格简洁的优点,所
以在普通文档应用程序和简单小游戏中使用足矣。但在某些娱乐游戏程序中使用就略显呆
板些了,这时若用不规则窗体替代原先的矩形窗体,将会使这类程序更添情趣。典型的例
子有 windows 自代的 Media Player,新版本的 Media Player 有个控制面板的选项,选中这
些面板,播放器就以选中的面板形状出现,这时的播放器比以前版本的 Media Player 的古
老矩形界面要生动有趣的多了。要实现不规则窗体不是太难,知道了基本原理后,你也可
以创建各种有趣的不规则窗体。
二、实现原理
所有的Windows 窗体都位于一个称为“region”中,窗体的大小如果超出“region”的范围,
windows 会自动裁剪超出"region"范围那部分的窗体,使其不可见。所以,要创建不规则
窗体有两个步骤:第一步就是创建不规则"region".第二步就是将窗体放到创建的“region”中。
其中第二步很简单就调用一条语句即可。在 SDK 中调用 API 函数 SetWindowRgn,
该函数原型如下:
int SetWindowRgn( HWND hWnd, HRGN hRgn, BOOL bRedraw );
其中 hWnd 为待设置的窗体句柄,hRgn 为已经创建的"region"句柄,bRedraw 代表是
否要重绘窗体。在 MFC 中使用窗口类 CWnd 的成员函数 int
CWnd::SetWindowRgn(HRGN hRgn, BOOL bRedraw );该函数的参数意义与 API 中同名
函数相同。
相对与第二步,创建不规则窗体的第一步要复杂许多,并且不规则窗体越复杂,创建
其"region"的过程也越复杂。接下去我们将由浅入深地介绍各种创建”region”的方法。
在 MFC 中"region"对象,由 CRgn 类实现。CRgn 的几乎每个成员函数都有同名的
SDK API 函数对应。
三、简单“region”的创建
类 CRgn 创建一个新的"region"的简单方法有以下几个成员函数:BOOL
CRgn::CreateRectRgn( int x1, int y1, int x2, int y2 ); 创建矩形的“region”。
BOOL CRgn::CreateEllipticRgn( int x1, int y1, int x2, int y2 ); 创建圆形或椭圆形
“region”。
BOOL CRgn::CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 );
创建圆角矩形“region”。
BOOL CRgn::CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode );