Trang 1 trên 1

Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Sáu 28/03/2008 8:19 pm
gửi bởi vinhphuoc91
Thủ thuật: Form có hình dạng theo một hình ảnh bất kỳ
Tác giả: Nobi
Mô tả: Làm cho form có hình dạng theo 1 ảnh bất kỳ


Thêm vào Form 1 picturebox.
Set thuộc tính BorderStyle của Form = 0 (None)
Thêm vào chương trình đoạn mã sau :

Mã: Chọn hết

  1. Option Explicit
  2.  
  3. Private Const HTCAPTION = 2
  4. Private Const WM_NCLBUTTONDOWN = &HA1
  5. Private Declare Function ReleaseCapture Lib "user32" () As Long
  6. Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  7.  
  8. Private Const RGN_OR = 2
  9. Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
  10. Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  11. Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long
  12. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  13. Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  14. Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
  15.  
  16. Private Function MakeRegion(picSkin As PictureBox) As Long
  17.     Dim x As Long, y As Long, StartLineX As Long
  18.     Dim LineRegion As Long
  19.     Dim FullRegion As Long
  20.     Dim TransparentColor As Long
  21.     Dim InFirstRegion As Boolean
  22.     Dim InLine As Boolean
  23.     Dim hdc As Long
  24.     Dim picWidth As Long
  25.     Dim picHeight As Long
  26.  
  27.     hdc = picSkin.hdc
  28.     picWidth = picSkin.ScaleWidth
  29.     picHeight = picSkin.ScaleHeight
  30.  
  31.     InFirstRegion = True: InLine = False
  32.     x = y = StartLineX = 0
  33.     TransparentColor = RGB(255, 0, 255) 'Chọn màu muốn lọai bỏ trong picture, ở đây là màu hồng, hoặc lấy màu ở pixel đầu tiên
  34.     'TransparentColor = GetPixel(hdc, 0, 0)
  35.  
  36.     For y = 0 To picHeight - 1
  37.         For x = 0 To picWidth - 1
  38.             If GetPixel(hdc, x, y) = TransparentColor Or x = picWidth Then
  39.                 If InLine Then
  40.                     InLine = False
  41.                     LineRegion = CreateRectRgn(StartLineX, y, x, y + 1)
  42.  
  43.                     If InFirstRegion Then
  44.                         FullRegion = LineRegion
  45.                         InFirstRegion = False
  46.                     Else
  47.                         CombineRgn FullRegion, FullRegion, LineRegion, RGN_OR
  48.                         DeleteObject LineRegion
  49.                     End If
  50.                 End If
  51.             Else
  52.                 If Not InLine Then
  53.                     InLine = True
  54.                     StartLineX = x
  55.                 End If
  56.             End If
  57.         Next
  58.     Next
  59.      MakeRegion = FullRegion
  60. End Function
  61.  
  62. Private Sub Form_DblClick()
  63.     Unload Me
  64. End Sub
  65.  
  66. Private Sub Form_Load()
  67.     Picture1.ScaleMode = 3
  68.     Picture1.AutoSize = True
  69.     Picture1.Visible = False
  70.     'Picture1.Picture = LoadPicture("C:\skin.bmp") 'Ðường dẩn file ảnh cần thiết
  71.     'If Picture1.Picture <> 0 Then
  72.         Me.Picture = Picture1.Picture
  73.         SetWindowRgn Me.hwnd, MakeRegion(Picture1), True
  74.     'End If
  75. End Sub
  76.  
  77. Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  78.     If Button = vbLeftButton Then
  79.         ReleaseCapture
  80.         SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&
  81.     End If
  82. End Sub

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: CN 06/04/2008 8:04 pm
gửi bởi hoangluyen
Vinhphuoc91 này!
Mình đã sử dụng phưong pháp làm mất nền, chỉ còn lại ảnh. Vậy cái này không biết có phải là bỏ nền chỉ còn ảnh không. Vì mình thấy phương pháp làm mất nền chỉ còn lại ảnh sẽ rất bất tiện ở hai chỗ.
Thứ nhất: Nếu mà mình muốn làm đổ bóng form thì nó chỉ đổ bóng theo hình vuông của form chứ nó không theo hình dạng ảnh.
Thứ Hai : Nếu mình muốn form load sáng dần thì nó sẽ bị xung đột hiệu ứng. Như vậy là không thể được đúng ko?
Bạn có phưong pháp mới gì không?

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: CN 06/04/2008 8:22 pm
gửi bởi giongto35
Thứ Hai : Nếu mình muốn form load sáng dần thì nó sẽ bị xung đột hiệu ứng. Như vậy là không thể được đúng ko?

