形态各异的不规则窗体

原创 2004年06月29日 16:27:00

形态各异的不规则窗体
作者:李晓飞

下载本文示例工程

说起不规则窗体也许我们大家都会觉得新鲜,这是因为我们平日里绝大部分窗体用的都是正规正矩的矩形窗体,Word这个大名鼎鼎的软件想必大家都已用过,那么在Word里就按下你手中的F1键吧,弹出的窗体形态怎么样,很炫吧!(如下图所示)。

那么实现这样的窗体困难吗?简单!几句话就可以轻松搞定。不过在揭示答案之前我们还是先来熟悉一下在Windows里不规则窗体的实现几点要素。

一、创建不规则窗体的几个主要函数:
<1> CreateRectRgn : 创建矩形窗体轮廓。
<2> CreateRoundRectRgn : 创建圆角矩形窗体轮廓。
<3> CreateEllipticRgn : 创建圆形或椭圆形窗体轮廓。
<4> CreatePolygonRgn : 创建多边形窗体轮廓。

上面函数在创建不规则窗体轮廓时可直接使用,无须自己指定轮廓路径。如果想让窗体更复杂,你可以使用CombineRgn把多个轮廓路径混合起来实现。上面的函数还可以用BeginPath,EndPath和PathToRegion三个函数实现,其实这三个函数给用户提供了最大的创造和发挥的空间,让用户自定义窗体轮廓路径,这样用户就可以拿起手中Pen来画出所有你想要的东西,什么矩形/椭圆/多边形/弧线形...... 都可以轻松搞定,就连字体来可以作为窗体的形状哦。

二、改变窗体的形状:
我们创建好了自己的窗体形状,那么如何来通知Windows来改变窗体的形状呢?秘密只有一句话:SetWindowRgn

注意:本文所附带的例子全部以BeginPath,EndPath和PathToRegion为中心来讲解如何实现不规则窗体。

三、具体实现步骤:
说了这么多的函数,那么接下来就让我们一起来看一看如何来使用BeginPath,EndPath和PathToRegion。下面就以一个字体窗体来看看三者的使用步骤。假设以下代码放在了一个按钮的Click事件中:

CClientDC dc(this); HDC hDC; CFont mFont; hDC = ::GetDC(this->m_hWnd); //创建字体 VERIFY(mFont.CreateFont( 200, 50, 0, 0, FW_HEAVY, TRUE, FALSE, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, "宋体")); if (hDC!=NULL) { //开始记录窗体轮廓路径 dc.BeginPath(); //设置背景为透明模式,这句话是必须有的。 dc.SetBkMode(TRANSPARENT); CFont * pOldFont; pOldFont = dc.SelectObject( &mFont ); dc.TextOut(0, 0, "VCKbase"); dc.SelectObject( pOldFont ); mFont.DeleteObject();  //结束记录窗体轮廓路径 dc.EndPath();  //把所记录的路径转化为窗体轮廓句柄 m_wndRgn = ::PathToRegion(dc);  //赋予窗体指定的轮廓形状 this->SetWindowRgn(m_wndRgn, TRUE); } else AfxMessageBox("Error!");
看过了以上代码你也许已经明白这三个函数的内涵。那么又如何画出象Word中按F1后弹出的窗体呢?这我就不用多说了吧,拿起你手中的画笔吧,一切都很Easy!所有的代码都在本文附带的例子里面,可不要错过哦!

DUILIB创建不规则窗体

声明:原始方法部分已经废弃,现在有更好的办法来实现DUILIB加载PNG图片,为保持学习的渐进性,我还是保留了原始方法部分的博文与代码,大家没有必要看原始部分了,直接看新方法部分吧; 新方法 ...
  • harvic880925
  • harvic880925
  • 2013年05月14日 15:00
  • 8035

DUILIB异形窗口实现

异形窗口的实现 基本思路是: 1.将窗口扩展属性设置为分层属性WS_EX_LAYERED。 2.选一张透明的png图片,并将其加载进来。 3.创建与窗口兼容的内存设备上下文,以及兼容位图,将兼容位图选...
  • xdrt81y
  • xdrt81y
  • 2014年03月25日 15:14
  • 8692

MFC实现不规则形状窗口(CF登陆窗口)

1,目标 实现形状不规则的窗口,例如CF登陆窗口。 可以看到,窗口不是死板的矩形,而是带突出带凹陷的不规则形状。 2,原理 查询CWnd接口,有一个叫SetWindowRgn的方法,可以设置窗口显...
  • dpsying
  • dpsying
  • 2013年12月04日 23:22
  • 8283

CRgn几种创建方法,不规则窗体

一、序言  在绝大多数的Windows应用程序中,其窗体都是使用的正规正矩的矩形窗体,例如我们常用的,“记事本”,“扫雷”,等等。矩形窗体,具有编程实现简单,风格简洁的优点,所以在普通文档应用程序和简...
  • tajon1226
  • tajon1226
  • 2011年07月06日 23:02
  • 6432

C# 制作不规则窗体的几种解决方案

制作不规则窗体,本例采用图片背景形式,这也是通常的思路。以前也做过类似的案例,但都不深入,这次项目中需要用到,顺便理了下思路,找到另一种比较简单的方法,下面介绍下三种解决方案。   第一种:也是...
  • dongzhe8
  • dongzhe8
  • 2015年12月21日 17:52
  • 695

WPF实现不规则窗体(C#) .

见到一些游戏的客户端窗口,形状是不规则的,一直觉得很炫。就想用winform做一个玩下,思路就是:去掉标题栏,用一张透明背景色的图片作为Form的背景。可是在实现的过程中我却悲愤的发现,winform...
  • wangyong0921
  • wangyong0921
  • 2012年01月01日 22:52
  • 2117

不规则窗体形状的ToolTip .

前一篇利用层实现ToolTip,利用图形组合实现不规则的ToolTip    是实现不规则窗体的ToolTip的方法,该方法虽然实现了要求,但却有两点不足: 第一:该方法太笨拙,每个需要ToolTi...
  • wyt4455
  • wyt4455
  • 2013年04月01日 11:57
  • 434

Java根据图片建立不规则窗体详解

JAVA程序的外表总是一板一眼的,看多了难免审美疲劳,能不能使我们的JAVA程序外观变得更美观更独特呢?答案是肯定的,我们可以让JAVA程序根据图片来生成自定义的不规则窗体。比如下图的这种外观:  ...
  • lygapp
  • lygapp
  • 2014年09月18日 15:26
  • 659

C#创建不规则窗体的几种方式

现在,C#创建不规则窗体不是一件难事,下面总结一下:一、自定义窗体,一般为规则的图形,如圆、椭圆等。做法:重写Form1_Paint事件(Form1是窗体的名字),最简单的一种情况如下:System....
  • yunhaiC
  • yunhaiC
  • 2011年02月19日 20:40
  • 815

Qt学习15——不规则窗体

Qt中不规则窗体的实现,是在原来窗口图形的基础上,增加图形遮罩,剩余部分为最终显示的窗口图形。...
  • u014266675
  • u014266675
  • 2017年06月30日 16:27
  • 231
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:形态各异的不规则窗体
举报原因:
原因补充:

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