Zitat von
3_of_8:
Ich habe ein Fenster erstellt.
Davon will ich jetzt den Rand verstecken, so wie bei TForm.borderstyle:=bsNone;
Aber ich finde die passenden Messages nicht. Wie mache ich das?
Hallo,
du möchtest wahrscheinlich ein rand- und titelleistenloses Fenster haben, dass aber trotzdem verschieb- und skalierbar bleibt.
- Im uses-Teil muss die
Unit "Messages" enthalten sein.
- Die Eigenschaft "BorderStyle" deines Fenster muss auf "bsNone" gesetzt werden (auch zur Laufzeit möglich).
- Im Deklarationsteil deiner TForm-Klasse im private-Abschnitt ist folgende Prozedur einzufügen, die Windows-Mausbotschaften ans Fenster abfängt:
procedure WMNCHitTest(var M: TWMNCHitTest); message wm_NCHitTest;
- Im Implementations-Teil fügst du folgenden Quelltext ein:
Delphi-Quellcode:
procedure TForm1.WMNCHitTest(var M: TWMNCHitTest);
const
BORDER_WIDTH = 5;
begin
inherited;
if M.Result = htClient then begin // Mauszeiger im Client-Bereich des Fensters
// Windows vorgaukeln, Mauszeiger wäre auf Titelleiste des Fensters
// ==> Fenster ohne Titelleiste kann durch Klick & Drag im Client-Bereich verschoben werden
M.Result := htCaption;
// falls Mauszeiger am nicht vorhandenen Fensterrand
// ==> Windows vorgaukeln, Rand wäre vorhanden
// ==> Fenster (BorderStyle = bsNone) kann trotzdem skaliert werden
if (M.XPos > Left) and (M.XPos < Left + BORDER_WIDTH) then begin
// Mauszeiger am linken Rand
M.Result := htLeft;
if (M.YPos > Top) and (M.YPos < Top + BORDER_WIDTH) then begin
// Mauszeiger an Ecke oben links
M.Result := htTopLeft;
end else begin
if (M.YPos < Top + Height) and (M.YPos > Top + Height - BORDER_WIDTH) then begin
// Mauszeiger an Ecke unten links
M.Result := htBottomLeft;
end
end;
end else begin
if (M.XPos < Left + Width) and (M.XPos > Left + Width - BORDER_WIDTH) then begin
// Mauszeiger am rechten Rand
M.Result := htRight;
if (M.YPos > Top) and (M.YPos < Top + BORDER_WIDTH) then begin
// Mauszeiger an Ecke oben rechts
M.Result := htTopRight;
end else begin
if (M.YPos < Top + Height) and (M.YPos > Top + Height - BORDER_WIDTH) then begin
// Mauszeiger an Ecke unten rechts
M.Result := htBottomRight;
end
end;
end else begin
// Mauszeiger innerhalb linker u. rechter Rand
if (M.YPos > Top) and (M.YPos < Top + BORDER_WIDTH) then begin
// Mauszeiger am oberen Rand
M.Result := htTop;
end else begin
if (M.YPos < Top + Height) and (M.YPos > Top + Height - BORDER_WIDTH) then begin
// Mauszeiger am unteren Rand
M.Result := htBottom;
end
end;
end;
end;
end;
end;