Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Fenster "unverschiebbar" machen (https://www.delphipraxis.net/25071-fenster-unverschiebbar-machen.html)

phXql 30. Jun 2004 17:59


Fenster "unverschiebbar" machen
 
hiho leute, ich hab ein fenster, das hat ne titelleiste, und ich will verhindern, dass es der user rumschieben kann. geht das irgendwie? die form muss noch auf ereignisse reagieren und geschlossen werden können muss sie auch. und die titelleiste würde ich auch gern behalten ;). hat jemand ne lösung?

Meflin 30. Jun 2004 18:02

Re: Fenster "unverschiebbar" machen
 
du kannst im on (wenn ich jetzt wüsste welches...) dnigsbums ereignis die position des fensters zurücksetzten. aber mir will nicht einfallen wie das eriegnis heist das ausgelöst wird wenn das fenster verschoben wird :roll:

phXql 30. Jun 2004 18:04

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von Meflin
du kannst im on (wenn ich jetzt wüsste welches...) dnigsbums ereignis die position des fensters zurücksetzten. aber mir will nicht einfallen wie das eriegnis heist das ausgelöst wird wenn das fenster verschoben wird :roll:

ja ich könne die WM_MOVE message abfangen, nur das is so unelegant. ich möchte was schönes haben :)

aber wenns wirklich nich anders geht, werd ichs wohl so machen...

phXql 30. Jun 2004 18:06

Re: Fenster "unverschiebbar" machen
 
hab ne lösung gefunden. align auf alCustom stellen ;).. das funktioniert, is aber irgendwie auch keine gescheite lösung.. jemand ne idee, wie mans "richtiger" macht? :mrgreen:

Meflin 30. Jun 2004 18:06

Re: Fenster "unverschiebbar" machen
 
a jetzt hab ichs. ich habs mal mit nem timer gelöst, der einfach alle 10 millisecs die position zurücksetzt. ist halt auch net grad die feine art...

StefanDP 30. Jun 2004 18:09

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von Meflin
a jetzt hab ichs. ich habs mal mit nem timer gelöst, der einfach alle 10 millisecs die position zurücksetzt. ist halt auch net grad die feine art...

nunja...

wie wärs wenn du nur nach einem WM_MOVE die position zurücksetzt?

neolithos 30. Jun 2004 18:11

Re: Fenster "unverschiebbar" machen
 
Nimm WM_MOVING und gib via Message.Result := 0 zurück.

phXql 30. Jun 2004 18:11

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von phXql
ja ich könne die WM_MOVE message abfangen, nur das is so unelegant. ich möchte was schönes haben :)

aber wenns wirklich nich anders geht, werd ichs wohl so machen...

Zitat:

Zitat von StefanDP
nunja...

wie wärs wenn du nur nach einem WM_MOVE die position zurücksetzt?

:gruebel:

Meflin 30. Jun 2004 18:13

Re: Fenster "unverschiebbar" machen
 
ich denke mal das wäre das beste. was hast du dagegen?

phXql 30. Jun 2004 18:18

Re: Fenster "unverschiebbar" machen
 
ich möchte nix nach dem moven zurücksetzen, da sträubt sich mein unterbewusstsein, ich möchte, dass sich die form erst gar nich rührt ;)

Tubos 30. Jun 2004 18:21

Re: Fenster "unverschiebbar" machen
 
Zitat:

Nimm WM_MOVING und gib via Message.Result := 0 zurück.
genau, WM_MOVING ist wahrscheinlich die beste Idee. Es wird VOR dem Verschieben ausgelöst.

StefanDP 30. Jun 2004 18:23

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von Tubos
Zitat:

Nimm WM_MOVING und gib via Message.Result := 0 zurück.
genau, WM_MOVING ist wahrscheinlich die beste Idee. Es wird VOR dem Verschieben ausgelöst.

Und mit der "Antowrt" sagst, du: NICHT verschieben :-)

phXql 30. Jun 2004 18:27

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von StefanDP
Zitat:

Zitat von Tubos
Zitat:

Nimm WM_MOVING und gib via Message.Result := 0 zurück.
genau, WM_MOVING ist wahrscheinlich die beste Idee. Es wird VOR dem Verschieben ausgelöst.

Und mit der "Antowrt" sagst, du: NICHT verschieben :-)

1stens): wie oft durchlaufe ich die funktion, wenn ich das fenster verschiebe? und dann jedes mal schauen, ob die form im Dock-Modus is (manchmal darf man sie verschieben)? das frisst rechenzeit, oder?

2tens): bei mir will die funktion nich ;)

Delphi-Quellcode:
    procedure WMMoving(var msg : TMessage); message WM_MOVING;

procedure TFormMain.WMMoving(var msg : TMessage);
begin
  msg.Result := 0;
end;
geht leider nich. form kann man trotzdem noch verschieben. :/

Christian Seehase 30. Jun 2004 18:38

Re: Fenster "unverschiebbar" machen
 
Moin phXql,

fang doch WM_NCHITTEST ab, und für den Fall, das jemand in die Titelleiste klickt wird zurückgegeben, dass es im Clientbereich war ;-)

Delphi-Quellcode:
type
  TForm1 = class(TForm)
  private
  public
    procedure WMNCHITTEST(var msg : TMessage); message WM_NCHITTEST;
  end;

implementation

procedure TForm1.WMNCHITTEST(var msg: TMessage);
begin
  inherited;
  if msg.Result = HTCAPTION then msg.Result := HTCLIENT;
end;
PS:
Über das Systemmenü des Formulares geht es dann allerdings immer noch :?

Seltsamer Weise funktioniert

Delphi-Quellcode:
  EnableMenuItem(GetSystemMenu(self.Handle,false),SC_MOVE,MF_BYCOMMAND or MF_GRAYED);
nämlich nicht. Mit SC_CLOSE ginge es :gruebel:

phXql 30. Jun 2004 18:41

Re: Fenster "unverschiebbar" machen
 
wenn es über das systemmenü noch geht, isses nich so schön. aber trotzdem danke :) ich hab jetzt vorrübergehend mal das align auf alCustom gestellt, bis mir entweder einfällt, wie mans lösen könnte, oder mir einfällt, wieso das WM_MOVING-dings nich will... :)

neolithos 30. Jun 2004 19:03

Re: Fenster "unverschiebbar" machen
 
Erstmal muss ich mich Entschuldigen:

Weise bitte Result bei WM_MOVING eine 1 zu.


Zu der WM_NCHITTEST Variante:

Die gefällt mir nicht. Da dadurch auch der Rechtsklick nicht mehr das Popup-Fenster anzeigt.

Christian Seehase 30. Jun 2004 20:32

Re: Fenster "unverschiebbar" machen
 
Moin Neolithos,

Zitat:

Zitat von neolithos
Die gefällt mir nicht. Da dadurch auch der Rechtsklick nicht mehr das Popup-Fenster anzeigt.

Meinst Du das Systemmenü?
Das funktioniert dann noch.

neolithos 30. Jun 2004 20:39

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von Christian Seehase
Meinst Du das Systemmenü?
Das funktioniert dann noch.

Ja! Sicher! *verwirrt*
Du sagst doch, wenn die Titelleiste angeklickt wird, dass die Titelleiste Client-Area ist. Dadurch sollte doch das Systemmenu nicht mehr durch Rechtsklick auf die Titelleiste angezeigt werden.

Ein weiterer Nachteil ist, dass du nicht auf die Verschiebungen mittels Tastatur reagierst.

Ein Nachteil meiner Variante ist, dass dieses graue Rechteck, eventuell angezeigt werden könnte.

Christian Seehase 30. Jun 2004 21:01

Re: Fenster "unverschiebbar" machen
 
Moin Neolithos,

Zitat:

Zitat von neolithos
Ein weiterer Nachteil ist, dass du nicht auf die Verschiebungen mittels Tastatur reagierst.

leider wahr (:?), auch wenn wohl > 99% aller Anwender nicht wissen, dass das geht ;-)

Wenn mir mal jemand verraten könnte, wo ich beim EnableMenuItem mit SC_MOVE den Denkfehler mache (zumal es mit SC_CLOSE einwandfrei funktioniert). :gruebel:

phXql 30. Jun 2004 21:18

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von Christian Seehase
Moin Neolithos,

Zitat:

Zitat von neolithos
Ein weiterer Nachteil ist, dass du nicht auf die Verschiebungen mittels Tastatur reagierst.

leider wahr (:?), auch wenn wohl > 99% aller Anwender nicht wissen, dass das geht ;-)

Wenn mir mal jemand verraten könnte, wo ich beim EnableMenuItem mit SC_MOVE den Denkfehler mache (zumal es mit SC_CLOSE einwandfrei funktioniert). :gruebel:

wenn ich bei delphi das align auf alCustom stelle, kann die form nich verschoben werden, und im systemmenü sind alle einträge ausgegraut, BIS auf den Move-eintrag. kann der vll. gar nich ausgegraut werden?

OT: wie kann man denn nun ein fenster mit der tastatur verschieben? :mrgreen:

Christian Seehase 30. Jun 2004 21:22

Re: Fenster "unverschiebbar" machen
 
Moin phXql,

Zitat:

Zitat von phXql
OT: wie kann man denn nun ein fenster mit der tastatur verschieben?

Mit ALT-Space das Systemmenü öffnen, dann den Menüpunkt "Verschieben".
Jetzt ist der Cursor ein Kreuz mit Pfeilspitzen, und das Fenster lässt sich mit den Cursortasten bewegen.

Analog funktionier das auch mit dem Ändern der Grösse.

BTW: Das EnableMenuItem funktioniert nur mit SC_CLOSE :?

NicoDE 30. Jun 2004 21:50

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von Christian Seehase
Das EnableMenuItem funktioniert nur mit SC_CLOSE :?

Hm ?
Delphi-Quellcode:
procedure TForm1.WMInitMenu(var Message: TWMInitMenu);
begin
  EnableMenuItem(Message.Menu, SC_MOVE, MF_BYCOMMAND or MF_GRAYED);
  DrawMenuBar(Handle);
end;

Christian Seehase 30. Jun 2004 22:19

Re: Fenster "unverschiebbar" machen
 
Moin Nico,

danke, man muss es natürlich auch an der richtigen Stelle machen :wall: :wall: :wall:

Stellt sich mir nur noch die Frage, warum es mit dem SC_CLOSE auch an anderer Stelle funktioniert.

Motzi 30. Jun 2004 22:53

Re: Fenster "unverschiebbar" machen
 
Also ich würd bei WM_WINDOWPOSCHANGING ansetzen und dort die aktuelle Fensterposition als neue Fensterposition festlegen...

NicoDE 30. Jun 2004 23:05

Re: Fenster "unverschiebbar" machen
 
Zitat:

Zitat von Christian Seehase
Stellt sich mir nur noch die Frage, warum es mit dem SC_CLOSE auch an anderer Stelle funktioniert.

Mehr oder weniger aus Kompatibilitätsgründen (CS_NOCLOSE kann nachträglich geändert werden, ändert aber nicht unter allen Shell-Versionen das Systemmenü).


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:38 Uhr.

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