精选文章 用VC++实现不规则窗口

用VC++实现不规则窗口

作者:蝈蝈俊 时间: 2021-02-07 03:20:16
蝈蝈俊 2021-02-07 03:20:16
【摘要】作者:曾劲峰   随着Windows95的推出,在PC系统中出现了越来越多的应用程序采用了非矩形外观的窗体,或者模拟现实中的事物,如钟、眼睛等;或者创造一个具有三维观感的非现实物体,这类程序以各种mp3播放器为代表,甚至一些大腕级的老牌应用程序(如Norton),也开始拥有这种窗口。一来是因为Windows操作系统和各类开发工具自身功能的极大提升;二来,也说明开发人员希望通过与众不同的外观,...


作者:曾劲峰

  随着Windows95的推出,在PC系统中出现了越来越多的应用程序采用了非矩形外观的窗体,或者模拟现实中的事物,如钟、眼睛等;或者创造一个具有三维观感的非现实物体,这类程序以各种mp3播放器为代表,甚至一些大腕级的老牌应用程序(如Norton),也开始拥有这种窗口。一来是因为Windows操作系统和各类开发工具自身功能的极大提升;二来,也说明开发人员希望通过与众不同的外观,来强调使用时的第一映像,以期达到吸引用户的目的,毕竟,现在的PC是一个充满图形(图象)的世界,充分利用这一特点,也能在一定程度上改善程序界面的可操作性。而且,对于同一类型的应用程序,在功能、性能相差不大的情况下,用户也往往愿意选择外观漂亮的那种。因而,很多文章都在介绍如何创建不规则的窗口,但几乎千篇一律地基于VB进行说明。而笔者本人一直基于C/C++语言进行开发,因此,研究了一下在VC++5中实现不规则窗口的方法,下面就实现的主要方法进行说明。  
  VC++5提供了CRgn类和SetWindowRgn()函数来实现不规则的程序窗口。创建一个不规则窗口的过程是:首先定义一个CRgn类,并用各种初始化函数创建CRgn类的具体区域,然后调用CWnd::SetWindowRgn()函数创建不规则窗口。  
  CRgn是从CgdiObject衍生出来的类,用来确定一个多边形、椭圆或者由多边形及椭圆合成的范围,在程序中主要会用到CreateRectRgnIndirect()、CreateEllipticRgnIndirect()、CreatePolygonRgn()三个函数。  
  CreateRectRgnIndirect(LPCRECT   
lpRect)函数创建一个矩形区域,参数lpRect指定所创建的矩形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标。例如:  
CRgn MyRgn;   
RECT m_rect;   
m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;   
MyRgn.CreateRectRgnIndirect( &m_rect );   
  CreateEllipticRgnIndirect(LPCRECT   
lpRect)函数创建一个椭圆形区域,参数lpRect指定所创建的椭圆形区域在窗口用户区中的left(左)、top(上)、right(右)、bottom(下)坐标,如果指定right坐标与left坐标之差等于bottom坐标与top坐标之差,则创建的区域是一个圆。例如:  
CRgn MyRgn;   
RECT m_rect;   
m_rect.left=0; m_rect.top=0; m_rect.right=500; m_rect.bottom=300;   
MyRgn.CreateEllitpticRgnIndirect( &m_rect );   
  CreatePolygonRgn(LPPOINT lpPoints, int nCount, int   
nMode)函数创建一个多边形区域,参数lpPoints指向一个POINT结构数组,在POINT结构数组中每个POINT结构项,用来确定多边形顶点在窗口用户区中的坐标;nCount说明POINT结构数组中POINT结构项的数目,也就是多边形的顶点数;nMode指定多边形的填充方式,一般使用ALTERNATE方式。例如创建一个三角形:  
CRgn MyRgn;   
POINT Points[3];   
Points[0].x=Points[0].y=0; Points[1].x=10; Points[1].y=30; Points[2].x=5; Points[2].y=60;   
MyRgn.CreatePolygonRgn(Points, 3, ALTERNATE);   
  利用以上的函数创建区域后,就可以调用CWnd::SetWindowRgn(HRGN hRgn, BOOL   
bRedraw)来创建非矩形的窗口了。SetWindowRgn()函数参数说明:hRgn是一个CRgn类的句柄;bRedraw如果被设置成TRUE,那么,在窗口次序发生变化时,系统会发送WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息给窗口。  
  如果要创建外形更复杂的窗口,例如mp3播放器Soniq的一个播放界面,就是两个圆形部分重合形成的。对于这类窗口的创建,还要用到CRgn类另外一个极其重要的函数——CombineRgn()。首先要说明的是:在VC++5的在线帮助中,将这个函数归入了初始化(Initialization)类型中,实际上,如果定义的CRgn类在没有使用其它初始化函数初始化之前,就调用这个函数的话,程序将会失败,所以,这个函数似乎应该归入operation类更恰当。  
  CombineRgn(CRgn* pRgn1, CRgn* pRgn2, int   
nCombineMode)函数用来创建一个由多个多边形、椭圆合成的不规则区域。pRgn1、pRgn2分别指向参与合成不规则区域的多边形或椭圆形;nCombineMode说明合成的方式:RGN_AND最后的区域是pRgn1和pRgn2的重叠部分;RGN_DIFF最后的区域是pRgn1中不包含pRgn2的部分;RGN_OR最后的区域同时包含pRgn1和pRgn2;RGN_XOR最后的区域同时包含pRgn1和pRgn2,但不包含pRng1和pRng2重叠的部分。例如,创建一个类似Soniq播放器的界面:  
......   
RECT m_Cyc1;   
RECT m_Cyc2;   
CRgn RgnCyc1;   
CRgn RgnCyc2;   
CRgn RgnDlg;   
m_Cyc1.left=100; m_Cyc1.top=5; m_Cyc1.right=200; m_Cyc1.bottom=105;   
m_Cyc2.left=80; m_Cyc2.top=85; m_Cyc2.right=180; m_Cyc2.bottom=185;   
RgnDlg.CreateEllipticRgnIndirect( &m_Cyc1 );   
RgnCyc1.CreateEllipticRgnIndirect( &m_Cyc1 );   
RgnCyc2.CreateEllipticRgnIndirect( &m_Cyc2 );   
RgnDlg.CombineRgn( &RgnCyc1, &RgnCyc2, RGN_OR );   
MyWin.SetWindowRgn( (HRGN)RgnDlg, TURE );   
......   
  以上就是利用VC++5实现不规则窗口的方法,相信大家看后都能创造出各种希奇古怪的窗口来,但是,有一点应该提请注意:对于Windows操作系统而言,桌面上窗口的形状存储在内存中,所以,窗口外形的复杂程度应该适可而止,不要超过32767╳32767个逻辑单元,或者64K存储区  
