• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

Transparent Form không cần Aero

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

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
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: T.Hai 20/04/2009 12:37 pm
Been thanked: 4 time

Transparent Form không cần Aero

Gửi bàigửi bởi help-14 » T.Sáu 18/02/2011 9:01 am

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
  56.  


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
  35.  


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 1769 lần



Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Transparent Form không cần Aero

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 18/02/2011 10:58 am

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 người dùng
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: T.Hai 20/04/2009 12:37 pm
Been thanked: 4 time

Re: Transparent Form không cần Aero

Gửi bàigửi bởi help-14 » T.Sáu 18/02/2011 11:04 am

Ở 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 người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Re: Transparent Form không cần Aero

Gửi bàigửi bởi vo_minhdat2007 » T.Sáu 18/02/2011 12:00 pm

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 người dùng
TheDark
Guru
Guru
Bài viết: 188
Ngày tham gia: T.Năm 04/11/2010 3:56 pm
Đến từ: Mang Thít - Vĩnh Long
Has thanked: 6 time
Been thanked: 33 time

Re: Transparent Form không cần Aero

Gửi bàigửi bởi TheDark » T.Sáu 18/02/2011 4:08 pm

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 người dùng
DarkProgrammer
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 59
Ngày tham gia: T.Tư 18/06/2008 7:20 pm
Đến từ: Địa ngục
Been thanked: 1 time
Liên hệ:

Re: Transparent Form không cần Aero

Gửi bàigửi bởi DarkProgrammer » T.Bảy 04/06/2011 3:00 pm

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 người dùng
nhatlinh0207
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 389
Ngày tham gia: T.Tư 15/08/2012 7:54 pm
Has thanked: 54 time
Been thanked: 48 time

Re: Transparent Form không cần Aero

Gửi bàigửi bởi nhatlinh0207 » T.Tư 14/11/2012 9:35 am

quá hay luôn tks :X

Hình đại diện của người dùng
nhatlinh0207
Thành viên tâm huyết
Thành viên tâm huyết
Bài viết: 389
Ngày tham gia: T.Tư 15/08/2012 7:54 pm
Has thanked: 54 time
Been thanked: 48 time

Re: Transparent Form không cần Aero

Gửi bàigửi bởi nhatlinh0207 » T.Tư 14/11/2012 11:01 am

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: T.Tư 19/09/2012 9:01 am
Has thanked: 10 time

Re: Transparent Form không cần Aero

Gửi bàigửi bởi anhhungbt9025 » T.Sáu 04/01/2013 12:55 pm

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: CN 18/08/2013 6:28 pm

Re: Transparent Form không cần Aero

Gửi bàigửi bởi vankiepanhsai » T.Năm 24/04/2014 1:56 pm

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: T.Tư 02/03/2016 2:35 pm

Re: Transparent Form không cần Aero

Gửi bàigửi bởi nh0xiskate » T.Tư 02/03/2016 2:52 pm

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 99 lần


Quay về “[.NET] Âm thanh và Đồ họa”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách