我在Delphi XE2構建自定義控制(從TCustomControl
繼承)(和曾在我的其他控制這個問題),並在設計的時候,我無法點擊他們。我知道這與鼠標捕獲有關,捕捉鼠標事件並在設計時間內處理它們的方式與運行時間不同,但我不知道如何適當地適應這種情況。換句話說,在我能想到的衆多解決方案中,我無法確定哪一個是適當的(或最有效的)方法。無法單擊設計時自定義控件
我確定一定有一些非常簡單的標準,最有可能利用ControlStyle
或CreateParams
但不知道是什麼。
在這個特定的控制(我沒有看到在這個問題上的模式),我正在捕獲郵件,包括WM_NCHITTEST
和WM_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;
更具體地,這種控制是物品,或實際上箭頭的水平(或垂直的)列表。每個項目被一個接一個地繪製成多邊形,並且每個項目周圍的空間都被視爲無(背景)。當將鼠標懸停在項目上時,我會突出顯示該項目(並對該項目執行其他內部參考)。我還計劃將重點放在單個列表項目上。 –