。当然,还有一点很重要:就是给窗口一张漂亮的脸,最好具有三维立体效果。

 

 

 

勿删,copyright占位
您找到想要的结果了吗?
用VC++实现不规则窗口
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:多用户广告轮播的实现

下一篇:多边形窗口

您可能感兴趣

  • Spring反射实现模型

    import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.uti...

  • 并发下常见的加锁及锁的PHP具体实现代码

    <?php /** * CacheLock 进程锁,主要用来进行cache失效时的单进程cache获取,防止过多的SQL请求穿透到数据库 * 用于解决PHP在并发时候的锁控制,通过文件/eaccelerator进行进程间锁定 * 如果没有使用eaccelerator则进行进行文件锁处理,会做对应目录下产生对应粒度的锁 * 使用了eac...

  • 几种常用的排序方法——c++实现

    实现几种常用的排序方法,后续补充:  #include<iostream> using namespace std; //1.BubbleSort int* BubbleSort(int array[],int const N) { int *Arr = new int[N]; for (int i = 0; i < N; i++) {...

  • Python使用pylab库实现绘制直方图功能

    这篇文章主要介绍了Python使用pylab库实现绘制直方图功能,结合实例形式分析了Python数据读取、遍历以及基于pylab库绘制直方图的相关操作技巧,需要的朋友可以参考下   本文实例讲述了Python使用pylab库实现绘制直方图功能。分享给大家供大家参考,具体如下: Python直方图 1 2 3 4 5 6 7 8 9 10 1...

  • windows下,分布式进程的简单实现

    在Thread和Process中,应当优选Process,因为Process更稳定, 而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。 Python的multiprocessing模块不但支持多进程,而且managers子模块还支持把多进程分布到多台机器上。 一个服务进程可以作为调度者,依靠网络通信,将...

  • 实现一个memcpy函数和strcpy函数

    memcpy函数 c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 函数原型:void* Memcpy(void* ...

  • 用C#实现MD5算法

    代码如下: using System; using System.Text; using System.Security.Cryptography; namespace Common { /// <summary> /// 一个实现MD5散列字符串的类 /// 作者:周公 /// 日期:2007 /// </summary> public seal...

  • 用TL494实现单回路控制器

    TL494是美国德州仪器公司生产的一种电压驱动型脉宽调制控制集成电路,主要应用在各种开关电源中。本文介绍它与相应的输入、输出电路等一起构成一个单回路控制器。 1 TL494管脚配置及其功能 TL494的内部电路由基...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
用VC++实现不规则窗口介绍:华为云为您免费提供用VC++实现不规则窗口在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多用VC++实现不规则窗口的相关内容。| 移动地址: 用VC++实现不规则窗口 | 写博客