Transparent Form không cần Aero

Các thủ thuật về truyền thông đa phương tiện, đồ họa

Các điều hành viên: tungcan5diop, QUANITGROBEST

Đăng trả lời
Hình đại diện của thành viên
help-14
Thành viên chính thức
Thành viên chính thức
Bài viết: 26
Ngày tham gia: Thứ 2 20/04/2009 12:37 pm
Been thanked: 4 times

Transparent Form không cần Aero

Gửi bài 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

Hình ảnh

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:
  1. #Region "CUSTOM PAINT METHODS ----------------------------------------------"
  2.     Protected Overrides ReadOnly Property CreateParams() As CreateParams
  3.         Get
  4.             Dim cp As CreateParams = MyBase.CreateParams
  5.             cp.ExStyle = cp.ExStyle Or &H80000
  6.             ' Required set WS_EX_LAYERED extended style
  7.             Return cp
  8.         End Get
  9.     End Property
  10.  
  11.     'Updates the Form's display using API calls
  12.     Public Sub UpdateFormDisplay(ByVal backgroundImage As Image)
  13.         Dim screenDc As IntPtr = API.GetDC(IntPtr.Zero)
  14.         Dim memDc As IntPtr = API.CreateCompatibleDC(screenDc)
  15.         Dim hBitmap As IntPtr = IntPtr.Zero
  16.         Dim oldBitmap As IntPtr = IntPtr.Zero
  17.  
  18.         Try
  19.             'Display-image
  20.             Dim bmp As New Bitmap(backgroundImage)
  21.             hBitmap = bmp.GetHbitmap(Color.FromArgb(0))
  22.             'Set the fact that background is transparent
  23.             oldBitmap = API.SelectObject(memDc, hBitmap)
  24.  
  25.             'Display-rectangle
  26.             Dim size As Size = bmp.Size
  27.             Dim pointSource As New Point(0, 0)
  28.             Dim topPos As New Point(Me.Left, Me.Top)
  29.  
  30.             'Set up blending options
  31.             Dim blend As New API.BLENDFUNCTION()
  32.             blend.BlendOp = API.AC_SRC_OVER
  33.             blend.BlendFlags = 0
  34.             blend.SourceConstantAlpha = 255
  35.             blend.AlphaFormat = API.AC_SRC_ALPHA
  36.  
  37.             API.UpdateLayeredWindow(Me.Handle, screenDc, topPos, size, memDc, pointSource, _
  38.              0, blend, API.ULW_ALPHA)
  39.  
  40.             'Clean-up
  41.             bmp.Dispose()
  42.             API.ReleaseDC(IntPtr.Zero, screenDc)
  43.             If hBitmap <> IntPtr.Zero Then
  44.                 API.SelectObject(memDc, oldBitmap)
  45.                 API.DeleteObject(hBitmap)
  46.             End If
  47.             API.DeleteDC(memDc)
  48.         Catch generatedExceptionName As Exception
  49.         End Try
  50.     End Sub
  51. #End Region
  52.  
  53.     Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
  54.         UpdateFormDisplay(Me.BackgroundImage)
  55.     End Sub


Event Form_Load thêm dòng này:
  1.  UpdateFormDisplay(Me.BackgroundImage)


Sau Class của Form, chèn thêm đoạn code này:
  1. Friend Class API
  2.     Public Const AC_SRC_OVER As Byte = &H0
  3.     Public Const AC_SRC_ALPHA As Byte = &H1
  4.     Public Const ULW_ALPHA As Int32 = &H2
  5.  
  6.     <StructLayout(LayoutKind.Sequential, Pack=1)> _
  7.     Public Structure BLENDFUNCTION
  8.         Public BlendOp As Byte
  9.         Public BlendFlags As Byte
  10.         Public SourceConstantAlpha As Byte
  11.         Public AlphaFormat As Byte
  12.     End Structure
  13.  
  14.     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, _
  15.      ByVal crKey As Int32, ByRef pblend As BLENDFUNCTION, ByVal dwFlags As Int32) As Boolean
  16.  
  17.  
  18.     Public Declare Auto Function GetDC Lib "user32.dll" (ByVal hWnd As IntPtr) As IntPtr
  19.  
  20.     Public Declare Auto Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hDC As IntPtr) As IntPtr
  21.  
  22.     <DllImport("user32.dll", ExactSpelling=True)> _
  23.     Public Shared Function ReleaseDC(ByVal hWnd As IntPtr, ByVal hDC As IntPtr) As Integer
  24.     End Function
  25.  
  26.     Public Declare Auto Function DeleteDC Lib "gdi32.dll" (ByVal hdc As IntPtr) As Boolean
  27.  
  28.  
  29.     <DllImport("gdi32.dll", ExactSpelling=True)> _
  30.     Public Shared Function SelectObject(ByVal hDC As IntPtr, ByVal hObject As IntPtr) As IntPtr
  31.     End Function
  32.  
  33.     Public Declare Auto Function DeleteObject Lib "gdi32.dll" (ByVal hObject As IntPtr) As Boolean
  34. End Class


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

