用Win32 API创建不规则窗口

转载 2007年10月09日 18:19:00
 

<SCRIPT type=text/javascript> <!-- google_ad_client = "pub-9346728666813782"; google_alternate_color = "FFFFFF"; google_ad_width = 468; google_ad_height = 60; google_ad_format = "468x60_as"; google_ad_type = "text_image"; google_ad_channel ="1236939428"; google_color_border = "FFFFFF"; google_color_bg = "FFFFFF"; google_color_link = "FF3300"; google_color_url = "339966"; google_color_text = "999999"; //--> </SCRIPT>Win32 API支持创建不规则窗口,现在很多软件使用这个技术,如:QuickTime,Windows Media Player 7等。

A
B
使用API创建不规则窗口主要有两种方式,即矢量形状叠加(布尔运算)和位图区域两种。无论哪种方式,都可以实现上面两图的效果。在编写这样的窗口代码前,我们必须清楚要创建的窗口的形状是否复杂,如图片B的窗口很复杂,为极不规则的窗口,很难使用矢量形状叠加的方式创建,那么可以使用区域,指定位图的透明色实现;而图片A是圆角矩形,使用简单的矢量形状叠加即可。之所以这样,是为了运行效率考虑,对于普通的不规则窗口,矢量叠加方式速度比较快。当然,位图区域方式可以创建任何形状的窗口,如果你不需要考虑运行效率(实际两种方式速度差异很小),那么不必考虑矢量形状叠加的办法,直接看位图区域的例子即可。
 
 
A.矢量叠加方式创建不规则窗口
例1:简单的窗口区域设定,使用圆角矩形
1、HRGN hRGN=CreateRoundRectRgn(0,0,200,200,20,20);//创建圆角矩形区域
2、SetWindowRgn(hRGN,TRUE);//将创建的区域设定为窗口区域
例2:多个区域叠加(布尔运算)
1、HRGN hRGN1=CreateRoundRectRgn(0,0,200,200,20,20);//创建圆角矩形区域
2、HRGN hRGN2=CreateRectRgn(10,10,20,20);//创建矩形区域
3、HRGN hRGN; CombineRgn(hRGN,hRGN1,hRGN2,RGN_DIFF);
   //使用区域1减区域2,生成新区域hRGN(可选的参数有加,减,交等,详见MSDN)
4、SetWindowRgn(hRGN,TRUE);//将创建的区域设定为窗口区域
1、HBITMAP hBmp=(HBITMAP)LoadImage(应用程序句柄, 位图文件名, IMAGE_BITMAP, 宽度, 高度, LR_LOADFROMFILE);
   //载入一个位图,该位图中的某个特定颜色将被作为透明区域处理
2、HRGN hRGN=BitmapToRegion(hBmp,RGB(255,0,0),0);//调用位图转换为区域的函数,透明色为红色,第三个参数为公差,为0即只将红色设定为透明色。如果公差为1,意味着与给定透明色的红绿蓝三色数值的差距在1范围内的颜色也将被作为透明色处理。
3、SetWindowRgn(hRGN,TRUE);//将创建的区域设定为窗口区域
说明:关于BitmapToRegion函数,它的功能就是将位图转换为区域,原理来自API: ExtCreateRegion,该函数使用RGNDATA结构中的数据创建RGN,本函数就是分析位图的各个像素点数,根据它们填充RGNDATA结构,然后创建RGN的。
由于不规则窗口专题比较简单,没有提供完整的范例,B方法的关键是BitmapToRegion函数,所以只提供了该函数的代码。如果还有不清楚的地方或者想要完整的范例, 

不规则窗口和控件的封装(win32 API)——TinyDlg

不规则窗口和控件的封装尝试(win32 API)——TinyDlg
  • woshichenjiacheng
  • woshichenjiacheng
  • 2017-10-08 09:26:03
  • 157

Windows SDK实现不规则窗体

1.原理 所有的 Windows 窗体都位于一个称为“region”中,窗体的大小如果超出“region”的范围,windows 会自动裁剪超出"region"范围那部分的窗体,使其不可见。所以,要创...
  • celte
  • celte
  • 2013-08-29 22:34:52
  • 1655

Win32下创建异形窗口

异型窗口 先来说说什么是异形窗口,
  • u011645174
  • u011645174
  • 2014-04-15 18:27:51
  • 1367

win32 api 实现不规则形状按钮

最近在看环境下32位汇编语言程序设计>>这本书。与其说在看汇编,更像是在看windows sdk.这本书基本上就是程序设计>>的汇编版。但是我觉得这本书比程序设计>>看起来更舒服,也许是那本书是翻译过...
  • korekara88730
  • korekara88730
  • 2011-10-12 09:37:53
  • 4563

win32绘图函数

二、创建GDI绘图对象      今天我们要讨论的是Win32 API中最有有趣的部分───用绘图函数完成图形输出。可以说,所有前面讲的内容都是本课程的前期准备。当时,我们在一些试例程序中偶尔用...
  • BlackWhale_Slogan
  • BlackWhale_Slogan
  • 2017-05-07 01:17:41
  • 400

GDI+实现不规则窗体

先来看一下实现的效果,下图中那个娃娃就是我们要实现的不规则窗体啦~  1. GDI+配置及初始化(VS2013) VS2013上已经有了GDI+支持,不用单独下载安装包了。...
  • u011500419
  • u011500419
  • 2017-05-24 15:17:23
  • 396

在windows上创建完美的不规则窗口

在windows上创建完美的不规则窗口不规则窗口方法简介windows上的窗口绝大多数是方形的,但是偶尔也会有一些其他形状的窗口,如圆形甚至不规则形状。这些不常见的窗口是如何做出来的呢? 有两种方法...
  • bjrxyz
  • bjrxyz
  • 2017-02-04 19:01:03
  • 956

C++API创建Win32窗口

#include "stdafx.h" #include #include //窗口过程函数 LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPA...
  • Syee001
  • Syee001
  • 2017-08-02 19:37:16
  • 519

win32绘制文字 矩形 圆形 多边形 位图

此程序中包涵了一般画法和离屏绘制,相信很快就能看懂。程序中所用到的是369 * 300 名为end.bmp的位图 一般画法会闪烁,而离屏绘制不会,这就是离屏绘制的好处。 #include #incl...
  • fofu33
  • fofu33
  • 2013-09-03 14:34:07
  • 7928

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

制作不规则窗体,本例采用图片背景形式,这也是通常的思路。以前也做过类似的案例,但都不深入,这次项目中需要用到,顺便理了下思路,找到另一种比较简单的方法,下面介绍下三种解决方案。   第一种:也是...
  • dongzhe8
  • dongzhe8
  • 2015-12-21 17:52:40
  • 1153
收藏助手
不良信息举报
您举报文章:用Win32 API创建不规则窗口
举报原因:
原因补充:

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