R: TRect;
begin
POldPanelWndProc(Msg);
if Msg.Msg = WM_NCHITTEST then
begin
// ΠΡΡ Ρ ΠΈΡΡΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_NCHITTEST
// Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π΅ ΡΠΊΡΠ°Π½Π½ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ
// Π² ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ ΠΈ Π² Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΡΡΠΎΡΠ½ΠΎΠΉ ΠΏΡΠΎΠ²Π΅ΡΠΊΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°Π½ΠΈΡ
// ΠΌΡΡΠΈ Π½Π° ΡΡΠΎΡΠΎΠ½Ρ ΡΠ°ΠΌΠΊΠΈ ΠΈΠ»ΠΈ Π² Π΅Π΅ ΡΠ³ΠΎΠ». ΠΠ΅Π»ΠΎ ΡΠΏΡΠΎΡΠ°Π΅ΡΡΡ
// ΡΠ΅ΠΌ, ΡΡΠΎ Ρ ΠΏΠ°Π½Π΅Π»ΠΈ Π½Π΅Ρ Π½Π΅ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ ΡΠ°ΡΡΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ
// Π²Π΅ΡΡ Π½ΠΈΠΉ Π»Π΅Π²ΡΠΉ ΡΠ³ΠΎΠ» ΠΎΠΊΠ½Π° ΠΈ Π²Π΅ΡΡ Π½ΠΈΠΉ Π»Π΅Π²ΡΠΉ ΡΠ³ΠΎΠ» ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΉ
// ΡΠ°ΡΡΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ.
Pt := PanelHole.ScreenToClient(Point(Msg.LParamLo, Msg.LParamHi));
if Pt.X < BorderMouseSensivity then
if Pt.Y < CornerMouseSensivity then Msg.Result := HTTOPLEFT
else
if Pt.Y >= PanelHole.Height - CornerMouseSensivity then
Msg.Result := HTBOTTOMLEFT
else Msg.Result := HTLEFT
else
if Pt.X >= PanelHole.Width - BorderMouseSensivity then
if Pt.Y < CornerMouseSensivity then Msg.Result := HTTOPRIGHT
else
if Pt.Y >= PanelHole.Height - CornerMouseSensivity then
Msg.Result := HTBOTTOMRIGHT
else Msg.Result := HTRIGHT
else
if Pt.Y < BorderMouseSensivity then
if Pt.X < CornerMouseSensivity then Msg.Result := HTTOPLEFT
else
if Pt.X >= PanelHole.Width - CornerMouseSensivity then
Msg.Result := HTTOPRIGHT
else Msg.Result := HTTOP
else
if Pt.Y >= PanelHole.Height - BorderMouseSensivity then
if Pt.X < CornerMouseSensivity then
Msg.Result := HTBOTTOMLEFT
else
if Pt.X >= PanelHole.Width - CornerMouseSensivity then
Msg.Result := HTBOTTOMRIGHT
else Msg. Result := HTBOTTOM;
end
else if Msg.Msg = WM_SIZE then
begin
// ΠΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΡΠ΅Π³ΠΈΠΎΠ½ SetRegion;
// Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΎΠΊΠ½Π°.
// ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠΊΠΈ
Constraints.MinWidth :=
Width - ClientWidth + PanelHole.Left + MinHoleSize + HoleDistance;
Constraints.MinHeight :=
Height - ClientHeight + PanelHole.Top + MinHoleSize + HoleDistance;
end
else if Msg.Msg = WM_SIZING then
begin
// ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π½Π½ΡΠΉ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ R,
// ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΈΠ· ΡΠΊΡΠ°Π½Π½ΡΡ
// Π² ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅
R.TopLeft := ScreenToClient(PRect(Msg.LParam)^.TopLeft);
R.BottomRight := ScreenToClient(PRect(Msg.LParam)^.BottomRight);
// ΠΡΠ»ΠΈ ΡΠΈΡΠΈΠ½Π° ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π»Π°, ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ, Π·Π° ΠΊΠ°ΠΊΡΡ
// ΡΡΠΎΡΠΎΠ½Ρ ΡΡΠ½Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ. ΠΡΠ»ΠΈ Π·Π° Π»Π΅Π²ΡΡ -
// ΠΊΠΎΡΡΠ΅ΠΊΡΠΈΡΡΠ΅ΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π»Π΅Π²ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ Π·Π°
// ΠΏΡΠ°Π²ΡΡ - Π΅Π΅ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ
if R.Right - R.Left < MinHoleSize then
if Msg.WParam in [WMSZ_BOTTOMLEFT, WMSZ_LEFT, WMSZ_TOPLEFT] then
R.Left := R.Right - MinHoleSize
else
R.Right := R.Left + MinHoleSize;
// ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π»Π° Π²ΡΡΠΎΡΠ°
if R.Bottom - R.Top < MinHoleSize then
if Msg.WParam in [WMSZ_TOP, WMSZ_TOPLEFT, WMSZ_TOPRIGHT] then
R.Top := R.Bottom - MinHoleSize
else R.Bottom := R.Top + MinHoleSize;
// Π‘Π΄Π²ΠΈΠ³Π°Π΅ΠΌ ΡΡΠΎΡΠΎΠ½Ρ, ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΏΠΎΠ΄ΠΎΡΠ΅Π΄ΡΠΈΠ΅
// ΠΊ Π³ΡΠ°Π½ΠΈΡΠ°ΠΌ ΠΎΠΊΠ½Π°
if R.Left < HoleDistance then R.Left := HoleDistance;
if R.Top < HoleDistance then R.Top := HoleDistance;
if R.Right > ClientWidth - HoleDistance then
R.Right := ClientWidth - HoleDistance;
if R.Bottom > ClientHeight - HoleDistance then
R.Bottom := ClientHeight - HoleDistance;
// ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ R, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ Π΅Π³ΠΎ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ
// ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² ΡΠΊΡΠ°Π½Π½ΡΠ΅
PRect(Msg.LParam)^.TopLeft := ClientToScreen(R.TopLeft);
PRect(Msg.LParam)^.BottomRight := ClientToScreen(R.BottomRight);
end;
end;
ΠΡΡΠ°Π΅ΡΡΡ Π΅ΡΠ΅ ΠΎΠ΄Π½Π° ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΊΠΎΠ³Π΄Π° Π³ΡΠ°Π½ΠΈΡΡ "Π΄ΡΡΠΊΠΈ" ΠΌΠΎΠ³ΡΡ ΠΏΠΎΠ΄ΠΎΠΉΡΠΈ ΠΊ Π³ΡΠ°Π½ΠΈΡΠ°ΠΌ ΠΎΠΊΠ½Π° ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±Π»ΠΈΠ·ΠΊΠΎ: ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΌΠ΅Π½ΡΠ΅Ρ Π½Π΅ Π³ΡΠ°Π½ΠΈΡΡ "Π΄ΡΡΠΊΠΈ", Π° Π³ΡΠ°Π½ΠΈΡΡ ΡΠ°ΠΌΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°. Π§ΡΠΎΠ±Ρ ΡΡΠΎΠ³ΠΎ Π½Π΅ ΡΠ»ΡΡΠΈΠ»ΠΎΡΡ, Π½ΡΠΆΠ½ΠΎ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΎΠΊΠ½Π° ΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠ΅Π½ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡ Π΄ΡΡΠΊΠΈ β Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ ΠΏΠΎΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΏΠ°Π½Π΅Π»ΠΈ ΠΈ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΠ°ΡΡ ΡΠ΅Π³ΠΈΠΎΠ½. ΠΠ΅ΡΠ΅ΡΡΠ΅Ρ ΡΠ΅Π³ΠΈΠΎΠ½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΎΠΊΠ½Π°: Π΅ΡΠ»ΠΈ Π΅Π³ΠΎ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΠ°ΡΡ, ΠΏΠΎΠ»ΡΡΠΈΡΡΡ, ΡΡΠΎ ΡΠ°ΡΡΡ ΠΎΠΊΠ½Π° Π½Π΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΡΠ΅Π³ΠΈΠΎΠ½ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ΅Π·Π°Π½Π°. ΠΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_SIZE ΠΎΠΊΠ½Π° (Π»ΠΈΡΡΠΈΠ½Π³ 1.54).
ΠΠΈΡΡΠΈΠ½Π³ 1.54. ΠΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ WM_SIZE Π³Π»Π°Π²Π½ΠΎΠ³ΠΎ ΠΎΠΊΠ½Π°procedure TFormHole.WMSize(var Msg: TWMSize);
begin
inherited;
// ΠΡΠΈ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΎΠΊΠ½Π° ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΠΌ ΡΠ°Π·ΠΌΠ΅Ρ Π΄ΡΡΠΊΠΈ,
// Π΅ΡΠ»ΠΈ Π³ΡΠ°Π½ΠΈΡΡ ΠΎΠΊΠ½Π° ΠΏΠΎΠ΄ΠΎΡΠ»ΠΈ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ Π½Π΅ΠΉ
if PanelHole.Left + PanelHole.Width > ClientWidth - HoleDistance then
PanelHole.Width := ClientWidth - HoleDistance - PanelHole.Left;
if PanelHole.Top + PanelHole.Height > ClientHeight - HoleDistance then
PanelHole.Height := ClientHeight - HoleDistance - PanelHole.Top;
// ΠΠ° ΡΠ»ΡΡΠ°ΠΉ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΠΎΠΊΠ½Π° ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ Π΅Π³ΠΎ ΡΠ΅Π³ΠΈΠΎΠ½,
// ΠΈΠ½Π°ΡΠ΅ ΡΠ° ΡΠ°ΡΡΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π°ΡΡ, ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ Π·Π° Π΅Π³ΠΎ
// ΠΏΡΠ΅Π΄Π΅Π»Π°ΠΌΠΈ ΠΈ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ΅Π·Π°Π½Π° SetRegion;
// ΠΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΡΡΠ΅Π»ΠΎΠΊ
CalculateArrows;
Invalidate;
end;
ΠΠ°ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠΊ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΎΠ΄ΠΈΠ½ "Π±Π°Π½ΡΠΈΠΊ": ΠΊΡΠ°ΡΠ½ΡΠ΅ ΡΡΡΠ΅Π»ΠΊΠΈ ΠΏΠΎ ΡΠ³Π»Π°ΠΌ ΡΠΎΡΠΌΡ, Π·Π° ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠ½ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π΅Π΅ ΡΠ°Π·ΠΌΠ΅Ρ. ΠΠ°ΠΆΠ΄Π°Ρ ΡΡΡΠ΅Π»ΠΊΠ° Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΌ ΡΠ΅Π³ΠΈΠΎΠ½ΠΎΠΌ. ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΠ΅Π³ΠΈΠΎΠ½ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΏΡΠΈΠ²ΡΠ·Π°Π½Ρ ΠΊ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΌ ΡΠ³Π»Π°ΠΌ ΠΎΠΊΠ½Π°, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠΎΠ² ΠΎΠΊΠ½Π° ΡΡΠΈ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΡΠΈΠ΄Π΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°ΡΡ (Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 1.54 ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ Π²ΡΠ·ΠΎΠ²). ΠΡΠ΅ ΡΡΡΠ΅Π»ΠΊΠΈ Π²ΡΠ³Π»ΡΠ΄ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, Π½ΠΎ ΡΠ²Π»ΡΡΡΡΡ Π·Π΅ΡΠΊΠ°Π»ΡΠ½ΡΠΌ ΠΎΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°. Π§ΡΠΎΠ±Ρ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΡΡΠ΅Π»ΠΎΠΊ, ΠΌΡ Π·Π°Π΄Π°Π΄ΠΈΠΌ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΎΠ΄Π½ΠΎΠΉ Π½Π°ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ Π·Π°ΡΠ°Π½Π΅Π΅ ΡΡΡΠ΅Π»ΠΊΠΈ Π² Π²ΠΈΠ΄Π΅ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ, Π° ΠΏΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΡΠΈΡΡΠ²Π°ΡΡ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΡΡΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΡΡΠ΅Π»ΠΎΠΊ, ΠΎΡΡΠ°ΠΆΠ°Ρ ΠΈΡ ΠΎΡ Π½ΡΠΆΠ½ΠΎΠΉ ΠΏΠ»ΠΎΡΠΊΠΎΡΡΠΈ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡ ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ (Π»ΠΈΡΡΠΈΠ½Π³ 1.55).
ΠΠΈΡΡΠΈΠ½Π³ 1.55. Π Π°ΡΡΠ΅Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΡΡΡΠ΅Π»ΠΎΠΊ// ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ Π²Π΅ΡΡ Π½Π΅ΠΉ Π»Π΅Π²ΠΎΠΉ ΡΡΡΠ΅Π»ΠΊΠΈ, ΠΎΡΡΡΠΈΡΠ°Π½Π½ΡΠ΅ ΠΎΡ ΡΠΎΡΠΊΠΈ
// (0,0). ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°Ρ ΡΠ΅Π°Π»ΡΠ½ΡΡ ΡΡΡΠ΅Π»ΠΎΠΊ ΡΡΠΈ ΡΠΎΡΠΊΠΈ
// Π±ΡΠ΄ΡΡ ΡΠΌΠ΅ΡΠ°ΡΡΡΡ ΠΈ ΠΎΡΡΠ°ΠΆΠ°ΡΡΡΡ
const
ArrowTemplate: TArrowCoords = (
(X:0; Y:0), (X:24; Y:0), (X:17; Y:7), (X:29; Y:19),
(X:19; Y:29), (X:7; Y:17), (X:0; Y:24));
procedure TFomHole.CalculateArrows;
var
Arrow: TArrowCoords;
I: Integer;
begin
// ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΠΎΠ½Π° Π»Π΅Π²ΠΎΠΉ Π²Π΅ΡΡ Π½Π΅ΠΉ ΡΡΡΠ΅Π»ΠΊΠΈ
// ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠΌΠ΅ΡΠ°ΡΡΡΡ Π½Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ
for I := 0 to High(Arrow) do
begin
Arrow[I].X := ArrowTemplate[I].X + ArrowOffset;
Arrow[I].Y := ArrowTemplate[I].Y + ArrowOffset;
end;
// ΠΡΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ°Π΅ΠΌ ΡΡΠ°ΡΡΠΉ ΡΠ΅Π³ΠΈΠΎΠ½
if ArrowTopLeft <> 0 then DeleteObject(ArrowTopLeft);
ArrowTopLeft :=
CreatePolygonRgn(Arrow[0], Length(Arrow), WINDING);
// ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΠΎΠ½Π° ΠΏΡΠ°Π²ΠΎΠΉ Π²Π΅ΡΡ Π½Π΅ΠΉ ΡΡΡΠ΅Π»ΠΊΠΈ
// ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΠΎ X ΠΎΡΡΠ°ΠΆΠ°ΡΡΡΡ ΠΈ ΡΠΌΠ΅ΡΠ°ΡΡΡΡ
// Π½Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ ΠΊΡΠ°Ρ ΠΎΠΊΠ½Π°
for I := 0 to High(Arrow) do
begin
Arrow[I].X := ClientWidth - ArrowOffset - 1 - ArrowTemplate[I].X;
Arrow[I].Y := ArrowTemplate[I].Y + ArrowOffset;
end;
if ArrowTopRight <> 0 then DeleteObject(ArrowTopRight);
ArrowTopRight := CreatePolygonRgn(Arrow[0], Length(Arrow), WINDING);
// ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΠΎΠ½Π° Π»Π΅Π²ΠΎΠΉ Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΡΡΠ΅Π»ΠΊΠΈ
// ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΠΎ Y ΠΎΡΡΠ°ΠΆΠ°ΡΡΡΡ ΠΈ ΡΠΌΠ΅ΡΠ°ΡΡΡΡ
// Π½Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΠΊΡΠ°Ρ ΠΎΠΊΠ½Π°
for I := 0 to High(Arrow) do
begin
Arrow[I].X := ArrowTemplate[I].X + ArrowOffset;
Arrow[I].Y := ClientHeight - ArrowOffset - 1 - ArrowTemplate[I].Y;
end;
if ArrowBottomLeft <> 0 then DeleteObject(ArrowBottomLeft);
ArrowBottomLeft := CreatePolygonRgn(Arrow[0], Length(Arrow), WINDING);
// ΠΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅Π³ΠΈΠΎΠ½Π° ΠΏΡΠ°Π²ΠΎΠΉ Π½ΠΈΠΆΠ½Π΅ΠΉ ΡΡΡΠ΅Π»ΠΊΠΈ
// ΠΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΠΎ ΠΎΠ±Π΅ΠΈΠΌ ΠΎΡΡΠΌ ΠΎΡΡΠ°ΠΆΠ°ΡΡΡΡ ΠΈ ΡΠΌΠ΅ΡΠ°ΡΡΡΡ
// Π½Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ Π½ΠΈΠΆΠ½Π΅Π³ΠΎ ΡΠ³Π»Π° ΠΎΠΊΠ½Π°
for I := 0 to High(Arrow) do
begin
Arrow[I].X := ClientWidth - ArrowOffset - 1 - ArrowTemplate[I].X;
Arrow[I].Y := ClientHeight - ArrowOffset - 1 - ArrowTemplate[I].Y;
end;
if ArrowBottomRight <> 0 then DeleteObject(ArrowBottomRight);
ArrowBottomRight := CreatePolygonRgn(Arrow[0], Length(Arrow), WINDING);
end;
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ β ΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ΅Π»ΠΊΠΈ Π½Π° ΡΠΎΡΠΌΠ΅. ΠΠ΅Π»Π°Π΅ΡΡΡ ΡΡΠΎ ΠΎΡΠ΅Π½Ρ ΠΏΡΠΎΡΡΠΎ (Π»ΠΈΡΡΠΈΠ½Π³ 1.56).
ΠΠΈΡΡΠΈΠ½Π³ 1.56. Π ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΡΡΠ΅Π»ΠΎΠΊ Π½Π° ΡΠΎΡΠΌΠ΅procedure TFormHole.FormPaint(Sender: TObject);
begin
// ΠΠ°ΠΊΡΠ°ΡΠΈΠ²Π°Π΅ΠΌ ΡΠ΅Π³ΠΈΠΎΠ½Ρ ΡΡΡΠ΅Π»ΠΎΠΊ
Canvas.Brush.Style := bsSolid;
Canvas.Brush.Color := clRed;
FillRgn(Canvas.Handle, ArrowTopLeft, Canvas.Brush.Handle);
FillRgn(Canvas.Handle, ArrowTopRight, Canvas.Brush.Handle);
FillRgn(Canvas.Handle, ArrowBottomLeft, Canvas.Brush.Handle);
FillRgn(Canvas.Handle, ArrowBottomRight, Canvas.Brush.Handle);