Hình như cách nobi ko bị xung đột với cái này vi cách của nobi ko dùng setlayeredwindow
Đổ bóng là sao nhỉ ?

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Ba 08/04/2008 12:30 pm
gửi bởi hoangluyen
Tức là Shardow của form ấy.
Nếu bạn đã sử dụng Corel Draw 12 hoặc photoshop 7.0 thì bạn thấy nó có hình lông chim hay quả cầu bay đểu có shardow đấy thôi. Em thấy thích lắm nhưng ko bít làm thế bào cả.

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Ba 08/04/2008 12:48 pm
gửi bởi hdn
Để đổ bóng cho form (bất kì hình dạng nào) bạn có thể làm như sau:
Khai báo:

Mã: Chọn hết

  1.  
  2. Private Declare Function GetClassLong Lib "user32.dll" Alias "GetClassLongA" _
  3.   (ByVal hWnd As Long, ByVal nIndex As Long) As Long
  4.  
  5. Private Declare Function SetClassLong Lib "user32.dll" Alias "SetClassLongA" _
  6.   (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
  7.  
  8. Private Const GCL_STYLE = -26
  9. Private Const CS_DROPSHADOW = &H20000
  10.  
  11. Public Sub DropShadow(hWnd As Long)
  12.     SetClassLong hWnd, GCL_STYLE, GetClassLong(hWnd, GCL_STYLE) Or CS_DROPSHADOW
  13. End Sub
  14.  

Cách dùng

Mã: Chọn hết

  1.  
  2. Private Sub Form_Load()
  3.     DropShadow Me.hWnd
  4. End Sub
  5.  


Đổ bóng cho cái form_có_hình_dạng_bất_kì mà vinhphuoc đã up ở trên:
bong.png

Dobong.rar
(155.15 KiB) Đã tải 1410 lần

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Ba 08/04/2008 1:17 pm
gửi bởi hoangluyen
Đúng rồi. Bác có tuyệt chiêu hay quá.Rất vui làm quyen với bác.
Cảm ơn bác nhiều nhé
Em thấy thích cái này rồi đấy. Em đã giải quyết được thắc mắc này lâu lắm rồi.
Haha thích quá.

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Tư 09/04/2008 12:06 pm
gửi bởi hdn
:)
Tuy nhiên vẫn chưa đổi màu + độ "to" cho bóng đc :|

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Năm 10/04/2008 8:44 am
gửi bởi onlysoft
Tốc độc của vỉnh phước làm, cái trên lần trước tui hỏi nobi, cái giưới của thành trinick, cái của trinick thì nhanh nhưng ko đáp ứng được nhu cầu làm skin, vì nó đòi ảnh GIF gọt sẳn, cái của nobi thì đáp ứng được nhưng quá chậm :((

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Sáu 17/10/2008 1:44 pm
gửi bởi kysudat
Cám ơn bạn rất nhiều.
Bạn cho mình hỏi làm cách nào mình có thể tạo một tấm ảnh có nền trong suốt như vậy được

Minh đạt

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Tư 19/11/2008 8:52 pm
gửi bởi tuoi tho
Hay quá.....nhưng cho mình hởi...hơi tham một tý...có cách nào làm cho form trở nên trong suốt không vậy?????

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Hai 17/05/2010 10:01 pm
gửi bởi tidus
cho mình hỏi , làm thế nào để hiện textbox, label,... trên ảnh đó,

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Ba 18/05/2010 8:14 am
gửi bởi vietteiv
thì... vẽ cái textbox với label lên ảnh đó là xong :D

Re: Form có hình dạng theo một hình ảnh bất kỳ

Đã gửi: T.Ba 15/11/2011 1:21 pm
gửi bởi dantri.com
tại sao mình tải project mẫu thì ok
copy code sang 1 project khác thì lại không được :((