2012-12-16 83 views
2

我有兩個100%重疊面板上的不同內容的窗體上。
默認情況下,第一個(靜態顯示信息)應該是可見的,但如果用戶將鼠標移動到兩個位置附近,則另一個(用戶交互)應該替換它 - 如果鼠標移開,它應該切換回來。
事情是這樣的:是否有像「Form1.MousePreview:= true」這樣的解決方法?

if (*the mouse is near*) then 
begin 
    Panel1.Hide; 
    Panel2.Show; 
end 
else 
begin 
    Panel2.Hide; 
    Panel1.Show; 
end; 

我的問題是:在哪裏可以捕捉鼠標移動?
每個組件都有自己的OnMouseMove處理程序 - 當然我可以將它們轉發給表單處理程序,但我寧願讓它更優雅一些(並且更易於維護)。
完美的解決方案就像Form1.MousePreview := true;

另一種解決方案是分配一個通用的處理程序,該處理程序可以轉換座標並調用表單處理程序;分配可以在FormCreate中完成。
但這並不像看起來那麼容易,因爲一個TImage已經擁有自己的鼠標事件處理程序。

我試過OnMouseEnterOnMouseLeave的兩個面板,但它沒有奏效; #1消失了,但#2沒有出現。我想這是因爲如果鼠標離開Panel2,它應該消失 - 但是如果它進入一個按鈕,它也會離開它。
這就是爲什麼我想使用基於座標的方法使檢查更可靠。

也許這兩個面板方法是完全錯誤的?

更新:是的,正如雷米所說的那樣。
我現在正在使用TJVPageList,因爲TPageControl具有可視選項卡。
PageList的OnMouseEnter處理程序設置一頁,OnMouseLeave設置另一頁;但是,一旦鼠標移動到PageList上,兩個頁面都會閃爍。 我曾嘗試將事件處理程序添加到每個頁面,但這沒有什麼區別。
我應該檢查全部OnMouseEnter/Leave事件來過濾掉PageList,這兩個頁面和坐在頁面上的所有組件?

另一個更新:我現在使用的是TPageControl,但行爲是類似的。
它不閃爍,但如果我將鼠標移動到TPageControl上,則根本不會顯示任何TTabSheet。
只有當我按下鼠標左鍵時,纔會顯示UI表單。如果我移開鼠標,另一張紙正常顯示。 (如果我按下鼠標左鍵,TJVPageList也會顯示UI頁面。)
我已經使用TPageControl和兩個TTabSheets的鼠標事件處理程序(輸入/離開)。

更新3: 完成它。 靜態面板/ TabSheet/JvStandardPage(#1)不得觸發OnMouseLeave處理程序。

+0

您可以通過將每個「TTabSheet」的「TabVisible」屬性設置爲false來關閉「TPageControl」的選項卡。 –

+0

非常感謝你 - 我正在TPageControl本身上尋找這個屬性。 – Pharaoh

回答

4

您所描述的內容可能更適合使用單個TPageControl而不是兩個TPanel控件。使用TPageControl自己的OnMouseEnter/Leave事件(或攔截CM_MOUSEENTER/LEAVE消息)根據需要切換TPageControl.ActivePage

+0

感謝提示,這比兩個面板要好得多。但它仍然不能按要求工作 - 請參閱編輯的答案 – Pharaoh

相關問題