2016-02-17 17 views
0

我有一個可調節大小的表單,可以水平調整大小,但不是垂直調整大小(我已將constraints.minwidth設置爲表單的初始寬度,我希望不更改爲當光標位於右邊框或角落的左側時,可以調整光標的大小;光標只能在頂部或底部邊框上方更改,有一種解決方法,它不使用VCL樣式:http://codeverge.com/embarcadero.delphi.vcl.using/how-to-hide-resize-mouse-cursor/1071845。但是,我有相同的要求除了我正在使用VCL樣式(Luna),並且在使用樣式並且鏈接中的示例不起作用時,看起來WM_NCHITTEST未啓動。防止在調整大小和使用德爾菲樣式時更改光標

如何防止遊標更改爲調整大小遊標當使用VCL風格時?

+0

它被觸發它只是永遠不會到達你的處理程序。您將不得不調查樣式引擎源並查找它在哪裏偵聽或掛接WM_NCHITTEST –

回答

1

樣式掛鉤消息從WndProc分支TWinControl。如果樣式掛鉤報告處理了消息,則返回WndProc並且不調度該消息。這就是爲什麼表單樣式的WM_NCHITTEST消息處理程序在樣式化時未被觸發的原因。

因此,一種選擇是覆蓋表格的WndProc

type 
    TTestForm = class(TForm) 
    protected 
    procedure WndProc(var Message: TMessage); override; 
    ... 

procedure TTestForm.WndProc(var Message: TMessage); 
begin 
    inherited; 
    if (Message.Msg = WM_NCHITTEST) and (Message.Result in [HTLEFT, HTRIGHT]) then 
    Message.Result := HTBORDER; 
end; 


另一種選擇是使用使用的樣式鉤重寫消息的處理的後裔。

type 
    TTestForm = class(TForm) 
    ... 
    end; 

implementation 

uses 
    themes; 

type 
    TTestFormStyleHook = class(TFormStyleHook) 
    protected 
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; 
    end; 

procedure TTestFormStyleHook.WMNCHitTest(var Message: TWMNCHitTest); 
begin 
    inherited; 
    case Message.Result of 
    HTLEFT, HTRIGHT: Message.Result := HTBORDER; 
    HTTOPLEFT, HTTOPRIGHT: Message.Result := HTTOP; 
    HTBOTTOMLEFT, HTBOTTOMRIGHT: Message.Result := HTBOTTOM; 
    end; 
end; 

initialization 
    TCustomStyleEngine.RegisterStyleHook(TTestForm, TTestFormStyleHook); 

end.