Autor Beitrag
Jakob Schöttl
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 929
Erhaltene Danke: 1


Delphi 7 Professional
BeitragVerfasst: Sa 24.02.07 17:12 
Eigenes Fenster an Bildschirmrand andocken

Ich habe diese Procedure schon oft gebraucht, weil ich es immer schöner finde, wenn man das Fenster nahe dem Bildschirmrand einfach loslassen kann, und es dann an diesen "angedockt" wird.

Die Procedure wird bei der Windowsnachricht WM_EXITSIZEMOVE ausgeführt. Deshalb ist es wichtig, dass in der Deklaration der Formular-Klasse dieses Ereignis deklariert ist:
ausblenden Delphi-Quelltext
1:
procedure WMExitSizeMove(var Msg: TMessage); message WM_EXITSIZEMOVE;					

Diese Botschaft wird gesendet, wenn man die Maustaste nach dem Verschieben oder Vergrößern eines Fensters loslässt. Außerdem muss natürlich diese Procedure implementiert sein. Im folgenden Quelltext ist alles notwendige drin:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
type
  //Typen für die Procedure-Parameter

  TDockOrientation = (doScreen,doDesktop,doWorkArea);
{ TDockOrientation
  Die Breite [...] des Bildschirms ist in der Globalen Variable "Screen" gespeichert.
  Dort gibt es Screen.Width, Screen.DesktopWidth und Screen.WorkAreaWidth - das
  selbe natürlich auch für Heigth, Left und Top.
   - doScreen also für Screen.Widht ...
   - doDesktop also für Screen.DesktopWidth ...
   - doWorkArea also für Screen.WorkAreaWidth ...

  do steht natürlich für DockOrientation
}

  TDockOptions = record
    CanDock: Boolean;              //Gibt an, ob das Fenster beim loslassen andockt.
    DockingBand: integer;          //Gibt an, bei welchem Abstand in Pixeln das Fenster andockt.
    Orientation: TDockOrientation; //Legt fest an welchen Rändern das Fenster angdockt.
  end;

  //Formulardeklaration
  TMainForm = class(TForm)
  private  
    procedure WMExitSizeMove(var Msg: TMessage); message WM_EXITSIZEMOVE;
  public    
    DockOptions: TDockOptions;
  end;
  
implementation

//Die Prozedur selbst:  
procedure TMainForm.WMExitSizeMove(var Msg: TMessage);
var t,l,w,h,sw,sh: integer;
begin
  With DockOptions do begin
    if CanDock then begin
      t := Self.Top;
      l := Self.Left;
      w := Self.Width;
      h := Self.Height;
      case Orientation of
        doWorkArea: begin
          sw := Screen.WorkAreaWidth;
          sh := Screen.WorkAreaHeight;
        end;
        doDesktop: begin
          sw := Screen.DesktopWidth;
          sh := Screen.DesktopHeight;
        end;
        doScreen: begin
          sw := Screen.Width;
          sh := Screen.Height;
        end;
      end;

      if (t < DockingBand) and (t > (-DockingBand)) then Self.Top := 0;
      if ((t + h) < (sh + DockingBand)) and ((t + h) > (sh - DockingBand)) then
        if (Self.Top <> 0then Self.Top := sh - h else Self.Height := sh;

      if (l < DockingBand) and (l > (-DockingBand)) then Self.Left := 0;
      if ((l + w) < (sw + DockingBand)) and ((l + w) > (sw - DockingBand)) then
        if (Self.Left <> 0then Self.Left := sw - w else Self.Width := sw;
    end;
  end;
end;



Das Initialisieren der Parameter könnt ihr OnCreate machen, oder auch OnCreate mit einer INIDatei:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
//Initialisieren! ... nicht vergessen
With DockOptions do begin
  DockingBand := 10;
  CanDock := True;
  Orientation := doWorkArea;
end;

oder auch
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
With DockOptions do begin
  DockingBand := INIFile.ReadInteger('DockOptions','DockingBand',10);
  CanDock := INIFile.ReadBool('DockOptions','CanDock',True);
  Orientation := TDockOrientation(INIFile.ReadInteger('DockOptions','Orientation',ord(doWorkArea)));
end;


Ab Delphi 7 können auch TForm.ScreenSnap in Verbindung mit TForm.SnapBuffer verwendet werden.


Zuletzt bearbeitet von Jakob Schöttl am Di 27.02.07 13:11, insgesamt 1-mal bearbeitet