Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi nicht modale dialoge verschieben (https://www.delphipraxis.net/91902-nicht-modale-dialoge-verschieben.html)

Mark90 11. Mai 2007 16:09


nicht modale dialoge verschieben
 
hi,

ich hab mal ein prog nonvcl programmiert. ich habe eine dialog resource. aus der lade ich einen dialog ohne titelleiste. wie kann ich diesen dialog verschieben.(wenn ich mit der Maus auf den dialog klicke soll er sich verschieben.)

uwewo 11. Mai 2007 16:16

Re: nicht modale dialoge verschieben
 
Du zeigst aber trotzdem ein Form an oder.

Delphi-Quellcode:
private
procedure WMNCHitTest(var M: TWMNCHitTest); message WM_NCHitTest;
..

procedure TForm1.WMNCHitTest (var M: TWMNCHitTest);
begin
  inherited;
  if M.Result = htClient then
    M.Result := htCaption;
end;

Hoffe es hilft, hatte noch nie was mit nonvcl am Hut.

Mark90 11. Mai 2007 17:25

Re: nicht modale dialoge verschieben
 
Nein ich benutzte keine Form. Ich programmiere mit der Win32-Api. Eigentlich müsste das doch sicher Luckie wissen. Hier nochmals meine Frage: Wie bewege ich meinen Dialog auf dem Desktop, ohne titelleiste.

himitsu 11. Mai 2007 18:39

Re: nicht modale dialoge verschieben
 
Im Grunde doch genauso wie mit VCL-Fenstern ohne Titelleiste.
  • Mausklick (drücken) abfangen und Variable auf true setzen, sowie die aktuelle Mausposition speichern
  • Wenn Variable = true dann:
    Mausmove abfangen und je nach Mausbewegung (Diverenz aus aktueller und neuer Mausposition) das Fenster verschieben, sowie neue Posiion speichern
  • Mausklick (loslassen) abfangen und Variable auf false setzen

Mark90 11. Mai 2007 19:06

Re: nicht modale dialoge verschieben
 
Hi bei der VCL geht das so.

Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(Form1.Handle, WM_SYSCOMMAND, $F012, 0);
end;
ich habs bei meinem dialog probiert, leider klappt das nicht.

Delphi-Quellcode:
case umsg of
  WM_SIZE:
    BEGIN
      ReleaseCapture;
      SendMessage(HWND, WM_SYSCOMMAND, $F012, 0);
    END;

himitsu 11. Mai 2007 19:34

Re: nicht modale dialoge verschieben
 
ReleaseCapture und WM_SYSCOMMAND+$F012 sind Functionen/Messages der VCL.

Wie gesagt du mußt es schon selber machen, also die Messages für MausClick/-Move von der Form abfangen und auswerten. :zwinker:

bitsetter 11. Mai 2007 21:47

Re: nicht modale dialoge verschieben
 
Liste der Anhänge anzeigen (Anzahl: 1)
Moin moin,

Zitat:

Zitat von himitsu
Im Grunde doch genauso wie mit VCL-Fenstern ohne Titelleiste.
  • Mausklick (drücken) abfangen und Variable auf true setzen, sowie die aktuelle Mausposition speichern
  • Wenn Variable = true dann:
    Mausmove abfangen und je nach Mausbewegung (Diverenz aus aktueller und neuer Mausposition) das Fenster verschieben, sowie neue Posiion speichern
  • Mausklick (loslassen) abfangen und Variable auf false setzen

so in etwa habe ich das mal gemacht, es funktioniert zwar aber so richtig gut finde ich die Lösung auch nicht.

Mark90 11. Mai 2007 22:26

Re: nicht modale dialoge verschieben
 
Zitat:

Zitat von bitsetter
Moin moin,

Zitat:

Zitat von himitsu
Im Grunde doch genauso wie mit VCL-Fenstern ohne Titelleiste.
  • Mausklick (drücken) abfangen und Variable auf true setzen, sowie die aktuelle Mausposition speichern
  • Wenn Variable = true dann:
    Mausmove abfangen und je nach Mausbewegung (Diverenz aus aktueller und neuer Mausposition) das Fenster verschieben, sowie neue Posiion speichern
  • Mausklick (loslassen) abfangen und Variable auf false setzen

so in etwa habe ich das mal gemacht, es funktioniert zwar aber so richtig gut finde ich die Lösung auch nicht.

Danke bitsetter genau das habe ich gesucht.

teebee 11. Mai 2007 22:35

Re: nicht modale dialoge verschieben
 
Zitat:

Zitat von Mark90
ich habs bei meinem dialog probiert, leider klappt das nicht.

Delphi-Quellcode:
case umsg of
  WM_SIZE:
    BEGIN
      ReleaseCapture;
      SendMessage(HWND, WM_SYSCOMMAND, $F012, 0);
    END;

Das gehört nach WM_LBUTTONDOWN und nicht nach WM_SIZE, dann geht es.

Zitat:

Zitat von himitsu
ReleaseCapture und WM_SYSCOMMAND+$F012 sind Functionen/Messages der VCL.

Nein, die gehören beide zu Windows.

Gruß, teebee

Luckie 11. Mai 2007 22:59

Re: nicht modale dialoge verschieben
 
So mache ich es in meinen Dialogen:
Delphi-Quellcode:
{ move the window with the left button down }
WM_LBUTTONDOWN:
  begin
    SetCursor(LoadCursor(0, IDC_SIZEALL));
    SendMessage(hDlg, WM_NCLBUTTONDOWN, HTCAPTION, lParam);
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:59 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz