2012-02-29 26 views
2

我有一個hierarchical flexgrid控件和ToolTipText屬性集,當我從源代碼運行時,工具提示顯示爲應該顯示。但是,當我編譯它並以這種方式運行時,工具提示不會顯示。Tooltip只顯示從源代碼運行時

我試圖刪除任何收聽MouseMove的東西,希望能解決它,當我添加一些代碼將工具提示文本放入消息框時,它似乎設置正確。任何人都可以想到爲什麼會發生這種情況?


更新:當我將網格託管在另一個用戶控件中時,出現問題。例如:make container.ctl,它只是一個空白的控件,但是ControlContainer = True。然後製作gridholder.ctl,它是container.ctl中的mshfg。最後,將gridholder.ctl嵌入到某種形式中。 flexgrid上的工具提示不會顯示出來。

我很感興趣,看看如何重現性,這是...

+0

它在我編譯時顯示給我。試試這個給我。創建一個新項目。在一個新的表格中添加一個網格並設置一個工具提示並直接編譯它。現在測試EXE文件。這是否適用於此? – 2012-03-01 19:03:56

+0

@SiddharthRout:是的一個簡單的測試程序沒有這個缺陷。所以在我的程序中必須有其他的東西引起這個,但是我不知道該找什麼。 – Xodarap 2012-03-01 19:07:50

+0

程序有多大?您可以壓縮包含網格的表單並將其上傳到wikisend.com,然後在此分享鏈接。我不介意看看它。 :) – 2012-03-01 19:09:53

回答

0

了一些研究之後,我發現我的想法是根本問題。您的用戶控件沒有實現控件與之交互的任何方法。用戶控件是容器控件需要實現擴展器功能。到目前爲止,這兩個鏈接是我發現的最好的。

http://www.justvb.net/obook/ch7.htm#UsingtheExtenderObject

http://msdn.microsoft.com/en-us/library/aa733622(v=vs.60).aspx

+0

我不確定你的意思。我應該讓container.ctl成爲「Extender」對象?我怎麼做? – Xodarap 2012-03-02 15:26:29

+0

我並不確定如何實施。不是我曾經工作過的東西。我很好奇,所以我打算在這個週末花一些時間。 – UnhandledExcepSean 2012-03-02 16:55:46

2

我還沒有找到這個問題的解決方法,但我有爲什麼它的一些測試之後發生的事情,並加強通過一些在WinDbg中VB6的運行時代碼的一個更好的主意。

第一個有趣的事情是,VB6不使用Windows提供的標準工具提示顯示機制。例如,它不使用WM_NOTIFY消息來顯示/隱藏工具提示或documentation explaining how tooltips work in Windows中描述的任何其他「標準」工具提示支持。

相反,VB6運行時有自己的管理和顯示工具提示的方式。原則上,它在某些方面類似於處理工具提示的標準Windows方式,但在很多方面也有所不同。

的VB6如何做提示細目:

  • 當VB6程序啓動,運行時使用SetWindowsHookEx安裝一個鼠標鉤子程序的主線程。

  • 鼠標鉤截取發送到節目所有的鼠標消息,特別是所有WM_MOUSEMOUSE消息

  • 每當鼠標鉤子運行時,它調用在VB6運行時的內部方法來獲取對象指針( HCTL)鼠標當前位於頂部的控件。請注意,這是一個實際的COM接口指針,而不是一個窗口句柄。

  • 它將HCTL轉換爲相應的窗口句柄(HWND)。

  • 它檢查鼠標位置是否在該窗口的矩形內。

  • 如果是這樣,它將檢索控件的ToolTipText屬性。如果這不是空的,它會創建一個工具提示窗口,並在延遲700毫秒後顯示工具提示。

與MSHFlexGrid中的問題(和我想象中不屬於標準VB6控件其他控件)是,當你將鼠標懸停在控制,這是一個自定義的容器內這個代碼不檢索正確的HCTL。

在這種情況下,代碼將檢索自定義容器的HCTL,而不是MSHFlexGrid本身的HCTL。因此,它將檢索容器的ToolTipText屬性(這是空的),而不是網格的ToolTipText,因此不會顯示工具提示。

我不知道究竟爲什麼做到這一點,因爲在你的問題的評論中指出,所有這一切,如果你使用的PictureBox爲你的容器正常工作。

我懷疑PictureBox有代碼來處理這是正確的,當您創建自己的容器時不包括在內。

我會用實際的解決方法更新此答案,如果我能找到答案。我現在能想到的唯一的事情就是以某種方式「同步」你的容器的的ToolTipText財產與電網的的ToolTipText財產,這樣,當VB6請求容器的的ToolTipText,它將返回電網的ToolTextTip的價值財產代替。

但說起來容易做起來難,因爲ToolTipText是擴展器屬性,擴展器屬性優先於您自己編寫的具有相同名稱的屬性。

+0

謝謝,我會看看我能用這個做什麼 – Xodarap 2012-03-13 22:07:02