2012-05-13 79 views
4

我在Delphi XE2構建自定義控制(從TCustomControl繼承)(和曾在我的其他控制這個問題),並在設計的時候,我無法點擊他們。我知道這與鼠標捕獲有關,捕捉鼠標事件並在設計時間內處理它們的方式與運行時間不同,但我不知道如何適當地適應這種情況。換句話說,在我能想到的衆多解決方案中,我無法確定哪一個是適當的(或最有效的)方法。無法單擊設計時自定義控件

我確定一定有一些非常簡單的標準,最有可能利用ControlStyleCreateParams但不知道是什麼。

在這個特定的控制(我沒有看到在這個問題上的模式),我正在捕獲郵件,包括WM_NCHITTESTWM_LBUTTONDOWN。在設計階段,控件100%處於活動狀態,就像它是運行時一樣,點擊時則代之以執行運行時代碼。

我有一種感覺它在我的命中測試的消息處理程序,所以這裏的代碼(有些東西重命名):

procedure TMyCustomControl.WMNCHitTest(var Message: TWMNCHitTest); 
var 
    P: TPoint; 
    Poly: TPoints; 
    X: Integer; 
    I: TMyCollectionItem; 
    Ch: Bool; //Need to improve invalidation 
begin 
    Ch:= False; 
    P:= ScreenToClient(Point(Message.Pos.X, Message.Pos.Y)); 
    for X := 0 to Items.Count - 1 do begin 
    I:= Items[X]; 
    Poly:= I.Points; 
    FMouseIndex:= -1; 
    FMouseState:= bmNone; 
    if PointInPolygon(P, Poly) then begin //checks if point is within polygon 
     FMouseIndex:= X; 
     FMouseState:= bmHover; 
     Ch:= True; 
     Break; 
    end; 
    end; 
    if Ch then Invalidate; 
end; 

,也是我控制的構造(剝離):

constructor TMyCustomControl.Create(AOwner: TComponent); 
begin 
    inherited; 
    ControlStyle:= ControlStyle - [csDesignInteractive]; 
end; 
+0

更具體地,這種控制是物品,或實際上箭頭的水平(或垂直的)列表。每個項目被一個接一個地繪製成多邊形,並且每個項目周圍的空間都被視爲無(背景)。當將鼠標懸停在項目上時,我會突出顯示該項目(並對該項目執行其他內部參考)。我還計劃將重點放在單個列表項目上。 –

回答

6

但你當然是對的。您在WM_NCHITTEST處理程序中沒有返回任何內容。你的Mmessage.Result是'0'(HTNOWHERE),當你的處理程序被調用,而你沒有分配任何東西給它。

要麼在某個時間點撥打inherited,要麼執行您的邏輯並返回(設置Message.Result)HTCLIENT,以獲得您認爲是控件內部的點。

這一個已經在運行時所需的行爲,可以包括設計時檢查(但我猜你應該做所有計算的一個原因):

if csDesigning in ComponentState then 
    Msg.Result := HTCLIENT; 
+0

+1'csDesigning'奏效了 - 我知道這是類似的東西,但我一直在尋找在'ControlState'而不是'ComponentState'這就是爲什麼我找不到我的答案開始。謝謝! –

5

正式的方式支持鼠標在設計階段的互動是以對消息CM_DESIGNHITTEST的非零結果進行響應。該組件將接收正常的鼠標消息。

+0

AFAICS CM_DESIGNHITTEST發送控制返回HTCLIENT只有當WM_NCHITTEST。順便說一句,我不太明白這是如何工作的,通過查看VCL源代碼,它也沒有記錄。我爲測試控件返回0,並且無法觀察到任何不同的行爲。 –

+0

你並不需要處理'WM_NCHITTEST',讓默認的處理程序管理爲你。大多數控件不需要支持設計時的互動,這樣他們就不會爲'CM_DESIGNHITTEST'迴應,但也有少數本地控制做的,比如那些允許的,而不是使用對象檢查列的視覺尺寸,例如。 –

+0

更多關於這個控件在我的問題的評論中是什麼... –

相關問題