当前位置:编程学习 > VB >>

急啊 !VB 不规则窗体,只做对角的, 高手进来看怎么做 (圆角矩形窗体问题)

规则窗体,只做对角的, 高手进来看怎么做 (圆角矩形窗体问题)
见图片: --------------------编程问答-------------------- 就要做这个效果:
--------------------编程问答-------------------- '设置不规则窗体的API
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Const RGN_OR = 2

'该函数用来做圆角窗体
Public Sub RMe()
Dim Regn As Long '定义设置区域的句柄
Dim CER As Long '定义临时句柄变量
'把Twip计量单位转换成象素
X1 = Me.Width / 15
Y1 = Me.Height / 15
'画矩形
Regn = CreateRectRgn(0, 23, X1 - 23, Y1) '把句柄设为第一个矩形区域
CER = CreateRectRgn(23, 0, X1, Y1 - 23)  '创建第二个矩形区域
CombineRgn Regn, Regn, CER, RGN_OR '把临时句柄变量或运算到句柄变量中
'画两个圆
CER = CreateEllipticRgn(0, 0, 46, 46)
CombineRgn Regn, Regn, CER, RGN_OR
CER = CreateEllipticRgn(X1 - 46, Y1 - 46, X1, Y1)
CombineRgn Regn, Regn, CER, RGN_OR
Call SetWindowRgn(Me.hwnd, Regn, True) '创建窗体
End Sub

Private Sub Form_Resize()
RMe
End Sub

Private Sub Form_DblClick()
End
End Sub --------------------编程问答-------------------- '设置不规则窗体的API
Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
Const RGN_OR = 2

'该函数用来做圆角窗体
Public Sub RMe()
Dim Regn As Long '定义设置区域的句柄
Dim CER As Long '定义临时句柄变量
'把Twip计量单位转换成象素
X1 = Me.Width / 15
Y1 = Me.Height / 15
'画矩形
Regn = CreateRectRgn(0, 23, X1 - 23, Y1) '把句柄设为第一个矩形区域
CER = CreateRectRgn(23, 0, X1, Y1 - 23)  '创建第二个矩形区域
CombineRgn Regn, Regn, CER, RGN_OR '把临时句柄变量或运算到句柄变量中



'由于左上圆角较小,这里要用矩形补足
CER = CreateRectRgn(9, 0, 23, 23)
CombineRgn Regn, Regn, CER, RGN_OR
CER = CreateRectRgn(0, 9, 23, 23)
CombineRgn Regn, Regn, CER, RGN_OR


'由于右下圆角较小,这里要用矩形补足
CER = CreateRectRgn(23, 52, X1, Y1 - 6)
CombineRgn Regn, Regn, CER, RGN_OR
CER = CreateRectRgn(52, 52, X1 - 6, Y1)
CombineRgn Regn, Regn, CER, RGN_OR


'画左上右下两个圆
CER = CreateEllipticRgn(0, 0, 18, 18)
CombineRgn Regn, Regn, CER, RGN_OR
'CER = CreateEllipticRgn(X1 - 50, 0, X1 + 1, 52)
'CombineRgn Regn, Regn, CER, RGN_OR
'CER = CreateEllipticRgn(0, Y1 - 52, 52, Y1)
'CombineRgn Regn, Regn, CER, RGN_OR
CER = CreateEllipticRgn(X1 - 9, Y1 - 9, X1, Y1)
CombineRgn Regn, Regn, CER, RGN_OR
Call SetWindowRgn(Me.hwnd, Regn, True) '创建窗体

End Sub

Private Sub Form_Resize()
RMe
End Sub

Private Sub Form_DblClick()
End
End Sub

这个过渡效果比较好  --------------------编程问答-------------------- 将borderstyle设为1 --------------------编程问答-------------------- 晕,是将将borderstyle设为0,然后运用eslbs
的代码可以实现,边框部分可以用pictruebox实现 --------------------编程问答-------------------- 请能解释,如何调整圆角大小不!
谢谢eslbs --------------------编程问答-------------------- 最简单的是用透明窗体+预先加工好的皮肤 --------------------编程问答-------------------- 最简单的是用透明窗体+预先加工好的皮肤 --------------------编程问答-------------------- 没办法传图片
我说一下好了
2楼的方法把 窗体分了四个部分
2个不完全重叠的矩形,露出左上角和右下角
加2个圆形盖在这2个角上 
所以调整2个矩形的长宽和圆形的直径就可以调整圆角大小

3楼的方法更细致
窗体先分了四个部分
2个不完全重叠的矩形,露出左上角和右下角
加2个圆形放在这2个角里 
多余的缝隙用多几个矩形盖住
这种方法,圆形更小 圆弧比较平滑 
要调整圆角大小 
就调整圆形直径,如果有缝隙,拉长矩形盖住 --------------------编程问答-------------------- 分成4块吧 --------------------编程问答--------------------
Private Sub RoundForm()
    Dim Regn As Long '定义设置区域的句柄
    Dim CER As Long '定义临时句柄变量
    Dim x1 As Long, y1 As Long
    x1 = Width / Screen.TwipsPerPixelX
    y1 = Height / Screen.TwipsPerPixelY
    '画矩形
    Regn = CreateRectRgn(20, 0, x1, y1 - 20)  '把句柄设为第一个矩形区域
    CER = CreateRectRgn(0, 20, x1 - 20, y1)  '创建第二个矩形区域
    CombineRgn Regn, Regn, CER, RGN_OR '把临时句柄变量或运算到句柄变量中
    '画圆
    CER = CreateEllipticRgn(0, 0, 40, 40)
    CombineRgn Regn, Regn, CER, RGN_OR
    CER = CreateEllipticRgn(x1 - 40, y1 - 40, x1 + 1, y1 + 1) '把右下角的圆拉大点就行了
    CombineRgn Regn, Regn, CER, RGN_OR
    Call SetWindowRgn(hWnd, Regn, True) '创建窗体
End Sub
补充:VB ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,