加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

VB 圆角窗体、按钮、picturebox

(2011-12-09 08:24:23)
标签:

it

分类: VB编程笔记

普通的窗体都是方形的,使用API函数可以打破传统,做出各种奇怪形状的窗体,这里只研究圆角窗体。先来理解一个重要的概念区域。区域是描述设备场景中某一块的GDI对象,每个区域都有一个句柄。一个区域可以是矩形,也可以是复杂的多边形,甚至是几个区域组织

普通的窗体都是方形的,使用API函数可以打破传统,做出各种奇怪形状的窗体,这里只研究圆角窗体。

    先来理解一个重要的概念→“区域”。区域是描述设备场景中某一块的GDI对象,每个区域都有一个句柄。一个区域可以是矩形,也可以是复杂的多边形,甚至是几个区域组织在一起。窗体默认的区域就是我们看到的矩形,当然它并非一定要用这个默认的区域。

    现在开始,新建VB工程,把默认窗体"Form1"的"BorderStyle"属性设置为[0 - None]。

   

源代码如下:

Option Explicit

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 CreateRoundRectRgn Lib "gdi32" (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 Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, _

    ByVal hSrcRgn1 As Long, _

    ByVal hSrcRgn2 As Long, _

    ByVal nCombineMode As Long) As Long

Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, _

    ByVal hRgn As Long, _

    ByVal bRedraw As Boolean) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

Private Const RGN_AND = 1

Private MyRgn1 As Long

Private MyRgn2 As Long

Private MyRgn As Long   '保存圆角区域,也是窗体最终的形状

Private Sub Form_Click()

    Unload Me

End Sub

Private Sub Form_Load()

    Dim w As Long, h As Long

    w = ScaleX(Me.Width, vbTwips, vbPixels)

    h = ScaleY(Me.Height, vbTwips, vbPixels)

'----{下面为十五种圆角窗体代码,任选一种即可实现相应的效果}----

'01.左上圆其余直

  MyRgn = CreateRoundRectRgn(30, 30, w + 30, h + 30, 16, 16)

'02.左下圆其余直

  MyRgn = CreateRoundRectRgn(30, -30, w + 30, h - 30, 16, 16)

'03.右上圆其余直

  MyRgn = CreateRoundRectRgn(-30, 30, w - 30, h + 30, 16, 16)

'04.右下圆其余直

  MyRgn = CreateRoundRectRgn(-30, -30, w - 30, h - 30, 16, 16)

'05.上圆下直

  MyRgn = CreateRoundRectRgn(30, 30, w - 30, h + 30, 16, 16)

'06.上直下圆

  MyRgn = CreateRoundRectRgn(30, -30, w - 30, h - 30, 16, 16)

'07.左圆右直

  MyRgn = CreateRoundRectRgn(30, 30, w + 30, h - 30, 16, 16)

'08.左直右圆

  MyRgn = CreateRoundRectRgn(-30, 30, w - 30, h - 30, 16, 16)

'09.左上右下圆左下右上直

  MyRgn = CreateRectRgn(0, 0, 0, 0)

  MyRgn1 = CreateRoundRectRgn(30, 30, w + 30, h + 30, 16, 16)

  MyRgn2 = CreateRoundRectRgn(-30, -30, w - 30, h - 30, 16, 16)

  Call CombineRgn(MyRgn, MyRgn1, MyRgn2, RGN_AND)

'10.左下右上圆左上右下直

  MyRgn = CreateRectRgn(0, 0, 0, 0)

  MyRgn1 = CreateRoundRectRgn(-30, 30, w - 30, h + 30, 16, 16)

  MyRgn2 = CreateRoundRectRgn(30, -30, w + 30, h - 30, 16, 16)

  Call CombineRgn(MyRgn, MyRgn1, MyRgn2, RGN_AND)

'11.左上直其余圆

  MyRgn = CreateRectRgn(0, 0, 0, 0)

  MyRgn1 = CreateRoundRectRgn(30, -30, w - 30, h - 30, 16, 16)

  MyRgn2 = CreateRoundRectRgn(-30, 30, w - 30, h + 30, 16, 16)

  Call CombineRgn(MyRgn, MyRgn1, MyRgn2, RGN_AND)

'12.左下直其余圆

  MyRgn = CreateRectRgn(0, 0, 0, 0)

  MyRgn1 = CreateRoundRectRgn(30, 30, w - 30, h + 30, 16, 16)

  MyRgn2 = CreateRoundRectRgn(-30, -30, w - 30, h - 30, 16, 16)

  Call CombineRgn(MyRgn, MyRgn1, MyRgn2, RGN_AND)

'13.右上直其余圆

  MyRgn = CreateRectRgn(0, 0, 0, 0)

  MyRgn1 = CreateRoundRectRgn(30, -30, w - 30, h - 30, 16, 16)

  MyRgn2 = CreateRoundRectRgn(30, 30, w + 30, h + 30, 16, 16)

  Call CombineRgn(MyRgn, MyRgn1, MyRgn2, RGN_AND)

'14.右下直其余圆

  MyRgn = CreateRectRgn(0, 0, 0, 0)

  MyRgn1 = CreateRoundRectRgn(30, 30, w - 30, h + 30, 16, 16)

  MyRgn2 = CreateRoundRectRgn(30, -30, w + 30, h - 30, 16, 16)

  Call CombineRgn(MyRgn, MyRgn1, MyRgn2, RGN_AND)

'15.四角都为圆角

  MyRgn = CreateRoundRectRgn(30, 30, w - 30, h - 30, 16, 16)

'--------------------------------------------------------------------------------------

    Call SetWindowRgn(Me.hWnd, MyRgn, True) '改变窗口的区域为"MyRgn"

    Me.BackColor = QBColor(5)

End Sub

Private Sub Form_Unload(Cancel As Integer)

    '删除非空区域

    If MyRgn <> 0 Then DeleteObject MyRgn

    If MyRgn1 <> 0 Then DeleteObject MyRgn1

    If MyRgn2 <> 0 Then DeleteObject MyRgn2

End Sub

 

以上为引用原文:http://www.pczpg.com/html/bianchengkaifa/VB/20091128/24014.html

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有