Page 1 of 1

Transparent Form không cần Aero

Posted: Fri 18/02/2011 9:01 am
by help-14
Thủ thuật: Transparent Form trong VB.net
Tác giả: Sưu tầm
Mô tả: Làm cho Form trong suốt, có đổ bóng, không cần aero chạy được trong Windows XP


Cái này sưu tầm được thấy rất hay nên share cho mọi người :D

Đầu tiên là tạo 1 form, FormBorderStyle = none, BackgroundImage là một cái ảnh png bất kỳ, có thể trong suốt, đổ bóng tùy thích :D

Image

Mở phần Code ra, dòng đầu tiên import cái này:
  1. Imports System.Runtime.InteropServices
  2. Imports System.IO


Trong Class của Form chèn đoạn code này:
[vbnet]
#Region "CUSTOM PAINT METHODS ----------------------------------------------"
Protected Overrides ReadOnly Property CreateParams() As CreateParams
Get
Dim cp As CreateParams = MyBase.CreateParams
cp.ExStyle = cp.ExStyle Or &H80000
' Required: set WS_EX_LAYERED extended style
Return cp
End Get
End Property

'Updates the Form's display using API calls
Public Sub UpdateFormDisplay(ByVal backgroundImage As Image)
Dim screenDc As IntPtr = API.GetDC(IntPtr.Zero)
Dim memDc As IntPtr = API.CreateCompatibleDC(screenDc)
Dim hBitmap As IntPtr = IntPtr.Zero
Dim oldBitmap As IntPtr = IntPtr.Zero

Try
'Display-image
Dim bmp As New Bitmap(backgroundImage)
hBitmap = bmp.GetHbitmap(Color.FromArgb(0))
'Set the fact that background is transparent
oldBitmap = API.SelectObject(memDc, hBitmap)

'Display-rectangle
Dim size As Size = bmp.Size
Dim pointSource As New Point(0, 0)
Dim topPos As New Point(Me.Left, Me.Top)

'Set up blending options
Dim blend As New API.BLENDFUNCTION()
blend.BlendOp = API.AC_SRC_OVER
blend.BlendFlags = 0
blend.SourceConstantAlpha = 255
blend.AlphaFormat = API.AC_SRC_ALPHA

API.UpdateLayeredWindow(Me.Handle, screenDc, topPos, size, memDc, pointSource, _
0, blend, API.ULW_ALPHA)

'Clean-up
bmp.Dispose()
API.ReleaseDC(IntPtr.Zero, screenDc)
If hBitmap <> IntPtr.Zero Then
API.SelectObject(memDc, oldBitmap)
API.DeleteObject(hBitmap)
End If
API.DeleteDC(memDc)
Catch generatedExceptionName As Exception
End Try
End Sub
#End Region

Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
UpdateFormDisplay(Me.BackgroundImage)
End Sub
[/vbnet]

Event Form_Load thêm dòng này:
[vbnet] UpdateFormDisplay(Me.BackgroundImage)[/vbnet]

Sau Class của Form, chèn thêm đoạn code này:
[vbnet]
Friend Class API
Public Const AC_SRC_OVER As Byte = &H0
Public Const AC_SRC_ALPHA As Byte = &H1
Public Const ULW_ALPHA As Int32 = &H2

<StructLayout(LayoutKind.Sequential, Pack:=1)> _
Public Structure BLENDFUNCTION
Public BlendOp As Byte
Public BlendFlags As Byte
Public SourceConstantAlpha As Byte
Public AlphaFormat As Byte
End Structure

Public Declare Auto Function UpdateLayeredWindow Lib "user32.dll" (ByVal hwnd As IntPtr, ByVal hdcDst As IntPtr, ByRef pptDst As Point, ByRef psize As Size, ByVal hdcSrc As IntPtr, ByRef pprSrc As Point, _
ByVal crKey As Int32, ByRef pblend As BLENDFUNCTION, ByVal dwFlags As Int32) As Boolean


Public Declare Auto Function GetDC Lib "user32.dll" (ByVal hWnd As IntPtr) As IntPtr

Public Declare Auto Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hDC As IntPtr) As IntPtr

<DllImport("user32.dll", ExactSpelling:=True)> _
Public Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
End Function

Public Declare Auto Function DeleteDC Lib "gdi32.dll" (ByVal hdc As IntPtr) As Boolean


<DllImport("gdi32.dll", ExactSpelling:=True)> _
Public Shared Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
End Function

Public Declare Auto Function DeleteObject Lib "gdi32.dll" (ByVal hObject As IntPtr) As Boolean
End Class
[/vbnet]

Giờ thì mọi người ấn F5 để xem kết quả :D

Image

Dùng cái này hay hơn TransparentKey nhiều vì TransparentKey không đổ bóng được, mọi người có thể Down file đính kèm về nghiên cứu :D

Re: Transparent Form không cần Aero

Posted: Fri 18/02/2011 10:58 am
by vo_minhdat2007
Chi mà cực khổ vậy bạn? Form có thuộc tính TransparentColorKey, đặt nó là được mà?

Re: Transparent Form không cần Aero

Posted: Fri 18/02/2011 11:04 am
by help-14
Ở trên đã nói rồi mà, transparentColorKey không đổ bóng được ~.~ nó ra như vậy nè :
Image

Re: Transparent Form không cần Aero

Posted: Fri 18/02/2011 12:00 pm
by vo_minhdat2007
Không phải, đó là do màu bóng của bạn gần với màu trong suốt. Ví dụ bây giờ bạn đặt màu bóng là xám, thì phần viền trong suốt bên ngoài đặt là đỏ hoặc hồng chẳng hạn?

Re: Transparent Form không cần Aero

Posted: Fri 18/02/2011 4:08 pm
by TheDark
Làm theo cách của bạn Đạt thì vẫn đỗ bóng chính xác được! Nhưng không hỗ trợ đổ bóng nữa trong suốt (ô -pai-si-ti = 50%) :D
Cách của chủ topic hay lém! thank.

Re: Transparent Form không cần Aero

Posted: Sat 04/06/2011 3:00 pm
by DarkProgrammer
em thấy cách này tuy dài nhưng mà hay. Form làm ra trông rất mượt. Rất chuyên nghiệp. Thanks nhá.

Re: Transparent Form không cần Aero

Posted: Wed 14/11/2012 9:35 am
by nhatlinh0207
quá hay luôn tks :X

Re: Transparent Form không cần Aero

Posted: Wed 14/11/2012 11:01 am
by nhatlinh0207
trời ơi sao tất cả các control trên đó đều k có vậy anh ơi :(((((

Re: Transparent Form không cần Aero

Posted: Fri 04/01/2013 12:55 pm
by anhhungbt9025
sao control ko hiện lên dc cái nào hết vậy mấy bạn

Re: Transparent Form không cần Aero

Posted: Thu 24/04/2014 1:56 pm
by vankiepanhsai
sao tất cả control ko hiện lên dc cái nào hết vậy mấy bạn...@@ có ai biết cách khắc phục lỗi này không..tks

Re: Transparent Form không cần Aero

Posted: Wed 02/03/2016 2:52 pm
by nh0xiskate
Mình Dùng code này thì From hiển thị hình ảnh ngon, không bị nhòe...
Nhưng Các button, text box, check box, webbrowser thêm vào khi F5 thì bị ẩn phí sau hình nền,
Bạn nào fix giúp mình với ...
TransparentColorKey Với hình nền của mình thì không dùng được, hình ảnh quăng hết @@
Code: