2011-12-05 1 views
2

私はボーダーのタイプを持たないカスタムフォームを持っています。代わりにフォームの遠端にまで及ばない私の独自の境界を描画しています。代わりに、このカスタム描画された枠線の外にあるものは、フォームの透明なプロパティを使用することで透明になります。これにより、フォームのごく一部が使用可能になり、表示されます。遠端とは異なる制約からフチ無しフォームのサイズを変更しますか?

これを達成するためのソリューションがたくさんあることは知っていますが、私はすでにこれに最も適した方法を見つけました。ただし、このメソッドは、ユーザーがフォームの遠端にマウスを向けていることを前提としています。私はそれを異なる制約(例えば、より小さなサイズのrect)内から反応するように制限する必要があります。ここで

は、すでに次のツー・エッジの制約上で動作します私が見つけたコードです:

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ピクセルをフォームに反応させる必要があります。標準のフォームRECTは(0, 0, 100, 100)かもしれないが、私は実際にそれはあなたが異なることと書くことが水平方向と垂直方向のオフセットを必要と ので、代わりにのみEDGEDETECTの2つの定数を定義するために理にかなって上記のこの方法は、(10, 3, 90, 97)

答えて

5

の範囲内で仕事をしたいです最初からそれが、ここでは迅速なパッチです:

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

@ジェリー - あなたは大歓迎です! > * "微調整" *>ええ、最初から書き込みをする時間があれば、より良いでしょう。 –

関連する問題