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 nonVCL: Handle des MainForm (https://www.delphipraxis.net/151030-nonvcl-handle-des-mainform.html)

Garfield 3. Mai 2010 20:51


nonVCL: Handle des MainForm
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich portiere gerade den OpenDirDialog nach nonVCL. Die Demo ist soweit fertig. Dabei hat mir das Win32API Tutorial von Luckie und Co., insbesondere das TreeView-Sample von Matthias geholfen. Nur beim Tuning habe ich ein paar Probleme.

Delphi-Quellcode:
{ Mittig über dem Hauptformular der Anwendung. }
poMainFormCenter:
begin
  GetWindowRect(HInstance, ParentRect);
  nLeft := ParentRect.Left + ((ParentRect.Right - ParentRect.Left) - fWidth) div 2;
  nTop := ParentRect.Top + ((ParentRect.Bottom - ParentRect.Top) - fHeight) div 2;
  MoveWindow(aWnd, nLeft, nTop, fWidth, fHeight, true);
end;
HInstance scheint nicht das richtige zu sein. Kann man an das Handle kommen oder muss man das per Parameter mitgeben?

Delphi-Quellcode:
{ Mittig über dem als Owner angegebenen Formular. }
poOwnerFormCenter:
if ods.Owner <> 0
then begin
  GetWindowRect(ods.Owner, ParentRect);
  nLeft := ParentRect.Left + ((ParentRect.Right - ParentRect.Left) - fWidth) div 2;
  nTop := ParentRect.Top + ((ParentRect.Bottom - ParentRect.Top) - fHeight) div 2;
  MoveWindow(aWnd, nLeft, nTop, fWidth, fHeight, true);
end;

himitsu 3. Mai 2010 21:07

Re: nonVCL: Handle des MainForm
 
Es gibt nicht die Mainform.
Die Mainform ist irgendeines der Fenster, welches der "Programmierer" als dieses ansieht.
Bei der VCL ist es so, daß dieses standardmäßig das erste, bei Application registrierte, Fenster ist.
Wenn du also in nonVCL keine Registrierung hast, dann kann man dieses Programmseitig nicht unterscheiden.

Lass deinem Dialodaufruf ein Handle mitgeben, welches dann quasi als Mainform verwendet wird.


PS: HInstance deiner Anwendung ist im aktuellen Windows die EXE, bzw. deren Image und bei einer DLL ist es analog das DLL-Handle.

Garfield 3. Mai 2010 21:38

Re: nonVCL: Handle des MainForm
 
Du musst doch jedes Fenster registrieren:
Delphi-Quellcode:
  RegisterClassEx(WndClass);
Sonst bekommst Du es nicht zu sehen!?

Wenn es nicht geht, muss ich halt die Option entfernen und das Handle verlangen.

himitsu 3. Mai 2010 21:44

Re: nonVCL: Handle des MainForm
 
RegisterClassEx registriert die Fenster-Klassen und nicht die Fenster-Instanzen. :zwinker:

Garfield 3. Mai 2010 22:18

Re: nonVCL: Handle des MainForm
 
Achso, das wäre dann das CreateWindowExW. Als Owner hatte ich das hwnd aus der Nachrichtenschleife mitgegeben.

Garfield 3. Mai 2010 23:13

Re: nonVCL: Handle des MainForm
 
Solange kein Fenster StayOnTop ist und das Öffnen des Dialogfensters nicht zu lange dauert, dürfte dies gehen:

Delphi-Quellcode:
{ Mittig über dem Hauptformular der Anwendung. }
poMainFormCenter:
begin
  GetWindowRect(GetForegroundWindow, ParentRect);
  nLeft := ParentRect.Left + ((ParentRect.Right - ParentRect.Left) - fWidth) div 2;
  nTop := ParentRect.Top + ((ParentRect.Bottom - ParentRect.Top) - fHeight) div 2;
  MoveWindow(aWnd, nLeft, nTop, fWidth, fHeight, true);
end;

Garfield 4. Mai 2010 09:43

Re: nonVCL: Handle des MainForm
 
Liste der Anhänge anzeigen (Anzahl: 2)
Das sieht dann jetzt wie im Anhang aus. Vielleicht hat jemand doch noch eine bessere Lösung?

Nachtrag: Ich habe testweise ein Formular mit fsStayOnTop erstellt. GetForegroundWindow funktioniert damit wie gewünscht und liefert das Handle zur MainForm oder zumindest zur aufrufenden Form. Je nachdem wie man die MainForm definiert.

Luckie 7. Mai 2010 18:09

Re: nonVCL: Handle des MainForm
 
Und warum nicht Delphi-Referenz durchsuchenSHBrowseForFolder? Hat Windows schon alles dabei, da muss man nichts selber machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:29 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