Hình ảnh

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
Tập tin đính kèm
Transparent Form.rar
(592.26 KiB) Đã tải về 1913 lần
Hình đại diện của thành viên
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: Chủ nhật 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Tiếp xúc:

Re: Transparent Form không cần Aero

Gửi bài by vo_minhdat2007 »

Chi mà cực khổ vậy bạn? Form có thuộc tính TransparentColorKey, đặt nó là được mà?
Hình đại diện của thành viên
help-14
Thành viên chính thức
Thành viên chính thức
Bài viết: 26
Ngày tham gia: Thứ 2 20/04/2009 12:37 pm
Been thanked: 4 times

Re: Transparent Form không cần Aero

Gửi bài by help-14 »

Ở trên đã nói rồi mà, transparentColorKey không đổ bóng được ~.~ nó ra như vậy nè :
Hình ảnh
Hình đại diện của thành viên
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: Chủ nhật 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Tiếp xúc:

Re: Transparent Form không cần Aero

Gửi bài 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?
Hình đại diện của thành viên
TheDark
Guru
Guru
Bài viết: 188
Ngày tham gia: Thứ 5 04/11/2010 3:56 pm
Đến từ: Mang Thít - Vĩnh Long
Has thanked: 6 times
Been thanked: 33 times

Re: Transparent Form không cần Aero

Gửi bài 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.
Hình đại diện của thành viên
DarkProgrammer
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 59
Ngày tham gia: Thứ 4 18/06/2008 7:20 pm
Đến từ: Địa ngục
Been thanked: 1 time
Tiếp xúc:

Re: Transparent Form không cần Aero

Gửi bài 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á.
Hình đại diện của thành viên
nhatlinh0207
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 428
Ngày tham gia: Thứ 4 15/08/2012 7:54 pm
Has thanked: 58 times
Been thanked: 49 times

Re: Transparent Form không cần Aero

Gửi bài by nhatlinh0207 »

quá hay luôn tks :X
Hình đại diện của thành viên
nhatlinh0207
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 428
Ngày tham gia: Thứ 4 15/08/2012 7:54 pm
Has thanked: 58 times
Been thanked: 49 times

Re: Transparent Form không cần Aero

Gửi bài by nhatlinh0207 »

trời ơi sao tất cả các control trên đó đều k có vậy anh ơi :(((((
anhhungbt9025
Thành viên chính thức
Thành viên chính thức
Bài viết: 32
Ngày tham gia: Thứ 4 19/09/2012 9:01 am
Has thanked: 10 times

Re: Transparent Form không cần Aero

Gửi bài by anhhungbt9025 »

sao control ko hiện lên dc cái nào hết vậy mấy bạn
vankiepanhsai
Bài viết: 1
Ngày tham gia: Chủ nhật 18/08/2013 6:28 pm

Re: Transparent Form không cần Aero

Gửi bài 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
nh0xiskate
Bài viết: 1
Ngày tham gia: Thứ 4 02/03/2016 2:35 pm

Re: Transparent Form không cần Aero

Gửi bài 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:
Tập tin đính kèm
Transparent Form.rar
(5.77 MiB) Đã tải về 235 lần
stephg023
Bài viết: 1
Ngày tham gia: Thứ 2 11/01/2021 3:26 pm

Re: Transparent Form không cần Aero

Gửi bài by stephg023 »

help-14 đã viết:
Thứ 6 18/02/2011 11:04 am
Ở trên đã nói rồi mà, transparentColorKey meilleurs credits consommation không đổ bóng được ~.~ nó ra như vậy nè :
Mình vừa mới download về bình thường. Bạn thử lại xem.
Đăng trả lời

Quay về