API函数详解:奇形怪状的窗体函数

    普通的窗体都是方方的,使用API函数可以做出一些奇怪的形状。比如,窗体是圆角矩形,在中间挖一个椭圆形的洞。     先要理解一个重要的概念:区域。区域是描述设备场景中某一块的GDI对象,每个区域都有一个句柄。一个区域可以是矩形,也可以是复杂的多边形,甚至是几个区域组织在一起。窗体默认的区域就是我们看到的矩形,当然它并非一定要用这个默认的区域     现在开始,首先在窗体上做一个圆角矩形区域,这是窗体的大致轮廓。在圆角矩形里再确定一个椭圆形的区域,然后把这两个区域组织成一个区域,并设置窗体的区域为这个组织出来的区域。     CreateRoundRectRgn函数用于创建一个圆角矩形区域;CreateEllipticRgn用于创建一个椭圆区域;CombineRgn函数用于将两个区域组合为一个新区域;SetWindowRgn函数允许您改变窗口的区域。使用其他的函数还可以做出其他更奇怪的窗体。     源代码如下:    Option Explicit

    ' API函数声明

   Private Declare Function CreateRectRgnLib "gdi32" (ByVal X1As Long,ByVal Y1As Long,ByVal X2As Long,ByVal Y2As Long)As Long
   Private Declare Function CreateRoundRectRgnLib "gdi32" (ByVal X1As Long,ByVal Y1As Long,ByVal X2As Long,ByVal Y2As Long,ByVal X3As Long,ByVal Y3As Long)As Long
   Private Declare Function CreateEllipticRgnLib "gdi32" (ByVal X1As Long,ByVal Y1As Long,ByVal X2As Long,ByVal Y2As Long)As Long
   Private Declare Function CombineRgnLib "gdi32" (ByVal hDestRgnAs Long,ByVal hSrcRgn1As Long,ByVal hSrcRgn2As Long,ByVal nCombineModeAs Long)As Long
   Private Declare Function SetWindowRgnLib "user32" (ByVal hWndAs Long,ByVal hRgnAs Long,ByVal bRedrawAs Boolean)As Long
   Private Declare Function DeleteObjectLib "gdi32" (ByVal hObjectAs Long)As Long

    '常数声明

   Private Const RGN_DIFF = 4
    ' 目标区域被设置为两个区域不相交的部分

    '模块级变量声明

   Private OutRgnAs Long
    ' 外边的圆角矩形区域
   Private InRgnAs Long
    ' 里边的椭圆区域
   Private MyRgnAs Long
    ' 圆角区域剪切掉椭圆区域后的区域,也是窗体最终的形状

   Private Sub Form_Click()
       If OutRgn <> 0And InRgn <> 0And MyRgn <> 0Then Exit Sub
       Dim wAs Long, hAs Long
        w = ScaleX(Form1.Width, vbTwips, vbPixels)
        h = ScaleY(Form1.Height, vbTwips, vbPixels)
        MyRgn = CreateRectRgn(0, 0, 0, 0)
        OutRgn = CreateRoundRectRgn(30, 30, w - 30, h - 30, 100, 100)
        InRgn = CreateEllipticRgn(100, 100, w - 100, h - 100)
       Call CombineRgn(MyRgn, OutRgn, InRgn, RGN_DIFF)
       Call SetWindowRgn(Form1.hWnd, MyRgn,True)
        Form1.BackColor = QBColor(4)
    End Sub

   Private Sub Form_DblClick()
        Unload Form1
    End Sub

   Private Sub Form_Load()
        OutRgn = 0
        InRgn = 0
        MyRgn = 0
        Form1.Width = 7800
        Form1.Height = 6000
    End Sub

   Private Sub Form_Unload(CancelAs Integer)
       If MyRgn <> 0Then DeleteObject MyRgn
       If OutRgn <> 0Then DeleteObject OutRgn
       If InRgn <> 0Then DeleteObject InRgn
    End Sub     这个程序运行后,在窗体上单击,窗体就会变形,双击窗体程序结束。要注意的是,在卸载窗体时,用DeleteObject函数删除已定义的区域。

上页:API函数详解:XFORM函数 下页:API函数详解:AbortPath函数

Windows API函数大全

Windows API函数首页Windows API函数按字母排列
控件与消息函数硬件与系统函数
设备场景函数绘图函数
位图、图标和光栅运算函数菜单函数
文本和字体函数打印函数
文件处理函数进程和线程函数
Windows消息函数网络函数
版权所有 © 中山市飞娥软件工作室 证书:粤ICP备09170368号