• 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

Làm Form trong suốt (Nhưng ko trong suốt Controls)

Các thủ thuật liên quan đến việc xử lý ứng dụng, biểu mẫu và control
User avatar
T7
Thành viên danh dự
Thành viên danh dự
Posts: 415
Joined: Thu 24/05/2007 8:19 pm
Location: Long Xuyên - An Giang
Been thanked: 12 times
Contact:

Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby T7 » Sun 18/01/2009 10:13 am

Thủ thuật: Làm Form trong suốt (Nhưng ko trong suốt Controls)
Tác giả: T-7
Mô tả: Thường thì khi làm trong suốt một form thì các control cũng bị trong suốt theo, nhưng đôi khi trong lập trình phần mềm thì ta chỉ cần cho cái form trong suốt thôi là đủ. Vậy nên có lẽ đoạn code này sẽ giúp ít cho mọi người đấy :D

Chú ý: Nhớ đặt thuộc tính BorderStyle của Form là: 0 - None nhé ;)



Code: Select all

  1. Const GWL_EXSTYLE = (-20)
  2. Const WS_EX_TRANSPARENT = &H20&
  3. Const HWND_NOTOPMOST = -2
  4. Const SWP_FRAMECHANGED = &H20
  5. Const SWP_NOMOVE = &H2
  6. Const SWP_NOSIZE = &H1
  7.  
  8. Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  9. Private Declare Function SetWindowPos Lib "user32" (ByVal hWnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal Cx As Long, ByVal Cy As Long, ByVal wFlags As Long) As Long
  10.  
  11. Private Sub Form_Load()
  12. SetWindowLong Me.hWnd, GWL_EXSTYLE, WS_EX_TRANSPARENT
  13. SetWindowPos Me.hWnd, HWND_NOTOPMOST, 0&, 0&, 0&, 0&, SWP_FRAMECHANGED Or SWP_NOMOVE Or SWP_NOSIZE
  14. End Sub
  15.  
Attachments
untitled.JPG
Ảnh minh họa
untitled.JPG (16.62 KiB) Viewed 10561 times


While (i <= you) i++;

User avatar
playgemboy
Thành viên danh dự
Thành viên danh dự
Posts: 289
Joined: Sun 13/04/2008 6:10 am
Location: Bình Phú, Quận 6, TP.HCM
Been thanked: 1 time
Contact:

Re: Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby playgemboy » Sat 24/01/2009 8:24 am

ồ, rất hay, nhưng xem ra nó không thật sự là trong suốt đâu T7 ạ, hình như nó chỉ lấy các pixel đằng sau ra "in" lên cái form của mình thôi, có cách nào transprarents cái form (chỉnh được độ trong suốt) mà ko làm cho các control mờ theo ko?
<I Come Back>

Hoang Thanh
Posts: 9
Joined: Tue 01/04/2008 9:58 am

Re: Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby Hoang Thanh » Sun 01/02/2009 2:03 pm

Nếu bây giờ, ta ko để BorderStyle là 0-None thì các nút Min, Max button sẽ hiển thị khi move mouse qua. Do đó, đây ko phải là làm trong suốt form. Với lại các bạn để ý nha. Trong quá trình test, Run Project. Sau đó Stop Project, thì form vẫn còn dấu vết trên màn hình. Nói để hình dung thì hơi khó. Nhưng làm thử xem. Tuy nhiên, 1 kỹ thuật hay. Thanks T7

nvtlib
Posts: 3
Joined: Sat 31/01/2009 4:27 pm
Location: Ninh Binh
Contact:

Re: Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby nvtlib » Tue 03/02/2009 12:41 am

Cho form một màu nào đó của form khác màu của control.Sau đó gọi :
this.TransparencyKey="màu cần trong suốt"
Không bít em có sai chủ đề không nhỉ
Tôi yêu .Net-Control cực đẹp cho .Net [url]www.libdotnet.tk[/url]

User avatar
truongphu
VIP
VIP
Posts: 4765
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 519 times

Re: Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby truongphu » Tue 03/02/2009 8:26 am

