2011-12-05 110 views
2

我有一個自定義窗體,它沒有任何類型的邊框。我正在繪製自己的一些自定義邊框,而不是擴展到窗體的邊緣。相反,通過使用表單的透明屬性,此自定義繪製邊框之外的任何東西都是透明的。這留下了一小部分表單可用和可見。調整無邊界窗體的大小不同於遠邊的限制嗎?

我知道有大量的解決方案可以實現這一目標,並且我已經找到了實現這一目標的最佳方法。但是,此方法假定用戶將鼠標指向窗體的較遠邊緣。我需要限制它在不同的約束條件下作出反應(例如較小的矩形)。

這是我發現的代碼已經工作在一個下到了邊緣約束:

procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; 

.... 

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); 
const 
    EDGEDETECT = 7; //adjust to suit yourself 
var 
    deltaRect: TRect; //not really used as a rect, just a convenient structure 
begin 
    inherited; 
    if BorderStyle = bsNone then begin 
    with Message, deltaRect do begin 
     Left := XPos - BoundsRect.Left; 
     Right := BoundsRect.Right - XPos; 
     Top := YPos - BoundsRect.Top; 
     Bottom := BoundsRect.Bottom - YPos; 
     if (Top<EDGEDETECT)and(Left<EDGEDETECT) then 
     Result := HTTOPLEFT 
     else if (Top<EDGEDETECT)and(Right<EDGEDETECT) then 
     Result := HTTOPRIGHT 
     else if (Bottom<EDGEDETECT)and(Left<EDGEDETECT) then 
     Result := HTBOTTOMLEFT 
     else if (Bottom<EDGEDETECT)and(Right<EDGEDETECT) then 
     Result := HTBOTTOMRIGHT 
     else if (Top<EDGEDETECT) then 
     Result := HTTOP 
     else if (Left<EDGEDETECT) then 
     Result := HTLEFT 
     else if (Bottom<EDGEDETECT) then 
     Result := HTBOTTOM 
     else if (Right<EDGEDETECT) then 
     Result := HTRIGHT 
    end; 
    end; 
end; 

我怎麼會去改變邊界這個反應?例如,左邊和右邊應該在窗體中反應10個像素。標準形式矩形可能是(0, 0, 100, 100)但我想上面這個方法的(10, 3, 90, 97)

回答

5

範圍內工作,其實這將是有意義的定義,因爲 兩個常量,而不是唯一的EDGEDETECT您所需要的水平和垂直偏移量是不同的,寫它從無到有,但這裏是一個快速的補丁:

procedure TForm1.WMNCHitTest(var Message: TWMNCHitTest); 
const 
    EDGEDETECT = 17; //adjust to suit yourself // <- increased to suit outer offset 
var 
    deltaRect: TRect; //not really used as a rect, just a convenient structure 

    OuterRect: TRect;        // used as a rect 
begin 
    inherited; 
    if BorderStyle = bsNone then begin 
    with Message, deltaRect do begin 

    .. 
     else if (Right<EDGEDETECT) then 
     Result := HTRIGHT; 
    .. 

     OuterRect := BoundsRect;     // patch 
     InflateRect(OuterRect, -10, -3); 
     if not PtInRect(OuterRect, SmallPointToPoint(Message.Pos)) then 
     Message.Result := HTTRANSPARENT; 

    end; 
    end; 
end; 
+0

很不錯:D仍然可以使用一個小的調整,但看起來像會做的伎倆。這裏我從未見過的新事物是使用InflateRect,PtInRect和SmallPointToPoint。我相信我會把他們全部弄清楚,謝謝:D –

+0

@Jerry - 不客氣! > *「調整」*>是的,如果你有時間從頭開始寫,它會更好。 –

相關問題