什么是不规则窗口?

我们常见桌面应用程序窗口都是方形的,但是有时我们也能见到非方形的(圆角、椭圆等),这种窗口称之为不规则窗口,但是在我的电脑中没有找出这类的窗口,没办法展示了,(下面我们会手动创建),这种窗口一般用来做启动页,比如那些XXX管理系统等等,通常在这个界面进行一些初始化,之后跳转到主界面。

除了椭圆的启动页窗口,还有圆角矩形的主界面,也是比较好看的,Windows为我们提供的API能轻松完成这类窗口的创建,其中SetWindowRgn函数为主要函数。(但这不是绝对的实现方法,我不知道目前主流的实现方法是什么)。

另外这是以前实现的一个小软件,用来收录不常用,但又不想摆在桌面的软件,这个窗口就是个圆角矩形的窗口,另外通过SetLayeredWindowAttributes实现半透明的效果。你可知Windows不规则窗口如何实现?_java

所需函数介绍

SetWindowRgn

用来设置窗口的窗口区域,窗口区域确定系统允许绘图的窗口区域。系统不会显示位于窗口区域之外的窗口的任何部分。他有三个参数,第一个为窗口句柄,第二个为我们创建的显示"区域",第三个指定在设置窗口区域后系统是否重画窗口,如果bRedraw为TRUE,则系统将重绘。

int SetWindowRgn(
  HWND hWnd,
  HRGN hRgn,
  BOOL bRedraw
)
;

这个函数可以这样理解,现在有这样一个窗口(下图中的绿色),我们创建了一个椭圆的"区域",通过SetWindowRgn函数就可以隐藏绿色的部分,Windows将只显示蓝色窗口的部分。那怎么创建这个"区域"?你可知Windows不规则窗口如何实现?_java_02

CreateEllipticRgn

这个函数就是上述中用来创建椭圆区域的函数,他的返回值放入到SetWindowRgn的第二个参数中即可。

HRGN CreateEllipticRgn(
  int x1,
  int y1,
  int x2,
  int y2
)
;

参数如下:

x1
在椭圆的边界矩形的左上角以逻辑单位指定x坐标。

y1
在椭圆的边界矩形的左上角以逻辑单位指定y坐标。

x2
指定椭圆边界矩形右下角的逻辑单位的x坐标。

y2
指定椭圆边界矩形右下角的y坐标。

示例

好了,通过以上两个函数就可以完成一个椭圆窗口的创建。

Private Declare Function SetWindowRgn Lib "user32.dll" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

Private Sub Form_Load()
Dim hRgn As Long


hRgn = CreateEllipticRgn(10, 10, Me.ScaleWidth / 15, Me.ScaleHeight / 15)
SetWindowRgn Me.hWnd, hRgn, True

End Sub

你可知Windows不规则窗口如何实现?_java_03另外还可以通过CreateRoundRectRgn创建一个圆角矩形。

HRGN CreateRoundRectRgn(
  int x1,
  int y1,
  int x2,
  int y2,
  int w,
  int h
)
;
x1
指定以设备为单位的区域左上角的x坐标。

y1
以设备单位指定区域左上角的y坐标。

x2
指定以设备为单位的区域右下角的x坐标。

y2
以设备单位指定区域右下角的y坐标。

w
指定用于在设备单位中创建圆角的椭圆的宽度。

h
指定用于在设备单位中创建圆角的椭圆的高度。

最后两个参数其实也就是圆角的大小,一般这两个参数值一样。

Private Declare Function SetWindowRgn Lib "user32.dll" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateRoundRectRgn Lib "gdi32.dll" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long

Private Sub Form_Load()
Dim hRgn As Long

hRgn 
= CreateRoundRectRgn(00, Me.ScaleWidth / 15, Me.ScaleHeight / 152020)
SetWindowRgn Me.hWnd, hRgn, True

End Sub

你可知Windows不规则窗口如何实现?_java_04