小弟想做一个漂亮的窗口,比如:做个 苹果 外形的窗口.
我知道只要做出 苹果 外形的区域就能完成这个窗口.
但是API中根本就没有 苹果 外形的函数啊!!!
用 CreatePolygonRgn 可以做出多边形的区域,但是需要自己输入 点的座标.
我的天, 苹果外轮廓的座标怎么得到,要非常精确的描绘,要很多点座标啊!每个座标都要自己输入,那么
多么累啊??????/
有没有更好的方法啊?????????????比如:把苹果的图片载入,外windows自己找到它的轮廓?我真的没办法了!55555555555555555555555555555
帮帮我 啊
我没有分数了!!不好意思!!!
我知道只要做出 苹果 外形的区域就能完成这个窗口.
但是API中根本就没有 苹果 外形的函数啊!!!
用 CreatePolygonRgn 可以做出多边形的区域,但是需要自己输入 点的座标.
我的天, 苹果外轮廓的座标怎么得到,要非常精确的描绘,要很多点座标啊!每个座标都要自己输入,那么
多么累啊??????/
有没有更好的方法啊?????????????比如:把苹果的图片载入,外windows自己找到它的轮廓?我真的没办法了!55555555555555555555555555555
帮帮我 啊
我没有分数了!!不好意思!!!
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
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Const RGN_OR = 2
Private Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type'******************************根据某种颜色使窗体透明(快)*************************************
Public Sub SetAutoRgn(hForm As Form, Optional transColor As Byte = vbNull)
Dim bmByte() As Byte
Dim X As Long, Y As Long
Dim Rgn1 As Long, Rgn2 As Long
Dim SPos As Long, EPos As Long
Dim bm As BITMAP
Dim hbm As Long
Dim Wid As Long, Hgt As Long
Dim xoff As Long, yoff As Long
'获取窗体背景图片尺寸
hbm = hForm.Picture
GetObjectAPI hbm, Len(bm), bm
Wid = bm.bmWidth
Hgt = bm.bmHeight
ReDim bmByte(1 To Wid, 1 To Hgt)
GetBitmapBits hbm, Wid * Hgt, bmByte(1, 1) '获取图像数组
'如果没有传入transColor参数,则用第一个像素作为透明色
If transColor = vbNull Then transColor = bmByte(1, 1)
Rgn1 = CreateRectRgn(0, 0, 0, 0)
For Y = 1 To Hgt '逐行扫描
X = 0
Do
X = X + 1
While (bmByte(X, Y) = transColor) And (X < Wid)
X = X + 1 '跳过是透明色的点
Wend
SPos = X
While (bmByte(X, Y) <> transColor) And (X < Wid)
X = X + 1 '跳过不是透明色的点
Wend
EPos = X - 1
'这一段是合并区域
If SPos <= EPos Then
Rgn2 = CreateRectRgn(SPos - 1, Y - 1, EPos, Y)
CombineRgn Rgn1, Rgn1, Rgn2, RGN_OR
DeleteObject Rgn2
End If
Loop Until X >= Wid
Next Y
Erase bmByte()
SetWindowRgn hForm.hwnd, Rgn1, True '设定窗体形状区域
DeleteObject Rgn1
End Sub
'******************************根据某种颜色使窗体透明(慢)*************************************
Public Sub DoTransparency(bg As Form, transColor)
Dim rgn As Long
Dim Rgn2 As Long
Dim rgn3 As Long
Dim rgn4 As Long
Dim X1 As Long
Dim Y1 As Long
Dim i As Long
Dim j As Long
Dim tj As Long
rgn = CreateRectRgn(0, 0, 0, 0)
Rgn2 = CreateRectRgn(0, 0, 0, 0)
rgn3 = CreateRectRgn(0, 0, 0, 0)
i = 1
X1 = bg.Width / Screen.TwipsPerPixelX
Y1 = bg.Height / Screen.TwipsPerPixelY
Do While i < X1
j = 1
Do While j < Y1
If GetPixel(bg.hdc, i, j) <> transColor Then
tj = j
Do While GetPixel(bg.hdc, i, j + 1) <> transColor
j = j + 1
If j = Y1 Then Exit Do
Loop
rgn4 = CreateRectRgn(i, tj, i + 1, j + 1)
CombineRgn rgn3, Rgn2, Rgn2, 5
CombineRgn Rgn2, rgn4, rgn3, 2
DeleteObject rgn4
End If
j = j + 1
Loop
CombineRgn rgn3, rgn, rgn, 5
CombineRgn rgn, Rgn2, rgn3, 2
i = i + 1
Loop
SetWindowRgn bg.hwnd, rgn, True
DeleteObject rgn
DeleteObject Rgn2
DeleteObject rgn3
End Sub在使用之前请把form的borderstyle设置为0,如果使用第二种方法把AutoRedraw设置为TRUE。把FORM的Picture属性设置为你的图片。
Private Sub Form_Load()
SetAutoRgn Me '第二个参数可不写,则用窗体的第一个像素作为透明色
'DoTransparency Me, vbRed '第二个参数为窗体中不需要显示的颜色值
End Sub
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
Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
Private Declare Function GetBitmapBits Lib "gdi32" (ByVal hBitmap As Long, ByVal dwCount As Long, lpBits As Any) As Long
Private Const RGN_OR = 2
Private Type BITMAP
bmType As Long
bmWidth As Long
bmHeight As Long
bmWidthBytes As Long
bmPlanes As Integer
bmBitsPixel As Integer
bmBits As Long
End Type'******************************根据某种颜色使窗体透明(快)*************************************
Public Sub SetAutoRgn(hForm As Form, Optional transColor As Byte = vbNull)
Dim bmByte() As Byte
Dim X As Long, Y As Long
Dim Rgn1 As Long, Rgn2 As Long
Dim SPos As Long, EPos As Long
Dim bm As BITMAP
Dim hbm As Long
Dim Wid As Long, Hgt As Long
Dim xoff As Long, yoff As Long
'获取窗体背景图片尺寸
hbm = hForm.Picture
GetObjectAPI hbm, Len(bm), bm
Wid = bm.bmWidth
Hgt = bm.bmHeight
ReDim bmByte(1 To Wid, 1 To Hgt)
GetBitmapBits hbm, Wid * Hgt, bmByte(1, 1) '获取图像数组
'如果没有传入transColor参数,则用第一个像素作为透明色
If transColor = vbNull Then transColor = bmByte(1, 1)
Rgn1 = CreateRectRgn(0, 0, 0, 0)
For Y = 1 To Hgt '逐行扫描
X = 0
Do
X = X + 1
While (bmByte(X, Y) = transColor) And (X < Wid)
X = X + 1 '跳过是透明色的点
Wend
SPos = X
While (bmByte(X, Y) <> transColor) And (X < Wid)
X = X + 1 '跳过不是透明色的点
Wend
EPos = X - 1
'这一段是合并区域
If SPos <= EPos Then
Rgn2 = CreateRectRgn(SPos - 1, Y - 1, EPos, Y)
CombineRgn Rgn1, Rgn1, Rgn2, RGN_OR
DeleteObject Rgn2
End If
Loop Until X >= Wid
Next Y
Erase bmByte()
SetWindowRgn hForm.hwnd, Rgn1, True '设定窗体形状区域
DeleteObject Rgn1
End Sub
incubus(梦淫妖) ( ) 啊!
这段代码怎么让我这么眼熟悉啊!看来看去。我发现是我写的哎!注释变量一点都不差嘛!
哎。不过这段代码的确值得收藏。我也一直把它存着呢!
不过不知道速度怎么样啊!