• 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

Moderators: tungcan5diop, QUANITGROBEST

User avatar
help-14
Thành viên chính thức
Thành viên chính thức
Posts: 26
Joined: Mon 20/04/2009 12:37 pm
Been thanked: 4 times

Transparent Form không cần Aero

Postby help-14 » Fri 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

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
Attachments
Transparent Form.rar
(592.26 KiB) Downloaded 1834 times



User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

Re: Transparent Form không cần Aero

Postby vo_minhdat2007 » Fri 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à?

User avatar
help-14
Thành viên chính thức
Thành viên chính thức
Posts: 26
Joined: Mon 20/04/2009 12:37 pm
Been thanked: 4 times

Re: Transparent Form không cần Aero

Postby help-14 » Fri 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è :
Image

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

Re: Transparent Form không cần Aero

Postby vo_minhdat2007 » Fri 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?

User avatar
TheDark
Guru
Guru
Posts: 188
Joined: Thu 04/11/2010 3:56 pm
Location: Mang Thít - Vĩnh Long
Has thanked: 6 times
Been thanked: 33 times

Re: Transparent Form không cần Aero

Postby TheDark » Fri 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.

User avatar
DarkProgrammer
Thành viên năng nổ
Thành viên năng nổ
Posts: 59
Joined: Wed 18/06/2008 7:20 pm
Location: Địa ngục
Been thanked: 1 time
Contact:

Re: Transparent Form không cần Aero

Postby DarkProgrammer » Sat 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á.

User avatar
nhatlinh0207
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 428
Joined: Wed 15/08/2012 7:54 pm
Has thanked: 58 times
Been thanked: 51 times

Re: Transparent Form không cần Aero

Postby nhatlinh0207 » Wed 14/11/2012 9:35 am

quá hay luôn tks :X

User avatar
nhatlinh0207
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 428
Joined: Wed 15/08/2012 7:54 pm
Has thanked: 58 times
Been thanked: 51 times

Re: Transparent Form không cần Aero

Postby nhatlinh0207 » Wed 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
Posts: 32
Joined: Wed 19/09/2012 9:01 am
Has thanked: 10 times

Re: Transparent Form không cần Aero

Postby anhhungbt9025 » Fri 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
Posts: 1
Joined: Sun 18/08/2013 6:28 pm

Re: Transparent Form không cần Aero

Postby vankiepanhsai » Thu 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
Posts: 1
Joined: Wed 02/03/2016 2:35 pm

Re: Transparent Form không cần Aero

Postby nh0xiskate » Wed 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:
Attachments
Transparent Form.rar
(5.77 MiB) Downloaded 153 times


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

Who is online

Users browsing this forum: No registered users and 1 guest