Code: Select all

  1. Option Explicit
  2.   ' demo project showing how to use the region API functions
  3.   ' by Bryan Stafford of New Vision Software® - newvision@mvps.org
  4.   ' this demo is released into the public domain "as is" without
  5.   ' warranty or guaranty of any kind.  In other words, use at
  6.   ' your own risk.
  7.  
  8.   Private Const RGN_AND  As Long = 1&  ' <- returns only the parts that are common to both
  9.   Private Const RGN_OR  As Long = 2&   ' <- returns a region that contains the area of both
  10.   Private Const RGN_XOR  As Long = 3&  ' <- returns only the parts that don't overlap
  11.   Private Const RGN_DIFF  As Long = 4& ' <- subtracts one region from another
  12.   Private Const RGN_COPY  As Long = 5& ' <- copies a region
  13.  
  14.   Private Declare Function CreateRectRgn& Lib "gdi32" (ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)
  15.   Private Declare Function CreateEllipticRgn& Lib "gdi32" (ByVal X1&, ByVal Y1&, ByVal X2&, ByVal Y2&)
  16.   Private Declare Function CombineRgn& Lib "gdi32" (ByVal hDestRgn&, ByVal hSrcRgn1&, ByVal hSrcRgn2&, ByVal nCombineMode&)
  17.   Private Declare Function SetWindowRgn& Lib "user32" (ByVal hWnd&, ByVal hRgn&, ByVal bRedraw&)
  18.   Private Declare Function DeleteObject& Lib "gdi32" (ByVal hObject&)
  19.  
  20. Private Sub Form_Resize()
  21.  
  22.   Dim hOuterRgn&, hInnerRgn&, hIslandRgn&, hRegion&
  23.   Dim nWidth&, nHeight&, nNCBorderWidth&, nNCBorderHeight&
  24.  
  25.   If WindowState = vbMinimized Then Exit Sub
  26.  
  27.   ' get the width and height of the form in pixels
  28.   nWidth = ScaleX(Width, vbTwips, vbPixels)
  29.   nHeight = ScaleY(Height, vbTwips, vbPixels)
  30.  
  31.   ' create a region the size of the form
  32.   hOuterRgn = CreateRectRgn(0&, 0&, nWidth, nHeight)
  33.  
  34.   ' Determine the size of the borders of the form (this could be done using a call to GetClientRect also)
  35.   nNCBorderWidth = (nWidth - ScaleWidth) / 2
  36.   nNCBorderHeight = nHeight - nNCBorderWidth - ScaleHeight
  37.  
  38.  
  39.   ' comment the next line and uncomment the following line to see different effects
  40.   hInnerRgn = CreateRectRgn(nNCBorderWidth, nNCBorderHeight, _
  41.                         ScaleWidth + nNCBorderWidth, ScaleHeight + nNCBorderHeight)
  42.      
  43.   'hInnerRgn = CreateEllipticRgn(nNCBorderWidth + ScaleWidth * 0.1, _
  44.         nNCBorderHeight + ScaleHeight * 0.1, ScaleWidth * 0.9, ScaleHeight * 0.9)
  45.  
  46.  
  47.   ' add an island the size of the command button to the center of the form
  48.   hIslandRgn = CreateRectRgn(nNCBorderWidth + Command1.Left, nNCBorderHeight + Command1.Top, _
  49.           (nNCBorderWidth + Command1.Left) + Command1.Width, (nNCBorderHeight + Command1.Top) + Command1.Height)
  50.  
  51.   CombineRgn hInnerRgn, hInnerRgn, hIslandRgn, RGN_DIFF
  52.  
  53.  
  54.   ' creat a dummy region to hold the region created by CombineRgn
  55.   hRegion = CreateRectRgn(0&, 0&, 10&, 10&)
  56.  
  57.   ' Subtract the inner region from the outer.
  58.   CombineRgn hRegion, hOuterRgn, hInnerRgn, RGN_DIFF
  59.  
  60.   ' clean up after ourselves
  61.   DeleteObject hOuterRgn
  62.   DeleteObject hInnerRgn
  63.   DeleteObject hIslandRgn
  64.  
  65.   ' assign the region to the window
  66.   SetWindowRgn hWnd, hRegion, True
  67.  
  68. End Sub
  69.  
  70. Private Sub Command1_Click()
  71.   Unload Me
  72. End Sub
Attachments
Simple_Regions_Demo.zip
(2.15 KiB) Downloaded 1397 times
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh

User avatar
NoBi
Quản trị
Quản trị
Posts: 959
Joined: Tue 18/03/2008 1:22 pm
Location: Sài Gòn
Has thanked: 53 times
Been thanked: 66 times
Contact:

Re: Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby NoBi » Tue 03/02/2009 11:30 am

Trước đây ở forum cũ có module này, có lẻ mọi người chưa để ý tới. Trong module có:
Public Sub MakeTransparentControl(myControl As Control, vbColor)
dùng để làm trong suốt 1 control theo mã màu nhất định.

Để sử dụng bạn gọi:

Code: Select all

  1. Private Sub Command1_Click()
  2.     MakeTransparentControl Frame1, &HFF00FF
  3. End Sub

Frame1 ở đây có BackColor = &H00FF00FF&

Mở rộng ra, ta có thể bỏ khai báo tường minh kiểu Control cho biến myControl để có thể truyền vào 1 Form hoặc 1 Control:
Public Sub MakeTransparentControl(myControl, vbColor)

Khi sử dụng:

Code: Select all

  1. Private Sub Command1_Click()
  2.     MakeTransparentControl Frame1, &HFF00FF
  3.     MakeTransparentControl Form1, &HFF&
  4. End Sub

Form1 có BackColor là màu đỏ = &H000000FF&

Trong module này còn nhiều hàm hay nữa để dành anh em khám phá thêm.
Attachments
modRegionShape2.rar
Module modRegionShape2.bas
(11.35 KiB) Downloaded 1218 times
:>

User avatar
lipton150786
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 345
Joined: Thu 18/11/2010 10:00 pm
Has thanked: 5 times
Been thanked: 29 times

Re: Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby lipton150786 » Mon 21/03/2011 9:09 am

tôi đã chạy thử code của mọi người tôi thấy y tưởng cũng hay nhưng mà có đều không tự nhiên lắm và không thể chạy tự động được. nếu thêm vảo một control thỉ phải sửa code cái này hơi bất tiện một chúc.

Có cách nào khác không mà ta không cần quan tâm tới màu của form hay control cũng như có thể thêm bớt control mả vẩn làm cho form trong suốt(cả thanh titlte của form) và không cẩn thay đổi code????

nntrang
Thành viên chính thức
Thành viên chính thức
Posts: 34
Joined: Thu 29/05/2008 4:16 pm
Has thanked: 1 time
Been thanked: 2 times

Re: Làm Form trong suốt (Nhưng ko trong suốt Controls)

Postby nntrang » Fri 30/09/2011 11:14 pm

Win Vista hay Win7 khi làm mờ của sổ thì các nét chữ nó bị nhòe đi
Nhưng nếu lập trình như trên thì hình như chi làm trong suốt chứ không nhòe đi.
Làm sao cho Form vừa trong suốt lài bị nhòe giống Win7 được


Return to “[VB] Ứng dụng - Form và Control”

Who is online

Users browsing this forum: No registered users and 1 guest