FIX: 當您使用 SendMessage 與 TB_GETIMAGELIST 若要取得 ImageList 控點,請在 Windows XP 時,您不會取得正確的控制代碼

文章翻譯 文章翻譯
文章編號: 811415 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

徵狀

您可以使用 SendMessage 從 Microsoft Windows 通用控制項 6.0 (Mscomctl.ocx) 中的各種控制項取得影像控點。利用 SendMessage 您可以傳遞 TB_GETIMAGELIST、 LVM_GETIMAGELIST、 TVM_GETIMAGELIST 或取得 imagelist 控點的工具列、 在清單檢視、 樹狀檢視,TCM_GETIMAGELIST 及 TabStrip 控制]。

不過,當您這麼做在執行 Windows XP 的電腦上,會傳回錯誤的控制代碼。如果您呼叫其他 API,並傳遞這個控制代碼這些 API 呼叫將無法正常運作。

發生的原因

之所以發生這個問題,是因為 Windows XP 和 Mscomctl.ocx 載入兩個不同版本的 Comctl32.dll 所不相容。

解決方案

支援的 Hotfix 現在可以從 Microsoft,但它只用來修正本文所述的問題。僅適用於發生此特定問題的系統。此 Hotfix 可能會接受其他測試。因此,如果您不會嚴重影響這個問題,我們建議您等候下一個的 Visual Studio 6.0 Service Pack 包含此 Hotfix。

如果要立即解決這個問題,洽詢 Microsoft 技術支援部以取得此修正程式。如需 Microsoft 產品支援服務電話號碼及支援成本的相關資訊的完整清單,請造訪下列 Microsoft 網站]:
http://support.microsoft.com/default.aspx?scid=fh;EN-US;CNTACTMS
附註 在特殊情況下通常會因支援電話所產生的費用可能就不收取如果 Microsoft 支援人員認為某特定更新程式可以解決您的問題。平常的支援成本將會套用到其他支援問題是所做不限定特定有問題的更新程式。

此修正程式的英文版具有檔案屬性 (或更新) 中如下表所列。這些檔案的日期和時間為 Coordinated Universal Time (UTC)。當您檢視檔案資訊時,會將它轉換為當地時間。若要到 UTC 與當地時間差異使用 [中日期] 和 [時間] 工具,在 [控制台] 中的 [時區] 索引標籤]。
   Date         Time   Version   Size       File name
   -----------------------------------------------------
   13-Dec-2002  00:18  6.0.97.1  1,062,160  Mscomctl.ocx

狀況說明

Microsoft 已確認這是在本文開頭所列之 Microsoft 產品中的有錯誤。

其他相關資訊

重製行為的步驟

如果要使用 Toolbar 控制項來重現問題,請依照下列步驟執行:
  1. 啟動新的 Visual Basic 6.0 標準 EXE 專案。依照預設值,會建立 Form1。
  2. 按一下 [專案] 功能表 的元件。在 [元件] 對話方塊加入至 Microsoft Windows 通用控制項 6.0 參考。
  3. 將一個 ImageList (ImageList1) 的控制項]、 [工具列 (Toolbar1) 控制項] 和 [一個 指令按鈕 (Command1) 加入 Form1。
  4. ImageList] 控制項上按一下滑鼠右鍵,然後按一下 [影像] 索引標籤新增至 [ImageList 的兩個影像控制]。
  5. Add the following code to Form1:
    Option Explicit
    
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
    Private Declare Function GetImageCount Lib "comctl32" Alias "ImageList_GetImageCount" (ByVal p As Long) As Long
    Private Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal cmd As Long) As Long
    
    
    Private Const WM_USER = &H400
    Private Const TB_GETIMAGELIST = WM_USER + 49
    Private Const GW_CHILD = 5
    
    Private Sub Command1_Click()
        Dim hImageList As Long, hChild As Long
        
        hChild = GetWindow(Toolbar1.hwnd, GW_CHILD)
        
        hImageList = SendMessage(hChild, TB_GETIMAGELIST, 0, 0)
        MsgBox "Image Count = " & GetImageCount(hImageList)
    End Sub
    
    Private Sub Form_Load()
        Set Toolbar1.ImageList = ImageList1
        Toolbar1.Buttons.Add , , "Button 1"
        Toolbar1.Buttons.Add , , "Button 2"
        Toolbar1.Buttons(1).Image = 1
        Toolbar1.Buttons(2).Image = 2
    End Sub
    
  6. 執行該應用程式,然後按一下 [Command1影像計數] 文字方塊包含 0。套用此 Hotfix 之後影像計數正確會傳回成 2 中。

屬性

文章編號: 811415 - 上次校閱: 2014年2月27日 - 版次: 2.3
這篇文章中的資訊適用於:
  • Microsoft Visual Basic 6.0 Enterprise Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • the operating system: Microsoft Windows XP
關鍵字:?
kbnosurvey kbarchive kbmt kbvbp600fix kbfix kbqfe KB811415 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:811415
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com