2012-03-01 53 views
2

我正在創建一個用戶組件,在按鈕上添加一些額外的標籤(使用代碼),但當點擊標籤時,按鈕的onClick事件不會觸發。如何僅使TWinControl顯示並讓其父級處理所有鼠標事件?

爲這些標籤創建所有與鼠標相關的事件並將它們指向按鈕的事件是很麻煩和無效的。

是否有更簡單的方法讓按鈕處理所有那些鼠標事件,就像那些標籤不存在一樣?

實際情況要複雜得多,標籤是TJvLinkLabel用於簡單的標記呈現,所以只需在按鈕上繪製文本對我來說不是一個好選擇。

感謝您的善意幫助。

編輯: 更具體一點。有一個按鈕陣列,每個表格信息的表格記錄。它們每個都有2個TJvLinkLabel作爲頁眉和頁腳,它具有簡單標記的標題以顯示各個領域的信息和1個TJvLabel(alClient,shadow,wordwrap)來顯示主要描述。每個按鈕可以是不同的顏色,甚至有背景圖片,這就是爲什麼需要陰影才能將文本帶出。按鈕自己的標題始終設置爲空。

我其實只需要視覺效果(標記渲染,陰影),並且不需要這些標籤的任何交互。我只是想讓按鈕像沒有其他組件一樣託管。

當我搜索到stackoverflow時,我看到C#似乎將hittest設置爲false或類似,但我無法在Delphi中找到類似的設置。

編輯2: 更簡單地說,有沒有辦法讓父母(在這種情況下,按鈕)處理所有的鼠標消息,並不傳遞給它的孩子(在這種情況下標籤)。謝謝。

編輯3: 我已經遠遠地繼承了標籤類,並將Click,DblClick,MouseDown,MouseUp過程傳遞到按鈕並跳過其他事件。我想知道是否有更好的解決方案。謝謝。

+0

您是否在這些標籤上使用超鏈接?你想要處理那些人,按鈕或標籤。任何屏幕截圖的幫助我們可視化的機會? – 2012-03-01 17:14:32

+1

如果你不能分配OnClick的標籤..可能你可以創建TJvLinkLabel後代類,重寫'Click'到'parent.click',並使用它? – teran 2012-03-01 20:15:38

+0

@DavidHeffernan他們沒有使用超鏈接,我只希望標籤的視覺效果能夠替換原始單個素描標題。 – Justmade 2012-03-01 23:49:18

回答

3

請勿從TWinControl派生,或者如果這不可能處理所有鼠標事件並將它們傳遞給父項。你可以看看下面的一些鏈接:

Handling mouse events

你可以看看TWinControl的代碼:

TWinControl = class(TControl) 
protected 
    property DefWndProc: Pointer read FDefWndProc write FDefWndProc; 
    procedure MainWndProc(var Message: TMessage); 
public 
    procedure DefaultHandler(var Message); override; 

,並覆蓋要麼DefWndProc如果你的控制不是一個後代,或MainWndProc如果是。

+0

謝謝你的回答。我的按鈕組件從現有的按鈕類下降,這肯定是TWinControl後裔。兩個標籤控件也一樣。當它不是虛擬方法時如何覆蓋MainWndProc?以及如何將消息傳遞給父項?坦率地說,我不熟悉Message系統。 – Justmade 2012-03-02 01:46:23

+0

你可以訪問DefWndProc屬性(如果你是一個孩子)。在TWinControl的源代碼中查找它,並將該屬性更改爲指向您的函數的指針。 – Mihaela 2012-03-03 20:35:33

1

將標籤的Enabled屬性設置爲False

+0

感謝您的幫助。您的建議在TJvLinkLabel上運行良好。大!但是,TJvLabel變灰,仍然不響應onMouseDown(觸發按下的效果)。我認爲會有一種通用的方法來跳過鼠標事件的處理,所以我沒有提到TjvLabel。抱歉。 – Justmade 2012-03-02 00:08:28