你的位置:创意公社- ideaer >> >> 程序开发 >> 详细内容 在线投稿

VB创建不规则窗体经验总汇

排行榜 打印 发给朋友 举报 发布者:kg3133
热度425票  浏览128次 【共0条评论】【我要评论 时间:2010年9月09日 03:59
创意公社- ideaerXv u@-q*]Tc

很多人都很热衷于创建形状奇怪的窗体。而且不断的有热心的家伙们将他们的发现放到我们这里与大家分享。今天我将我所知道的方法总结一下。希望对大家有所帮助。
2GA*Uj/L$N1    一般来说,要创建一个不规则的窗体。我们需要使用一个Win32 API: SetwindowRgn。这个API您可以在Api浏览器中找到。这个Api的作用就是将窗体的“剪”成一个指定的形状。下面是这个Api声明于解释:创意公社- ideaer[ [ UU.v
    Declare Function SetWindowRgn Lib “user32″ (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long创意公社- ideaer e1X4Y$srI;W?a-z
    它有三个参数。
})u4uzq5bJp1    第一个(hWnd)是用来指定被剪切的对象的句柄,比如Picture图形框等, 我们一般就是用窗体的hWnd属性;创意公社- ideaer}yK-f4t2_s;w#^
    第二个(hRgb)指明剪切的形状, 即指定的几何图形特征, 此参数也必须由相应的API 函数提供说明。用那些APi可以创建一个您想要的区域(窗体的形状)。然后这些Api会返回一个数值。这个数值就是这个形状在Windows中的句柄(可以理解为身份证号码)。SetWindowsRgn可以通过这个数值来找到我们创建的那个区域;创意公社- ideaer/f%v-D Mv%t l
    第三个(bRedraw)是一个布尔变量, 一般可设置为真(True)。
