Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#1

Verschieben von Borderlosen Formen FullDrag

  Alt 4. Okt 2006, 10:41
Möchte auch einen kleinen Beitrag hier leisten.

Wer kennt das nicht!

Utopische Frage!
Ich weise meiner Form beim laden einen Skin zu damit das ganze etwas ansehnlicher ist
habe ich die Borderstyle ausgeschaltet.

Damit ich meine Form verschieben kann benutze ich im MouseDown Events meiner
CaptionBar(Image) die Function ReleaseCapture.
Was mir dabei nicht gefällt, es kommt immer ein häßlicher Rahmen wenn ich die Form verschieben will.

Kurz gesagt!
Ich möchte meine Form verschieben als ganzes ohne das dieser Rahmen angezeigt wird.

Die Lösung!
Ich habe aus meinen Player 'VB' eine Funktion nach Delphi übersetzt.
Was dieses Problem behebt.

Delphi-Quellcode:
procedure TfrmMain.CaptionBarMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  // Springe in die Function SetFullWindowDrag
  // Weise dieser das Handle meiner Anwendung zu = frmMain.Handle
  // Und teile ihr mit das ich nun meine Form verschiebe.
  SetFullWindowDrag(frmMain.Handle, True);

  // Springe in die Function SetFullWindowDrag
  // Weise dieser das Handle meiner Anwendung zu = frmMain.Handle
  // Und teile ihr mit das ich mit dem verschieben fertig bin und das Event CaptionBarMouseDown verlasse.
  SetFullWindowDrag(frmMain.Handle, False);
end;

Delphi-Quellcode:
Function TfrmMain.SetFullWindowDrag(hwnd: DWORD; ShowFullWindow: Boolean): Boolean;

// Aktiviert oder deaktiviert die Anzeige von Fensterinhalten während des
// Ziehens oder der Größenänderung von Anwendungsfenstern.
// Der Rückgabewert gibt Aufschluss darüber, ob der Aufruf zu einer Änderung
// gegenüber der vorherigen Einstellung geführt hat (True) oder nicht (False).
Var
  lOldSetting: integer;
  lSuccess : boolean;
Begin
  // Bisherige Einstellung ermitteln:

  lSuccess := SystemParametersInfo(SPI_GETDRAGFULLWINDOWS, 0, @lOldSetting, 0);
  If lSuccess = False Then
    // Der abfragende Aufruf war nicht erfolgreich
    // (z.B. Windows 95 ohne "PLUS!"-Pack).
    Exit; // Rückgabewert bleibt False

  // Eine Aktion ist nur dann notwendig, wenn sich der bisherige
  // vom gewünschten Wert unterscheidet:
  If Bool(lOldSetting) <> ShowFullWindow Then
  Begin
     // Wert ändern und Erfolg prüfen:
    lSuccess := SystemParametersInfo(SPI_SETDRAGFULLWINDOWS, Abs(DWORD(ShowFullWindow)), 0, SPIF_UPDATEINIFILE
                                      Or SPIF_SENDWININICHANGE);
    If bool(lSuccess) = True Then
    Begin
      Result := True;
      ReleaseCapture;
      SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
    End;
  End
End;
Viel Spass beim Testen.

EDIT: Die Funktion SetFullWindowDrag muss zweimal in dem gleichen MouseDown ereignis ausgeführt werden.
Das hat damit zu tun weil in SetFullWindowDrag ReleaseCapture ausgeführt wird.
Diese kann erst dann wieder verlassen werden wenn MouseDown ereignis abgeschlossen ist.

Gruß

[edit=CalganX]Code-Style. Mfg, CalganX[/edit]
  Mit Zitat antworten Zitat