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:
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:
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 TDockOrientation = (doScreen,doDesktop,doWorkArea);
TDockOptions = record CanDock: Boolean; DockingBand: integer; Orientation: TDockOrientation; end;
TMainForm = class(TForm) private procedure WMExitSizeMove(var Msg: TMessage); message WM_EXITSIZEMOVE; public DockOptions: TDockOptions; end; implementation
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 <> 0) then 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 <> 0) then 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:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| With DockOptions do begin DockingBand := 10; CanDock := True; Orientation := doWorkArea; end; |
oder auch
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.