问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

如何自定义VB的按钮形状、窗口形状

发布网友 发布时间:2022-04-29 01:32

我来回答

1个回答

热心网友 时间:2022-06-27 16:24

使用SetWindowRgn函数可以设置窗体形状,定义如下:
Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
hWnd既可以是窗体的句柄,又可以是按钮的句柄
hRgn是要用下述几个函数设置的
bRedraw设置为True就行了

在设置之前首先要设置区域句柄(0为整个窗体):
CreateRectRgn、CreateEllipticRgn、CreatePolygonRgn等可以创建各种形状
然后用CombineRgn函数合并形状

例如(真对不起,我遇到麻烦了):
Option Explicit

Private Type POINTAPI
x As Long
y As Long
End Type
Dim XY() As POINTAPI

'创建一个由一系列点围成的区域。windows在需要时自动将最后点与第一点相连以封闭多边形
Private Declare Function CreatePolygonRgn Lib "gdi32" (lpPoint As POINTAPI, ByVal nCount As Long, ByVal nPolyFillMode As Long) As Long
'创建一个由点X1,Y1和X2,Y2描述的矩形区域
Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
'创建一个椭圆,该椭圆与X1,Y1和X2,Y2坐标点确定的矩形内切
Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long

'API函数中的一个。本函数允许您改变窗口的区域。 _
通常所有窗口都是矩形的——窗口一旦存在就含有一个矩形区域。本函数允许您放弃该区域。这意味着您可以创建圆的、星形的窗口,也可以将它分为两个或许多部分——实际上可以是任何形状。为区域指定的所有坐标都以窗口坐标(不是客户坐标)表示,它们以整个窗口(包括标题栏和边框)的左上角为起点
Private Declare Function SetWindowRgn Lib "user32" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) 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
'nCombineMode 的可能值
Private Const RGN_AND As Long = 1
Private Const RGN_COPY As Long = 5
Private Const RGN_DIFF As Long = 4
Private Const RGN_OR As Long = 2
Private Const RGN_XOR As Long = 3

Private Sub Form_Load()
Dim hRgn As Long, h1 As Long, h2 As Long
Dim lRes As Long
ReDim XY(7) As POINTAPI 'T shape has 8 points
Me.ScaleMode = vbPixels
With Me
XY(0).x = 0
XY(0).y = 0
XY(1).x = .ScaleWidth
XY(1).y = 0
XY(2).x = .ScaleWidth
XY(2).y = .ScaleHeight / 2
XY(3).x = .ScaleWidth - (.ScaleWidth / 3)
XY(3).y = .ScaleHeight / 2
XY(4).x = .ScaleWidth - (.ScaleWidth / 3)
XY(4).y = .ScaleHeight
XY(5).x = .ScaleWidth / 3
XY(5).y = .ScaleHeight
XY(6).x = .ScaleWidth / 3
XY(6).y = .ScaleHeight / 2
XY(7).x = 0
XY(7).y = .ScaleHeight / 2
End With

h1 = CreatePolygonRgn(XY(0), 8, 2)
h2 = CreateRectRgn(XY(5).x, 0, XY(3).x, 50)

' 这个语句我调试半天不知为什么不成功
' 这个要靠你自己研究了……
'Call CombineRgn(hRgn, h1, h2, RGN_OR)

lRes = SetWindowRgn(Me.hWnd, h1, True)
End Sub

Private Sub Form_Click()
Unload Me
End Sub
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 莱莎2怎么刷两个加特性 莱莎的炼金工房道具特性无法使用 VB中.怎么设置按钮的自定义形状哦 下面这张莱莎的炼金工房的图出自哪里 放风筝的三年级下册语文作文200字? 哪位大神有《莱莎的炼金工房:常暗女王与秘密藏身处》简体中文steam正版分流游戏百度云资源 三年级下册第三单元的作文怎么写是放风筝? 女神异闻录5和莱莎的炼金工房那个好玩? 放风筝怎么写作文三年级 莱莎的炼金工房是黄油吗? Excel 电子表格文件怎么解压? 徐明星怎么看区块链技术应用? 新手如何快速玩转区块链和数字货币? 这里有区块链交易员吗?去面试了一家私募基金,本来以为事做二级市场,结果叫我去做数字货币交易员,有没 现在区块链很火,说区块链是2018到2020的一个趋势,你们怎么看? 百度这个区块链怎么看 区块链是什么?怎么能简单易懂的理解呢? 想快速了解区块链,应该怎么办? 新人怎么玩区块链?来个大佬教教我啊 vivoy27有没有隐藏电量?怎么开启? 如何自定义按钮SimpleButton得用法,Shape形状类 为什么总是有人问八神关于陆雪琪的问题 求助莱莎的炼金工房哪里能刷暗元素核心? 自定义形状(*.CSH)怎么作啊? 求问莱莎的炼金工房魔兽毒囊打什么怪掉落? 莱莎的炼金工房DLC的鲨鱼有直接硬打的方法么?有人知道吗? 上毛笔字辅导班,多长时间能会用正确的姿势书写毛笔字? 莱莎的炼金工房~常暗女王与秘密藏身处里这作传送只能在板子上点吗? 如何上毛笔楷书课四年级第一课学校人教版 在宣纸上写毛笔字墨迹会印开,怎样能避免? 莱莎的炼金工房2 天气有什么用 四年级上毛笔公开课的感受,写一篇作文 米黄色裤子画册水画时沾上毛笔墨汁,要怎么洗干净衣服? 你是如何喜欢上毛笔字的? 家谱上毛笔字怎么去掉 塑料制品上毛笔写不上怎么办? 95%纯棉的外套沾上毛笔的墨汁了,怎么办?要怎样洗才能洗干净 仪表盘上毛笔的标志是什么意思? 世界上毛笔最大的有多重? 关于布拉维法则