Einzelnen Beitrag anzeigen

informix05
(Gast)

n/a Beiträge
 

Re: Rand eines Windows nicht anzeigen

  Alt 31. Jan 2007, 12:59
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;
  Mit Zitat antworten Zitat