#t#本人很喜欢VB.NET,在工作中也很喜欢总结关于VB.NET特殊形状窗体的经验教训,下面就这个问题来详细说说吧。我们的目的是实现VB.NET特殊形状窗体,VB6中实现(借助API函数)做一个古怪的窗口必须要用的也是此程序中最重要的一个函数就是SetWindowRgn它的功能就是对指定的窗口进行重画,把这个窗口你选择的部分留下其余的部分抹掉。
VB.NET特殊形状窗体参数:
◆hWnd:你所要重画的窗口的句柄,比如你想重画form1则应该让此参数为form1.hWnd
◆hRgn:你要保留的区域的句柄,这个句柄是关键,你需要通过别的渠道来获得在这里的区域是由Combinergn合成的新区域
◆bRedram:是否要马上重画,一般设为true
◆函数CombineRgn将两个区域组合为一个新区域
◆函数Createrectrgn为创建一个由点X1,Y1和X2,Y2描述的矩形区域
◆函数CreateEllipticRgn为创建一个X1,Y1和X2,Y2的椭圆区域用DeleteObject这个函数可删除GDI对象,比如画笔、刷子、字体、位图、区域以及调色板等等。对象使用的所有系统资源都会被释放。
以下是VB6的代码:
- PrivateDeclareFunction CreateEllipticRgn Lib "gdi32" (ByVal X1 AsLong,
ByVal Y1 AsLong, ByVal X2 AsLong, ByVal Y2 AsLong) AsLong- PrivateDeclareFunction CreateRectRgn Lib "gdi32" (ByVal X1 AsLong,
ByVal Y1 AsLong, ByVal X2 AsLong, ByVal Y2 AsLong) AsLong- PrivateDeclareFunction CombineRgn Lib "gdi32" (ByVal hDestRgn AsLong,
ByVal hSrcRgn1 AsLong, ByVal hSrcRgn2 AsLong, ByVal nCombineMode AsLong) AsLong- PrivateDeclareFunction SetWindowRgn Lib "user32" (ByVal hWnd AsLong,
ByVal hRgn AsLong, ByVal bRedraw AsBoolean) AsLong- PrivateDeclareFunction DeleteObject Lib "gdi32" (ByVal hObject AsLong) AsLong
- PrivateConst RGN_DIFF = 4
- PrivateSub Form_Load()
- Dim rgn AsLong
- Dim rgnRect AsLong
- Dim rgnDest AsLong
- rgn = CreateEllipticRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY)
- rgnRect = CreateRectRgn((Me.Width / Screen.TwipsPerPixelX - 20) / 2,
(Me.Height / Screen.TwipsPerPixelY - 20) / 2, (Me.Width / Screen.TwipsPerPixelX + 20) / 2,
(Me.Height / Screen.TwipsPerPixelY + 20) / 2)- rgnDest = CreateRectRgn(0, 0, 1, 1)
- CombineRgn rgnDest, rgn, rgnRect, RGN_DIFF
- SetWindowRgn Me.hWnd, rgnDest, True
- Call DeleteObject(rgnRect)
- Call DeleteObject(rgnDest)
- EndSub
- PrivateSub Command1_Click()
- End
- EndSub
在VB.NET中,我们可以使用.NET 框架类库System.Drawing.Drawing2D的GraphicsPath 类(应用程序使用路径来绘制形状的轮廓、填充形状内部和创建剪辑区域),来绘制图形,然后通过VB.NET特殊形状窗体的Me.Region来设置窗口的可见区域。
以下是VB.NET的代码:
- '声明一个布尔型变量,判断窗体是否正常区域
- Dim IsNormalRegion AsBoolean = True
- PrivateSub Button2_Click(ByVal sender As System.Object,
_ByVal e As System.EventArgs) Handles Button2.Click- If (IsNormalRegion) Then
- '构造一个GraphicsPath对象实例
- Dim Graphics AsNew System.Drawing.Drawing2D.GraphicsPath()
- Dim intHeight AsInteger = Me.Size.Height
- Dim intWidth AsInteger = Me.Size.Width
- '定义内矩形的左上角坐标
- Dim RectTop AsInteger = 100
- '在窗体上绘制一个大椭圆,左上角的坐标取为(0,0)
- Graphics.AddEllipse(0, 0, intWidth, intHeight)
- '再绘制一个小矩形
- Dim AddRect AsNew Rectangle(RectTop, RectTop,
intHeight - (RectTop * 2), intHeight - (RectTop * 2))- Graphics.AddRectangle(AddRect)
- '设置窗口的可见区域
- Me.Region = New Region(Graphics)
- Else
- Me.Region = Nothing
- EndIf
- IsNormalRegion = Not IsNormalRegion
- EndSub