如何使用SetWindowRgn函数创建异形窗口

原创 2001年03月21日 14:18:00

如何使用SetWindowRgn函数创建异形窗口

时间:2000/10/11 21:06 eNet技术

   很多的游戏和工具软件都使用异形窗口来出奇至胜。其实创建异形窗口从技术上来说难度不大,但是有没有效果主要还是在于创意是否出奇。下面简单的介绍如何使用SetWindowRgn制作异形窗口。

  SetWindowRgn是新的SDK函数。该函数将绘画消息和鼠标消息都限定在窗口的一个指定的区域内,实际上使窗口成为指定的不规则形状。

  首先使用AppWizard创建一个基于对话框的应用程序,并使用资源编辑器从资源中删除有的缺省控件、标题以及边界。

  给对话类增加一个CRgn数据成员,以便使用该数据成员建立窗口区域。

Class CTestDlg:public CDialog

{ …

private:

   CRgn m_rgn; // window region

…}

   修改对话框的OnInitDialog函数,建立一个椭圆区域并调用SetWindowRgn将该区域分配给窗口:

BOOL CTestDlg::OnInitDialog ()

{

CDialog::OnInitDialog ()

//得到对话框的尺寸

CRect rcDialog;

GetClientRect (rcDialog)

//创建一个椭圆形的区域,并使用SetWindowRgn重设对话框的形状。

m_rgn.CreateEllipticRgn (0 , 0 , rcDialog.Width(),

rcDialog.Height ()); SetWindowRgn (GetSafeHwnd () , (HRGN) m_ rgn,TRUE );

return TRUE;

}

  一个简单的异形窗口已经生成,如果编译运行工程,将出现一个椭圆形的窗口。下面的代码是在OnPaint消息中进行处理,使得对话框具有立体效果。

void CTestDlg::OnPaint ()

{

   CPaintDC paintDC (this);

   // 得到设备 // 设置画椭圆时不画边界

   paintDC. SelecStockObject (NULL_PEN);

   // 得到球体的颜色

   COLORREF ballColor= RGB( 0 , 0 , 255);

  BYTE byRed =GetRValue (ballColor);

  BYTE byGreen = GetGValue (ballColor) ;

  BYTE byBlue = GetBValue (ballColor) ;

   // 得到球体的范围。

   Rect rcDialog;

   GetClientRect (rcDialog) ;

   // 得出画球体的最小单位

   int nUnits =min (rcDialog.right , rcDialog.bottom ) ;

   //计算水平方向和垂直方向的画线单位。

   float fltStepHorz = (float) rcDialog.right /nUnits ;

   float fltStepVert = (float) rcDialog.bottom /nUnits ;

   int nEllipse = nUnits/3 ;

   // 开始画出多个椭圆,以达到视觉上的立体感。

   CBrush brush ;

   // 使用ballColor的颜色填充画刷。

   CBrush *pBrushOld;

   // 存储旧画刷

  for (nIndex = 0 ;nIndes < nEllipse ;nIndes++)

  {

     CreatSolidBrush (RGB ( ( (nIndex*byRed ) /nEllipse );

    ( ( nIndex * byGreen ) /nEllipse ), ( (nIndex*byBlue)/nEllipse ) ) ) ;

     pBrushOld= paintDC .SelectObject (&brhsh) ;

     paintDC .Ellipse ( (int) fltStepHorz * 2, (int)fltStepVert * nIndex ,

     rect. right -( (int)fltStepHorz * nIndex )+ 1, rect . bottom -( (int)

     fltStepVert * (nIndex *2) ) +1) ;

     brush.DelecteObject ( ) ;

   }

}

  异形窗口不是只适用于对话框,同样的适用于单文档,多文档类型的应用。如果读者有兴趣,可以自己进行尝试。如有疑问可发Mail至学院信箱。

 

使用SetWindowRgn函数创建异形窗口 --简单异形窗口

  Technorati 标签: MFC,SetWindowRgn,异形窗口,API,GDI,C++,源码,编程,Windows,api,vc++写在正文前:我是个初学者,很多程序员都说要多打代码,不...
  • jean7155
  • jean7155
  • 2010年04月29日 23:03
  • 12871

如何使用SetWindowRgn函数创建异形窗口

很多的游戏和工具软件都使用异形窗口来出奇至胜。其实创建异形窗口从技术上来说难度不大,但是有没有效果主要还是在于创意是否出奇。下面简单的介绍如何使用SetWindowRgn制作异形窗口。   SetWi...
  • kyowu
  • kyowu
  • 2008年05月22日 16:39
  • 251

如何使用SetWindowRgn函数创建异形窗口

2001年03月21日 14:18:00 如何使用SetWindowRgn函数创建异形窗口时间:2000/10/11 21:06eNet技术   很多的游戏和工具软件都使用异形窗口来出奇至胜。...
  • softart
  • softart
  • 2007年10月27日 07:55
  • 170

【win32】最简单的异形窗口实现

void CTransparentWnd::SetupRegion(CDC *pDC, unsigned short MaskID) {  CDC     memDC;  CBitmap   c...
  • zxxSsdsd
  • zxxSsdsd
  • 2015年04月02日 10:58
  • 1036

MFC异形窗口-多边形窗口-根据图片自定义窗口形状-CRgn

Windows中所有窗口显示默认为矩形,很多时候我们希望窗口的形状可以随意变化。这个时候我们就需要使用MFC的CRgn类, 每一个窗口都有一个自己的CRgn,定义了当前窗口的显示区域,CRgn就好像...
  • xukaiwen_2016
  • xukaiwen_2016
  • 2016年08月05日 17:07
  • 2607

Qt中不规则异形窗口的实现几点总结

Qt中不规则异形窗口的实现目前发现有两种方法 1.针对窗口类的,特别是登陆窗口之类的,如下图所示: 实现方法;在main函数中,加入重要代码: w.setWindowOpacity(1);/...
  • li_jian_xing
  • li_jian_xing
  • 2014年10月11日 15:03
  • 1678

Win32下创建异形窗口

异型窗口 先来说说什么是异形窗口,
  • u011645174
  • u011645174
  • 2014年04月15日 18:27
  • 1264

qt 创建异形窗体

我们可以看到QPixmap::mask()函数返回图片中Alpha值不为0有区域,就是异形。 QSplashScreen::setMask()就是设置掩码区域。 所以实际的显示效果就是只显示出Al...
  • shell_albert
  • shell_albert
  • 2015年06月17日 16:12
  • 1011

QT中异形窗口的绘制

转自http://www.cppblog.com/eXile/archive/2007/12/09/38084.html     这里讨论的只是Windows平台上的实现。   在QT中绘制异形...
  • xiaofengkuang
  • xiaofengkuang
  • 2011年12月09日 18:27
  • 2434

MFC中异形分层窗口设计

关于异形窗口,网上有很多关于这方面的教程,杂七杂八,有很多的问题,比如异形窗口控件不显示等等,关于复杂异形窗口,可以通过分层窗口来解决。下面说一下设计思路。 方法/步骤 ...
  • learner198461
  • learner198461
  • 2015年02月06日 12:48
  • 985
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何使用SetWindowRgn函数创建异形窗口
举报原因:
原因补充:

(最多只允许输入30个字)