2012-05-13 4 views
4

저는 델파이 XE2에서 (TCustomControl에서 상속받은) 사용자 정의 컨트롤을 구축하고 있습니다. (그리고 다른 컨트롤에서이 문제가 발생했습니다.) 디자인 타임에는 클릭 할 수 없습니다. . 나는 그것이 마우스 캡처와 관련이 있고, 마우스 이벤트를 잡아서 런타임보다 디자인 타임에 다르게 처리한다는 것을 알고 있지만, 이것을 제대로 수용하는 방법을 모른다. 다른 말로하면 생각할 수있는 많은 작업 방식 중 어느 것이 적절한 (또는 가장 효율적인) 방식인지 결정할 수 없습니다.디자인 타임에 사용자 정의 컨트롤을 클릭 할 수 없습니다.

여기에는 매우 간단한 표준이 있어야하며, 아마도 ControlStyle 또는 CreateParams을 사용하고 있지만 무엇을 모를 것입니다.

이 특정 컨트롤에서는 (그리고이 문제의 패턴을 보지 못했습니다.) 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를 반환하십시오 (Message.Result를 설정하십시오) HTCLIENT.

이미 실행시에 원하는 동작의 그것은, 당신은 디자인 타임 체크를 포함 할 수 있습니다 (하지만 난 당신이 이유를 위해 모든 계산을해야 추측) :

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

+1'csDesigning'이 트릭을 만들었습니다. 저는 그게 뭔가라는 것을 알았지 만 ComponentState보다는 ControlState를보고 있었기 때문에 저는 처음부터 답을 찾을 수 없었습니다. 감사! –

5

마우스를 지원하는 공식적인 방법을 디자인 타임에 상호 작용은 CM_DESIGNHITTEST 메시지에 대해 0이 아닌 결과로 응답하는 것입니다. 구성 요소는 정상적인 마우스 메시지를 수신합니다.

+0

AFAICS CM_DESIGNHITTEST는 컨트롤에서 WM_NCHITTEST에 대해 HTCLIENT를 반환하는 경우에만 보내집니다. BTW, VCL 소스를 살펴봄으로써 이것이 어떻게 작동하는지 이해하지 못했습니다. 또한 문서화되지 않았습니다. 나는 테스트 컨트롤을 위해 0을 돌려줬고 어떤 다른 행동도 관찰 할 수 없었다. –

+0

당신은'WM_NCHITTEST'를 처리 할 필요가 없으며, 디폴트 처리기가 그것을 처리하도록합니다. 대부분의 컨트롤은 디자인 타임 상호 작용을 지원할 필요가 없으므로 CM_DESIGNHITTEST에 응답하지 않지만 Object Inspector를 사용하는 대신 시각적으로 열의 크기를 조정할 수있는 컨트롤과 같은 네이티브 컨트롤이 있습니다. –

+0

내 질문에이 컨트롤이 무엇인지에 대해 자세히 설명합니다. –