当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 形态各异的不规则窗体

VC++
几个数字信号处理算法程序
简易软盘镜像工具的实现及操作系统编写初步
教你使用正则表达式
C++ 扩展和嵌入 Python
拷贝构造和赋值操作符,C#和本机 C++ 代码的互用性
精通VC与Matlab联合编程(六)
精通VC与Matlab联合编程(五)
一个排序用的C++函数模板
浅析VC与MATLAB联合编程
C++编译器如何实现异常处理
文件重定义冲突的分析与解决
一步一步实现MFC扩展DLL中导出类和对话框
C宏:智者的利刃,愚者的恶梦!
引用的作用
《UTF-8与GB2312之间的互换》的改进
程序风格的要素-C++风格指南
VC+6.0实现文本串的自由拆分
怎样给串行化类分配版本号(可配置版本模式)
在常规的编程任务中使用新的 <tuple> 库
使用 typedef 抑制劣质代码

VC++ 中的 形态各异的不规则窗体


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 47 ::
收藏到网摘: n/a

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

下载本文示例工程

说起不规则窗体也许我们大家都会觉得新鲜,这是因为我们平日里绝大部分窗体用的都是正规正矩的矩形窗体,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!所有的代码都在本文附带的例子里面,可不要错过哦!