Lỗi không làm form trong suốt được!!

Liên hệ QC

huynhkimtien

Thành viên chính thức
Tham gia
6/3/07
Bài viết
51
Được thích
49
Giới tính
Nam
Nghề nghiệp
Kế toán
Cháo các bác em có sưu tầm 1 form và để làm cho nó trong suốt nhưng không hiểu tại sao em làm mãi mà không được, bác nào có cao kiến xin hãy giúp giùm em với. Em cảm ơn.
 

File đính kèm

Làm trong suốt form

Bạn hãy đặt đoạn code này vào module của form bạn cần làm trong suốt.
Mã:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" _
    (ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Const LWA_ALPHA = &H2&

Public hWnd As Long

Private Sub Transparent(bytOpacity As Byte)
    'bytOpacity : có giá trị từ 0-255
    bytOpacity = 192    ' variable keeping opacity setting
    hWnd = FindWindow("ThunderDFrame", Me.Caption)
    Call SetWindowLong(Me.hWnd, GWL_EXSTYLE, GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED)
    Call SetLayeredWindowAttributes(Me.hWnd, 0, bytOpacity, LWA_ALPHA)
End Sub

Sau đó bạn có thể tạo một nút lệnh, và gọi thủ tục Transparent và truyền giá trị từ 0 đến 255 xem sao.

Chúc bạn thành công.

Lê Văn Duyệt
 
Upvote 0
Bạn hãy đặt đoạn code này vào module của form bạn cần làm trong suốt.
Mã:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32" _
(ByVal hWnd As Long, ByVal crey As Byte, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
 
Private Const GWL_EXSTYLE = (-20)
Private Const WS_EX_LAYERED = &H80000
Private Const LWA_ALPHA = &H2&
 
Public hWnd As Long
 
[php] 
Private Sub Transparent(bytOpacity As Byte)
'bytOpacity : có giá trị từ 0-255
bytOpacity = 192 ' variable keeping opacity setting
hWnd = FindWindow("ThunderDFrame", Me.Caption)
Call SetWindowLong(Me.hWnd, GWL_EXSTYLE, GetWindowLong(Me.hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED)
Call SetLayeredWindowAttributes(Me.hWnd, 0, bytOpacity, LWA_ALPHA)
End Sub
 
Sau đó bạn có thể tạo một nút lệnh, và gọi thủ tục [B]Transparent[/B] và truyền giá trị từ 0 đến 255 xem sao.
 
Chúc bạn thành công.
 
Lê Văn Duyệt[/quote]
Mạn phép bác, em sửa lại code cho đúng, chứ để như thế mà lại dặt trong Module thì không chạy được
[php]
Public Sub Transparent(bytOpacity As Byte, FrmCaption as string)
    hWnd = FindWindow("ThunderDFrame", FrmCaption)
    Call SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) Or WS_EX_LAYERED)
    Call SetLayeredWindowAttributes(hWnd, 0, bytOpacity, LWA_ALPHA)
End Sub
[/php]
 
Lần chỉnh sửa cuối:
Upvote 0
Code của anh Duyệt đã nói là dặt trong module của Form mà, mình test OK
 
Upvote 0
Ồ, chết thật, từ trước tới nay tôi chỉ thấy nói là đặt trong Module hoặc đặt tỏng Form thôi chứ chưa thấy ai nói là đặt trong "Module của Form" nên tôi hiểu nhầm.
Nếu đoạn Code trên đặt trong Form thì cũng chạy OK.
Thắc mắc chút: Nếu đã đặt trong Form thì sao lại phải:
Public hWnd As Long rồi Me.hWnd (cái này mới nhìn cứ tưởng code của VB6)
 
Upvote 0
To: All,
Các bạn nên lấy ví dụ ở thread #3.

Lê Văn Duyệt
 
Upvote 0
Không làm form trong suốt được!!!

Đoạn code trên nếu dùng một mình thì chạy tốt nhưng nếu chèn vào file "Lam Form trong suot.xls" ở trên của em thì nó không có tác dụng. Em muốn form của mình lúc nào cũng ở trong vùng Desktop của Excel (như có trong file). Bác nào có cao kiến giải thích dùm em và chèn đoạn code của bác Duyệt vào có tác dụng được không ạ?

Cảm ơn các bác!
 
Upvote 0
Form trong suốt

Đoạn code trên nếu dùng một mình thì chạy tốt nhưng nếu chèn vào file "Lam Form trong suot.xls" ở trên của em thì nó không có tác dụng. Em muốn form của mình lúc nào cũng ở trong vùng Desktop của Excel (như có trong file). Bác nào có cao kiến giải thích dùm em và chèn đoạn code của bác Duyệt vào có tác dụng được không ạ?

Cảm ơn các bác!

OK, có gì đâu bạn nó chạy bình thường đó thôi.
 

File đính kèm

Upvote 0
Chương trình chạy bình thường, nhưng khi cho giá trị từ 0-225 thì không thấy có gì thay đổi cả. Độ trong suốt của form vẫn như ban đầu. Bạn có thể xem lại hộ mình được không?

Bạn có thể chèn thêm 1 Scrollbar để xác định giá trị của Transparent.
 
Upvote 0
Một cách điều chỉnh độ trong (Càng nhỏ càng trong suốt)
 

File đính kèm

Upvote 0
Không làm form trong suốt được!!!

Cảm ơn các bạn đã thảo luận sôi nổi trên topic này.
Em xin nhắc lại câu hỏi và nhờ các bạn giúp dùm nhé!

Đoạn code trên cua Anh Duyệt thì chạy tốt nhưng nếu chèn vào file "Lam Form trong suot.xls" ở trên của em thì nó không có tác dụng.
Em muốn form của mình lúc nào cũng ở trong vùng Desktop của Excel (như có trong file). Bác nào có cao kiến giải thích dùm em và chèn đoạn code của bác Duyệt vào có tác dụng được không ạ?

Cảm ơn các bạn!
(Em có file đính kèm hướng dẫn cụ thể hơn)
 

File đính kèm

Upvote 0
Trong Sub DisplayLabels có dư 1 đoạn code hình như của 1 sub khác thì phải, đã bị xoá 1 End Sub và 1 Sub ...()
Đó là đoạn này:
PHP:
Dim Res As Long
Dim ChildHWnd As Long
Dim ErrNum As Long
ParentHWnd = ExcelDeskHWnd
ChildHWnd = UserFormHWnd
Res = SetParent(hWndChild:=ChildHWnd, hWndNewParent:=ParentHWnd)
SetForegroundWindow UserFormHWnd
Me.Repaint

Xoá đi hoặc đánh dấu thì OK.
 
Upvote 0
Một cách điều chỉnh khác.
Sau bạn không làm thêm một UF nữa để điều chỉnh lại cho thích hợp nhỉ! khi kéo thả đến có là làm cho UF tàn hình luôn không còn thấy nút của thanh trượt khó sử dụng lém! thêm UF phụ để điều khiểu thì dể dàng hơn.
 
Upvote 0
Không làm form trong suốt được!!

Trong Sub DisplayLabels có dư 1 đoạn code hình như của 1 sub khác thì phải, đã bị xoá 1 End Sub và 1 Sub ...()
Đó là đoạn này:
PHP:
Dim Res As Long
Dim ChildHWnd As Long
Dim ErrNum As Long
ParentHWnd = ExcelDeskHWnd
ChildHWnd = UserFormHWnd
Res = SetParent(hWndChild:=ChildHWnd, hWndNewParent:=ParentHWnd)
SetForegroundWindow UserFormHWnd
Me.Repaint
Xoá đi hoặc đánh dấu thì OK.


Nếu bỏ các dòng lệnh trên thì form nó sẽ không nằm trong vùng Desktop của Excel (có nghĩa bạn kéo form đi chổ nào cũng được). ý mình thì ngược lại mình muốn nó nằm trong vùng nội dung của Excel thôi (khi bạn thu nhỏ hay phóng to thì form ấy vẫn năm trong vùng của Excel không ra ngoài được).

Bạn nào có cao kiến xin hãy giúp mình với.
 
Upvote 0
Để hiểu rõ câu hỏi của bạn thật khó. Ngay từ những bài đầu mình không hiểu được "trong vùng Desktop của Excel". Bạn có thể nói rõ hơn được không. Bạn có nguồn tài liệu nào nói như vậy không?
Xưa nay, mình hiểu Destop là cửa sổ chính của Window chứ không phải trong bất cứ phần mềm nào khác.
 
Upvote 0
Không làm form trong suốt được!!

Để hiểu rõ câu hỏi của bạn thật khó. Ngay từ những bài đầu mình không hiểu được "trong vùng Desktop của Excel". Bạn có thể nói rõ hơn được không. Bạn có nguồn tài liệu nào nói như vậy không?
Xưa nay, mình hiểu Destop là cửa sổ chính của Window chứ không phải trong bất cứ phần mềm nào khác.


Lâu quá mình không nhớ là đã sưu tập tài liệu ở đâu nhưng để dể hiểu thì vùng Desktop của Excel là vùng nhập liệu (là vùng soạn thảo). Để chứng minh điều này thì bạn hãy mở file của mình lên và thử kéo form đó lên thanh Menu bar hoặc thanh Status bar thử xem (tất nhiên là không được rồi) hoặc bạn hãy Restore (thay đổi kích thước Excel) và kéo form ra ngoài Excel xem (tất nhiên là không được rồi).

Bước trên thì mình đã thực hiện được rồi, bây giờ chỉ còn 1 bước là làm form trong suốt thôi nhưng mình đã thử hết mọi cách và kết quả vẫn không được. Nên vì thế mới nhờ đến các bạn giúp đỡ.
 
Upvote 0
Code của bạn không phải là không có tác dụng mà nó xác định sai cửa sổ. Đáng lẽ nó làm trong suốt UserForm nó lại nhầm sang cửa sổ chính của Appl. Bạn cứ kéo Form của bạn trùm lên hình màu tím của bạn rồi nhấn nút mà xem. Nó lại làm trong suốt cái hình màu tím đó. Về khả năng sử dụng hàm API của mình còn hạn chế lắm nên không sửa được code cho bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom