部落格觀察

聯絡我

Software

最新回應

1.VBA不像VB6或是.NET功能那麼強大,VB6及VS.NET都有Icon屬性可以直接使用圖示

快照-20097184350

 

 

 快照-20097184524

2.設定Icon屬性後,表單上就會出現Icon圖示了

快照-2009718477 快照-20097184813

 

3.VBA要達到此功能就得靠API了,SendMessage 是常用的API之一,當然不可少。

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

4.還得靠 DrawMenuBar 來重繪。

Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long

5.當然也少不了用 FindWindow 來取得視窗的handle value

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

因為VBA功能沒有hWnd屬性,所以得靠 FindWindow 來取得handle value,但是VB6跟VS.Net都有該屬性,但這個屬性只能看自己的handle,要看別人的 handle 還是得靠 FindWindow 的啦。

快照-20097191551  2

6.最後搭配 Image1 控制項存放圖片,再將Image1.Visible屬性設為False

Call ChangeIcon(hWnd, Image1.Picture.Handle)

 

 

 

7.完整範例如下,執行後就會出現跟第2項一樣的畫面

Option Explicit
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
Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
'發送給某個視窗來返回與某個窗口有關連的大圖標或小圖標的handle
Private Const WM_SETICON = &H80
'圖示SIZE
Private Const ICON_SMALL = 0&
Private Const ICON_BIG = 1&
Dim hWnd As Long
Private Sub UserForm_Initialize()
    '取的handle值
    hWnd = FindWindow(vbNullString, Me.Caption)
    '呼叫副程式改變圖示
    Call ChangeIcon(hWnd, Image1.Picture.Handle)
End Sub
'改變圖示
Private Sub ChangeIcon(ByVal hWnd As Long, Optional ByVal hicon As Long = 0&)
    '變更大圖示與小圖示
    SendMessage hWnd, WM_SETICON, ICON_SMALL, ByVal hicon
    SendMessage hWnd, WM_SETICON, ICON_BIG, ByVal hicon
    '重繪
    DrawMenuBar hWnd
End Sub

 

8.還有其他方法可以達成上述功能,請參考http://chijanzen.net/wp/?p=281

9.範例下載:定義自訂表單圖示.rar

10.上述的API也可以用VB.Net或C#.NET語言上使用

 

新手發帖請多包涵


回應

目前沒有回應.

*標 題:

*姓 名:

 電子郵件: (將不會被顯示)

 個人網頁:

*回應

登入後使用進階評論

Please add 7 and 1 and type the answer here: