如何使用SetWindowRgn函数创建异形窗口
2008-05-22 16:39
525 查看
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
很多的游戏和工具软件都使用异形窗口来出奇至胜。其实创建异形窗口从技术上来说难度不大,但是有没有效果主要还是在于创意是否出奇。下面简单的介绍如何使用SetWindowRgn制作异形窗口。
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
SetWindowRgn是新的SDK函数。该函数将绘画消息和鼠标消息都限定在窗口的一个指定的区域内,实际上使窗口成为指定的不规则形状。
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
首先使用AppWizard创建一个基于对话框的应用程序,并使用资源编辑器从资源中删除有的缺省控件、标题以及边界。
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
给对话类增加一个CRgn数据成员,以便使用该数据成员建立窗口区域。
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
Class CTestDlg:public CDialog
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/1327ab569c1ae82736693a50b8e33378.gif)
......{ …
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
private:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
CRgn m_rgn; // window region
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/0196c3df5ea9e936f21e9932cca91014.gif)
…}
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
修改对话框的OnInitDialog函数,建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口:
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
BOOL CTestDlg::OnInitDialog ()
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/1327ab569c1ae82736693a50b8e33378.gif)
......{
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
CDialog::OnInitDialog ()
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
//得到对话框的尺寸
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
CRect rcDialog;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
GetClientRect (rcDialog)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
//创建一个椭圆形的区域,并使用SetWindowRgn重设对话框的形状。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
m_rgn.CreateEllipticRgn (0 , 0 , rcDialog.Width(),
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
rcDialog.Height ()); SetWindowRgn (GetSafeHwnd () , (HRGN) m_ rgn,TRUE );
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
return TRUE;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/0196c3df5ea9e936f21e9932cca91014.gif)
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
一个简单的异形窗口已经生成,如果编译运行工程,将出现一个椭圆形的窗口。下面的代码是在OnPaint消息中进行处理,使得对话框具有立体效果。
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
void CTestDlg::OnPaint ()
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/1327ab569c1ae82736693a50b8e33378.gif)
......{
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
CPaintDC paintDC (this);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 得到设备 // 设置画椭圆时不画边界
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
paintDC. SelecStockObject (NULL_PEN);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 得到球体的颜色
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
COLORREF ballColor= RGB( 0 , 0 , 255);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
BYTE byRed =GetRValue (ballColor);
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
BYTE byGreen = GetGValue (ballColor) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
BYTE byBlue = GetBValue (ballColor) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 得到球体的范围。
![](http://images.csdn.n<br/>d310<br/>et/syntaxhighlighting/OutliningIndicators/InBlock.gif)
Rect rcDialog;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
GetClientRect (rcDialog) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 得出画球体的最小单位
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
int nUnits =min (rcDialog.right , rcDialog.bottom ) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
//计算水平方向和垂直方向的画线单位。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
float fltStepHorz = (float) rcDialog.right /nUnits ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
float fltStepVert = (float) rcDialog.bottom /nUnits ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
int nEllipse = nUnits/3 ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 开始画出多个椭圆,以达到视觉上的立体感。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
CBrush brush ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 使用ballColor的颜色填充画刷。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
CBrush *pBrushOld;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
// 存储旧画刷
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
for (nIndex = 0 ;nIndes < nEllipse ;nIndes++)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201104/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201104/7ff8d92cded7e0ce15e7ca1acc870052.gif)
......{
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse );
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
( ( nIndex * byGreen ) /nEllipse ), ( (nIndex*byBlue)/nEllipse ) ) ) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
pBrushOld= paintDC .SelectObject (&brhsh) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
paintDC .Ellipse ( (int) fltStepHorz * 2, (int)fltStepVert * nIndex ,
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
rect. right -( (int)fltStepHorz * nIndex )+ 1, rect . bottom -( (int)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
fltStepVert * (nIndex *2) ) +1) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/6a9c071a08f1dae2d3e1c512000eef41.gif)
brush.DelecteObject ( ) ;
![](https://oscdn.geek-share.com/Uploads/Images/Content/201104/717446ca04a6125dc5b6b54e0fa14ab4.gif)
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/201109/0196c3df5ea9e936f21e9932cca91014.gif)
}
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
异形窗口不是只适用于对话框,同样的适用于单文档,多文档类型的应用。如果读者有兴趣,可以自己进行尝试。
![](https://oscdn.geek-share.com/Uploads/Images/Content/2015/2015030196/6810355c2f78c12e91b7997a8e8c583a.gif)
相关文章推荐
- 如何使用SetWindowRgn函数创建异形窗口 选择自 ghj1976 的 Blog
- 如何使用SetWindowRgn函数创建异形窗口
- 使用SetWindowRgn函数创建异形窗口 --简单异形窗口
- 使用SetWindowRgn函数创建异形窗口 --简单异形窗口
- 如何使用SetWindowRgn函数创建异形窗口
- 如何使用SetWindowRgn函数创建异形窗口
- 多线程开发要点1:如何使用类的成员函数创建线程
- 利用ATL创建com组件和如何在程序中使用组件的接口函数和设置接口的属性
- GUI程序如何使用控制台输出调试信息[zz][MFC调用win32窗口显示调试信息,使用AllocConsole 函数 ]
- Nim如何在windows下使用winapi创建窗口
- linux系统如何使用fork函数创建子进程
- 在VC6.0中创建和使用静态链接库&amp;amp;&amp;amp;C如何调用C++ 成员函数
- 窗口的创建CreateWindow/CreateWindowEx函数使用说明
- JavaScript Function类是干什么用的,有什么用?使用Function如何创建函数?
- 【ASP.NET】如何使用类创建公共函数,在不同ASP.NET页面间重复调用
- python 8-1 如何使用多线程,Thread创建线程,执行函数赋值给target//类+函数放在run方法中执行
- MS BI 中的Ad - hoc 报表 (即席报表) 基本概念以及如何创建和使用
- 如何:使用 Microsoft Excel 创建负载测试性能报告
- VC中控制台程序如何创建窗口
- 使用to_date创建函数索引的时候经常会遇到ORA-01743错误