저는 델파이 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;
보다 구체적으로이 컨트롤은 항목의 가로 (또는 세로) 목록 또는 실제로는 화살표입니다. 각 항목은 차례대로 다각형으로 그려지며 각 항목 주위의 공백은 아무 것도 아닌 것으로 간주됩니다 (배경). 항목 위로 마우스를 가져 가면 해당 항목을 강조 표시하고 해당 항목에 대한 다른 내부 참조를 수행합니다. 또한 개별 목록 항목에 대해서도 집중적으로 구현할 계획입니다. –