D,G(\&EX1
b-N3@V'm"_K1    看来仅仅有SetWindowsRgn还不行。我们还必须创建一个区域。创建区域可以使用如下的一些Api:创意公社- ideaer8\%T;c2bT t7JJ;d
    CreateRectRgn :  建立矩形区域,其参数分别为矩形的左上角坐标及右下角坐标。但是由于窗体默认就是一个矩形,所我们应该用不到它;创意公社- ideaer1B$lp!ff3f\!T:J#[?

!z[1L-gR.w,M6XQ4G5g1创意公社- ideaer`mX8O+o5sL#{:Z
    CreateRoundRectRgn:建立圆角矩形区域,其参数分别为左上角及右下角坐标, 还有圆角直径等, 当圆角直径接近或超过矩形的长度时, 将呈现为圆或椭圆形;创意公社- ideaerf;uq ^-z)s
创意公社- ideaerI%L P`;c1`ZP
创意公社- ideaery:N/]~c!}(g.x(]
    CreateEllipticRgn :建立椭圆矩形区域,参数分别椭圆的约束矩形左上角与左下角顶点的坐标;;创意公社- ideaerb]1I+d`A&g
创意公社- ideaer C[/r8ib
创意公社- ideaer;wYj*\yco
    所以现在我们就可以创建一下形状比较简单的窗体了。比如下面的代码我们就创建了一个椭圆形的窗体:
Z(tH,H0@/C?d#s1
-^o-ip/w@.M0Q1    Option Explicit
9`#T;[(|$I;gW&T,H1    ’Win32 Api 的声名创意公社- ideaer+SNDF*aKTFim
    Private Declare Function CreateEllipticRgn Lib “gdi32″ Alias “CreateEllipticRgn” (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long创意公社- ideaer Kv?s5wT.BR(}U5`
    Private Declare Function SetWindowRgn Lib “user32″ (ByVal hwnd As Long,ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
jv'DP w GU1创意公社- ideaer(P!}ec:jj?U
    Private Sub Form_Load()
Z5h NN-c5W8eX;u\1Dim Result As Long ‘声明变量用于保存“区域”的句柄
Ip _.OP o!L1Me.Show创意公社- ideaers0U_/zG0L2|:FK
Result = CreateEllipticRgn(0, 0, 300, 200) ‘创建“区域”并将其句柄保存到变量中创意公社- ideaer9t{7g7m"u)z%T
SetWindowRgn Me.Hwnd, Result, True ‘根据前面创建的区域对窗体进行“剪裁”
4j)V n i~eb1    End Sub 创意公社- ideaertHiH%P$@:s+P*]

)~/U8O-Y,srd1    但是你要说,我想创建的窗体是一个人的形状或者是其他的不规则的形状呀!是的,上面的方法只能创建一些简单的几何图形。创建比较复杂形状的窗体我们仍然需要使用SetWindowRgb这个Api来对窗体进行“剪裁”。但是我们需要用其它的Api来创建复杂的“区域”。一般的,我们会用到下面的Api。这些Api配合使用就会得到复杂形状的区域。从而我们可以使用SetWindowRgb裁出窗体。
&z;Gu4cX | Cn1
LML"O O1    CreatePolygonRgn : 用于通过连接各个点来创建一个区域创意公社- ideaervFHq.H.G
创意公社- ideaer8?1`!woS3K0Ag
    CombineRgn:        用于对两个区域进行运算。比如合并两个区域或这是将两个区域相减、求交集等等。
W:? ?Jl1
L:i q6J(} Y1    下面我们来详细的介绍一下这两个Api:创意公社- ideaer:Ck-M1|](~,s?a0g
    CreatePolygonRgb创意公社- ideaer[E!xQJ(Rg^c
创意公社- ideaer+y;uFY6?^/I
    Declare Function CreatePolygonRgn Lib “gdi32″ Alias “CreatePolygonRgn” (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
l%ny X/X&uK%g1创意公社- ideaer x1| d7p1hd
   参数一(lpPoint): POINTAPI类型的变量。POINTAPI是一个用于描述点坐标的结构。他有两个成员x与y。您可以在Api浏览器中找到它。在这里我们需要一个数组,并将这个属组的第一个元素作为这里的参数。创意公社- ideaer9j'hSf(o
   参数二(nCount):  区域顶点的个数。比如一个三角形的区域有三个顶点。我们应该根据这个参数来确定上一个参数使用的数组的大小;
n \'Sodr1   参数三(nPolyFillMode): 指定区域的填充模式。我们可以使用两个常量作为参数:AlterNATE和WINDING。这两个常量可以在Api浏览器中找到。我们在这里可以直接使用1.创意公社- ideaer`0k+Z3W_!S
创意公社- ideaer5~pQ7^r ^\.xP%^
   CombineRgb
M1A~G5?(no1   Declare Function CombineRgn Lib “gdi32″ Alias “CombineRgn” (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long创意公社- ideaer;j [ y k0`m
创意公社- ideaer(@0X3j(x!i`
   参数一(hDestRgn): 目标区域的句柄;创意公社- ideaerZqJ,c^j#R#g
   参数二(hSrcRgn1): 源区域一的句柄;
u }/zr$zML@(e1   参数三(hScrRgn2): 源区域二的句柄。创意公社- ideaer-vIruO6J{Y
   参数四(nCombineMode): 合并模式。我们可以在Api浏览器中到这些常量作为它的参数:
.y0_"_~+ZLm9@1          RGN_AND创意公社- ideaer!q2f~6U^-T2bW c
           Creates the intersection of the two combined regions.
1|7zU,p^x&De1          RGN_COPY创意公社- ideaer V7rD5j3S*ad!s:U
           Creates a copy of the region identified by hrgnSrc1.创意公社- ideaer&y D3Q)Hw4f+J kP0b
          RGN_DIFF
R9?,@y)f_"kz1           Combines the parts of hrgnSrc1 that are not part of hrgnSrc2.创意公社- ideaerv A$R9L*]%yI1EH
          RGN_OR
cZ/vvu${N)\*P1           Creates the union of two combined regions.
#B%j uJ)O9n1uQ1          RGN_XOR创意公社- ideaer3zo*eF"Xf
           Creates the union of two combined regions except for any overlapping areas.创意公社- ideaerO j F%`!M
    
'~Q]^$g%Y7s1    好了,下面我们来创建一个沙漏形的区域。创意公社- ideaer-v0SC#I2Z}2m
创意公社- ideaer xSO;G4k r2@
     Option Explicit创意公社- ideaer8}c/f6X W0D3?{F2E
    ’Win32 API的声明创意公社- ideaer Z"}`LK2CMg4h
    Private Declare Function CreatePolygonRgn Lib “gdi32″ (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
y;f {-_` cRt1    Private Declare Function CreateEllipticRgn Lib “gdi32″ (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long创意公社- ideaer*Z+l5Nr2Mjp
    Private Declare Function SetWindowRgn Lib “user32″ (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long创意公社- ideaer;aYA6xKq,D`
    Private Type POINTAPI创意公社- ideaerdO8{&~-S.AV*f-t
        x As Long创意公社- ideaer`#sT#lMG
        y As Long创意公社- ideaer`u$^2HO(H
     End Type创意公社- ideaerX1wF~;}Hi `
创意公社- ideaer+i!U2w g'uq L zL
    Private Sub Form_Load()创意公社- ideaerb4iw!W;O
    ’声明变量
s d,IC4{t1    Dim Result As Long创意公社- ideaerU8|-Uiu8RP:e
    Dim Points(5) As POINTAPI创意公社- ideaer7m Zd#L9zGF Sl

t\^v|/NR!_dR1    ’更改窗体大小
*FMf|1m^1S1    With Me
^ Ac{VXNs1        .Width = 5000创意公社- ideaer*f+z^8`,T K} Y-i$LA
        .Height = 10000创意公社- ideaer0oa%GO/yY
    End With创意公社- ideaero/@ M)H8~
创意公社- ideaeru3i1b \ R k
    ’将区域的顶点坐标存入变量
#Y"qR!~GnC J1    Points(0).x = 0创意公社- ideaerwY}$c]$g
    Points(0).y = 0
#r#R.Momh7D1    Points(1).x = 300创意公社- ideaerP*W6k2DhDd l
    Points(1).y = 0
~$o%~-[-L5{ q\+F1    Points(2).x = 175创意公社- ideaer4ws_J#Xg z
    Points(2).y = 300
d[]M-\Z1    Points(3).x = 300
w oK{0d%a!N%o6|#U1    Points(3).y = 600创意公社- ideaer5InU+v(i(Q0HoZ%q?
    Points(4).x = 0
-W*P6H&n5^S8M)k)~1    Points(4).y = 600
2au(kI+?1    Points(5).x = 125创意公社- ideaerqD&yQaqS[-E%G/e
    Points(5).y = 300
O6F A\6O9X1创意公社- ideaer?z^G9|@+Wa*P
    ’创建区域
9ar8~#vzzw6n0Ei1    Result = CreatePolygonRgn(Points(0), 6, 1)创意公社- ideaer,M.nJ-k$o7h"uq O:]

;d$}akdH;V/zJ1    ’“裁剪”窗体创意公社- ideaerX8N2X~ K4m!WW
    SetWindowRgn Me.hwnd, Result, True创意公社- ideaerG'@`;D fx|'H-e

5D!qe [?Vh.s)C:CcD']1创意公社- ideaer)y H.n(Y]"K:{"Qd,C
    End Sub创意公社- ideaerhA8{ro0W ? B
创意公社- ideaer-Rj%Rv7am2a
    另外,我们还应该注意一个Win32 Api:DeleteObject。 我们用Api创建了一个区域。虽然不可见,但是它却是一个对象。如果我们不将其删除,它就会存在于系统中消耗系统资源,所以我们不用的时候就应该将它删除掉。这个Api只有一个参数就是指定要删除对象的句柄。创意公社- ideaer}S)d5Z#El:m

顶:15 踩:26
对本文中的事件或人物打分:
当前平均分:-0.12 (121次打分)
对本篇资讯内容的质量打分:
当前平均分:-0.2 (114次打分)
【已经有149人表态】
29票
感动
18票
路过
18票
高兴
16票
难过
12票
搞笑
16票
愤怒
21票
无聊
19票
同情
上一篇 下一篇
发表评论
换一张

网友评论仅供网友表达个人看法,并不表明本网同意其观点或证实其描述。

查看全部回复【已有0位网友发表了看法】