私はボーダーのタイプを持たないカスタムフォームを持っています。代わりにフォームの遠端にまで及ばない私の独自の境界を描画しています。代わりに、このカスタム描画された枠線の外にあるものは、フォームの透明なプロパティを使用することで透明になります。これにより、フォームのごく一部が使用可能になり、表示されます。遠端とは異なる制約からフチ無しフォームのサイズを変更しますか?
これを達成するためのソリューションがたくさんあることは知っていますが、私はすでにこれに最も適した方法を見つけました。ただし、このメソッドは、ユーザーがフォームの遠端にマウスを向けていることを前提としています。私はそれを異なる制約(例えば、より小さなサイズの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)
非常に素晴らしい:Dは、まだ少し微調整を使用しますが、それはトリックをやるように見えることができます。 InflateRect、PtInRect、およびSmallPointToPointの使用は、私が今までに見たことのない新しいものです。ありがとうございます:D –
@ジェリー - あなたは大歓迎です! > * "微調整" *>ええ、最初から書き込みをする時間があれば、より良いでしょう。 –