簡(jiǎn)單的部分透明比較難做,不過(guò)可以換個(gè)方式考慮一下。
網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序設(shè)計(jì)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了興賓免費(fèi)建站歡迎大家使用!
把本問(wèn)題轉(zhuǎn)換成在VB.NET 2005環(huán)境下創(chuàng)建不規(guī)則窗體(=普通窗體 - 透明部分)問(wèn)題,解決方法就很多了,網(wǎng)上也有許多例子。如 章立民 的書里就詳細(xì)講過(guò)。
大致思路如下:
1。將backgroundimage設(shè)成一個(gè)位圖(點(diǎn)陣圖)
2.將Transparaencykey設(shè)成位圖的背景顏色(位圖最取背景單純,單純部分將成為透明部分)
3.如需要可以將formborderstyle設(shè)為none,會(huì)移除標(biāo)題欄,并需要手動(dòng)編寫窗體移動(dòng)、關(guān)閉等動(dòng)作代碼,
PS:一下代碼是復(fù)制的,因?yàn)镚oogle一下就有
‘添加新模塊:
Option Explicit
'透明接口調(diào)用
Private Declare Function SetwindowLong Lib "user32" _
Alias "SetwindowLongA" _
(ByVal hwnd As Long, _
ByVal nIndex As Long, _
ByVal dwNewLong As Long) _
As Long
Private Declare Function GetwindowLong Lib "user32" _
Alias "GetwindowLongA" ( _
ByVal hwnd As Long, _
ByVal nIndex As Long) _
As Long
Private Declare Function SetLayeredwindowAttributes Lib "user32" ( _
ByVal hwnd As Long, _
ByVal crKey As Long, _
ByVal bAlpha As Long, _
ByVal dwFlags As Long) _
As Long
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA As Long = H2
Private Const WS_EX_LAYERED As Long = H80000
'設(shè)置窗口透明度
Public Sub SetFormToAlpha(hwnd As Long, lngAlpha As Long)
Dim tmpLog As Long
If hwnd = 0 Then Exit Sub
If lngAlpha = 0 And lngAlpha = 255 Then
tmpLog = GetwindowLong(hwnd, GWL_EXSTYLE) '窗口屬性
Call SetwindowLong(hwnd, GWL_EXSTYLE, tmpLog or WS_EX_LAYERED)
Call SetLayeredwindowAttributes(hwnd, 0, lngAlpha, LWA_ALPHA)
End If
End Sub
先建一個(gè)標(biāo)準(zhǔn)EXE工程,然后添加一個(gè)用戶控件,把以下代碼復(fù)制到控件代碼中,再把此控件放置到Form1上。
[vb]?view plain?copy
Option?Explicit
Private?Declare?Sub?CopyMemory?Lib?"kernel32"?Alias?"RtlMoveMemory"?(Destination?As?Any,?Source?As?Any,?ByVal?Length?As?Long)
Private?Declare?Function?GetClientRect?Lib?"user32"?(ByVal?hwnd?As?Long,?lpRect?As?RECT)?As?Long
Private?Declare?Function?ClientToScreen?Lib?"user32"?(ByVal?hwnd?As?Long,?lpPoint?As?POINTAPI)?As?Long
Private?Declare?Function?ScreenToClient?Lib?"user32"?(ByVal?hwnd?As?Long,?lpPoint?As?POINTAPI)?As?Long
Private?Declare?Function?SetRect?Lib?"user32"?(lpRect?As?RECT,?ByVal?X1?As?Long,?ByVal?Y1?As?Long,?ByVal?X2?As?Long,?ByVal?Y2?As?Long)?As?Long
Private?Declare?Function?OffsetRect?Lib?"user32"?(lpRect?As?RECT,?ByVal?X?As?Long,?ByVal?Y?As?Long)?As?Long
Private?Type?POINTAPI
X?As?Long
Y?As?Long
End?Type
Private?Type?RECT
Left?As?Long
Top?As?Long
Right?As?Long
Bottom?As?Long
End?Type
Private?Declare?Function?DrawText?Lib?"user32"?Alias?"DrawTextA"?(ByVal?hdc?As?Long,?ByVal?lpStr?As?String,?ByVal?nCount?As?Long,?lpRect?As?RECT,?ByVal?wFormat?As?Long)?As?Long
Private?Const?DT_SINGLELINE?=?H20
Private?Const?DT_CENTER?=?H1
Private?Const?DT_VCENTER?=?H4
Private?Declare?Function?GetDC?Lib?"user32"?(ByVal?hwnd?As?Long)?As?Long
Private?Declare?Function?ReleaseDC?Lib?"user32"?(ByVal?hwnd?As?Long,?ByVal?hdc?As?Long)?As?Long
Private?Declare?Function?CreateCompatibleDC?Lib?"gdi32"?(ByVal?hdc?As?Long)?As?Long
Private?Declare?Function?DeleteDC?Lib?"gdi32"?(ByVal?hdc?As?Long)?As?Long
Private?Declare?Function?CreateCompatibleBitmap?Lib?"gdi32"?(ByVal?hdc?As?Long,?ByVal?nWidth?As?Long,?ByVal?nHeight?As?Long)?As?Long
Private?Declare?Function?SelectObject?Lib?"gdi32"?(ByVal?hdc?As?Long,?ByVal?hObject?As?Long)?As?Long
Private?Declare?Function?DeleteObject?Lib?"gdi32"?(ByVal?hObject?As?Long)?As?Long
Private?Declare?Function?ShowWindow?Lib?"user32"?(ByVal?hwnd?As?Long,?ByVal?nCmdShow?As?Long)?As?Long
Private?Const?SW_SHOW?=?5
Private?Const?SW_HIDE?=?0
Private?Declare?Function?BitBlt?Lib?"gdi32"?(ByVal?hDestDC?As?Long,?ByVal?X?As?Long,?ByVal?Y?As?Long,?ByVal?nWidth?As?Long,?ByVal?nHeight?As?Long,?ByVal?hSrcDC?As?Long,?ByVal?xSrc?As?Long,?ByVal?ySrc?As?Long,?ByVal?dwRop?As?Long)?As?Long
Private?Declare?Function?AlphaBlend?Lib?"msimg32"?(ByVal?hDestDC?As?Long,?ByVal?X?As?Long,?ByVal?Y?As?Long,?ByVal?nWidth?As?Long,?ByVal?nHeight?As?Long,?ByVal?hSrcDC?As?Long,?ByVal?xSrc?As?Long,?ByVal?ySrc?As?Long,?ByVal?widthSrc?As?Long,?ByVal?heightSrc?As?Long,?ByVal?blendFunct?As?Long)?As?Boolean
Dim?m_hMemDC?As?Long
Dim?m_hMemBmp?As?Long,?m_hMemBmpPrev?As?Long
Dim?m_rcControl?As?RECT
Private?Sub?UserControl_Initialize()
UserControl.AutoRedraw?=?True
UserControl.BackColor?=?vbRed
m_hMemDC?=?CreateCompatibleDC(UserControl.hdc)
End?Sub
Private?Sub?UserControl_Terminate()
If?m_hMemBmp??0?Then
DeleteObject?SelectObject(m_hMemDC,?m_hMemBmpPrev)
End?If
DeleteDC?m_hMemDC
End?Sub
Public?Sub?Translucence()
Dim?hdc?As?Long
Dim?tPt?As?POINTAPI
'獲得控件當(dāng)前位置和大小
ClientToScreen?UserControl.hwnd,?tPt
ScreenToClient?UserControl.ContainerHwnd,?tPt
Call?GetClientRect(UserControl.hwnd,?m_rcControl)
OffsetRect?m_rcControl,?tPt.X,?tPt.Y
'創(chuàng)建一幅內(nèi)存位圖
If?m_hMemBmp??0?Then
DeleteObject?(SelectObject(m_hMemDC,?m_hMemBmpPrev))
End?If
m_hMemBmp?=?CreateCompatibleBitmap(UserControl.hdc,?m_rcControl.Right,?m_rcControl.Bottom)
m_hMemBmpPrev?=?SelectObject(m_hMemDC,?m_hMemBmp)
'隱藏控件
ShowWindow?UserControl.hwnd,?SW_HIDE
DoEvents
'保存控件容器的圖像到內(nèi)存位圖中
Dim?hDesktopDC?As?Long
hDesktopDC?=?GetDC(UserControl.hwnd)
BitBlt?m_hMemDC,?0,?0,?m_rcControl.Right,?m_rcControl.Bottom,?hDesktopDC,?0,?0,?vbSrcCopy
ReleaseDC?0,?hDesktopDC
'通過(guò)alpha效果進(jìn)行半透明渲染
UserControl.AutoRedraw?=?True
AlphaBlend?m_hMemDC,?0,?0,?m_rcControl.Right,?m_rcControl.Bottom,?UserControl.hdc,?0,?0,?m_rcControl.Right,?m_rcControl.Bottom,?5242880
UserControl.AutoRedraw?=?False
'顯示控件
ShowWindow?UserControl.hwnd,?SW_SHOW
'將渲染后的結(jié)果復(fù)制到控件中
BitBlt?UserControl.hdc,?0,?0,?m_rcControl.Right,?m_rcControl.Bottom,?m_hMemDC,?0,?0,?vbSrcCopy
End?Sub
Private?Sub?UserControl_Paint()
BitBlt?UserControl.hdc,?0,?0,?m_rcControl.Right,?m_rcControl.Bottom,?m_hMemDC,?0,?0,?vbSrcCopy
End?Sub
在Form1的Form_Activate事件里輸入以下代碼:
[vb]?view plain?copy
Private?Sub?Form_Activate()
Me.UserControl11.Translucence
End?Sub
最后,你將看到一個(gè)粉紅色半透明的方塊,該方塊就是你所需要的半透明的控件。至于控件的其它功能,可以自行擴(kuò)展。
'函數(shù)SetLayeredWindowAttributes ' 使用這個(gè)函數(shù),可以輕松的實(shí)現(xiàn)半透明窗體。按照微軟的要求,透明窗體窗體在創(chuàng)建時(shí)應(yīng)使用WS_EX_LAYERED參數(shù)(用CreateWindowEx),或者在創(chuàng)建后設(shè)置該參數(shù)(用SetWindowLong),我選用后者。全部函數(shù)、常量聲明如下: Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long ' 其中hwnd是透明窗體的句柄,crKey為顏色值,bAlpha是透明度,取值范圍是[0,255],dwFlags是透明方式,可以取兩個(gè)值:當(dāng)取值為L(zhǎng)WA_ALPHA時(shí),crKey參數(shù)無(wú)效,bAlpha參數(shù)有效;當(dāng)取值為L(zhǎng)WA_COLORKEY時(shí),bAlpha參數(shù)有效而窗體中的所有顏色為crKey的地方將變?yōu)橥该鳎@個(gè)功能很有用:我們不必再為建立不規(guī)則形狀的窗體而調(diào)用一大堆區(qū)域分析、創(chuàng)建、合并函數(shù)了,只需指定透明處的顏色值即可,哈哈哈哈!請(qǐng)看具體代碼。 Private Const WS_EX_LAYERED = H80000 Private Const GWL_EXSTYLE = (-20) Private Const LWA_ALPHA = H2 Private Const LWA_COLORKEY = H1 Private Sub Command1_Click() Unload Me End Sub Private Sub Form_Load() Dim rtn As Long rtn = GetWindowLong(hwnd, GWL_EXSTYLE) rtn = rtn Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes hwnd, 0, 150, LWA_ALPHA End Sub
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const WS_EX_LAYERED = H80000
Private Const GWL_EXSTYLE = (-20)
Private Const LWA_ALPHA = H2
Private Const LWA_COLORKEY = H1
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
Private Sub SetFormTranslucency(hwnd As Long, crKey As Long, bAlpha As Byte, dwFlags As Long)'實(shí)現(xiàn)半透明窗體
Dim rtn As Long
rtn = GetWindowLong(hwnd, GWL_EXSTYLE)
rtn = rtn Or WS_EX_LAYERED
SetWindowLong hwnd, GWL_EXSTYLE, rtn
SetLayeredWindowAttributes hwnd, crKey, bAlpha, dwFlags
End Sub
Private Sub Form_Load()
Call SetFormTranslucency(Me.hwnd, 0, 200, 2) '窗體半透明,200為透明值
End Sub
可以實(shí)現(xiàn)窗體和窗體上的控件全都半透明,透明度可調(diào)
新聞名稱:vb.net窗體半透明,vb窗體透明改哪個(gè)屬性
分享網(wǎng)址:http://chinadenli.net/article34/hescpe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供服務(wù)器托管、定制開發(fā)、企業(yè)建站、ChatGPT、自適應(yīng)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
網(wǎng)頁(yè)設(shè)計(jì)公司知識(shí)