Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Win32 non-Vcl ein zweites Window Modal und Umlaute Frage (https://www.delphipraxis.net/196500-win32-non-vcl-ein-zweites-window-modal-und-umlaute-frage.html)

KodeZwerg 26. Mai 2018 02:21

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von EWeiss (Beitrag 1403034)
So ist es dann der letzte Vorgang im alten Fenster danach passiert ja nichts mehr und du hast alles abgearbeitet.

Ich habe da so eine berühmte Vcl Weisheit im Kopf "ein deaktiviertes Fenster kann nicht den Fokus erhalten".
Von daher glaube ich schon das im WM_CREATE des zweiten Window das erste Window erst deaktiviert werden müsste oder irre ich mich da? Das war es als ich meinte das es Sinn ergibt, nun machst Du meine heile Welt kaputt *schmunzel*


Das ist jetzt mein momenter Template Hauptteil, muss nur noch Positionen der Buttons anpassen.
Delphi-Quellcode:
{Fensterfunktion für Fenster 1}
function Wnd1Proc(hWnd1: HWND; uMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var
  x, y : integer;
begin
  Result := 0;
  case uMsg of
    WM_CREATE:
      begin
        {Fenster zentrieren}
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        MoveWindow(hWnd1, (x div 2) - (Window1Width div 2),
          (y div 2) - (Window1Height div 2),
          Window1Width, Window1Height, true);

        hwndBtnExit := CreateWindowEx(0, 'BUTTON', 'Beenden',
          WS_CHILD or WS_VISIBLE, 200, 300,
          100, 25, hWnd1, IDC_BTNEXIT, hInstance, nil);
        hwndBtnAbout := CreateWindowEx(0, 'BUTTON', 'Über',
          WS_CHILD or WS_VISIBLE, 200, 160,
          100, 25, hWnd1, IDC_BTNABOUT, hInstance, nil);
      end;
    WM_COMMAND:
      begin
        if HiWord(wParam) = BN_CLICKED then
          case LoWord(wParam) of
            IDC_BTNEXIT: SendMessage(hWnd1, WM_CLOSE, 0, 0);
            IDC_BTNABOUT:
              {Fenster 2 erzeugen und anzeigen}
              begin
                hWndAbout := CreateWindowEx(0, ClassName2, Window2Name,
                  WS_OVERLAPPEDWINDOW or WS_VISIBLE, 40, 10,
                  300, 200, hWnd1, 0, hInstance, nil);
              end;
          end;
      end;
    WM_DESTROY:
      begin
        PostQuitMessage(0);
      end;
  else
    Result := DefWindowProc(hWnd1, uMsg, wParam, lParam);
  end;
end;

{Fensterfunktion für Fenster 2}
function Wnd2Proc(hWnd2: HWND; iMsg: UINT; wParam: wParam; lParam: LParam):
  lresult; stdcall;
var
  x, y : integer;
begin
  Result := 0;
  case iMsg of
    WM_CREATE:
      begin
        EnableWindow(hWndMain, false);
        {Fenster zentrieren}
        x := GetSystemMetrics(SM_CXSCREEN);
        y := GetSystemMetrics(SM_CYSCREEN);
        MoveWindow(hWnd2, (x div 2) - (Window2Width div 2),
          (y div 2) - (Window2Height div 2),
          Window2Width, Window2Height, true);
        hwndBtnExit := CreateWindowEx(0, 'BUTTON', 'Beenden',
          WS_CHILD or WS_VISIBLE, 100, 100,
          100, 25, hWnd2, IDC_BTNEXIT, hInstance, nil);
      end;
    WM_COMMAND:
      begin
        if HiWord(wParam) = BN_CLICKED then
          case LoWord(wParam) of
            IDC_BTNEXIT: SendMessage(hWnd2, WM_CLOSE, 0, 0);
          end;
      end;
    WM_CLOSE:
      begin
        EnableWindow(hWndMain, True);
        DestroyWindow(hWnd2);
      end;
    else
      Result := DefWindowProc(hWnd2, iMsg, wParam, lParam);
  end;
end;

EWeiss 26. Mai 2018 07:58

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Ich habe da so eine berühmte Vcl Weisheit im Kopf "ein deaktiviertes Fenster kann nicht den Fokus erhalten".
Was hat das damit zu tun?
Und wo bekommt beim erstellen des neuen Fensters das alte den Focus wenn es sich erst danach selbst deaktiviert?
Es hat diesen bereits (Dein Button auf dem du klickst) und zwar solange bis das neue erstellt wird\wurde.

Du must das eigene Fenster aus der Funktion deaktivieren wo du das neue Window erstellst aber nicht vorher (vorher = Deadlock) je nach dem
was du danach noch tun willst und das Fenster es nicht kann weil deaktiviert

sondern nach dem erstellen und EnableWindow die letzte Aktion ist die im ButtonClick Event ausgeführt wird.
...
Ok mach wie du es willst.

EDIT:
Beispiel.

Du klickst auf Button und erstellst ein neues Fenster.
In dem Fenster das erstellt wird deaktivierst du das ParentWindow.
Jetzt möchte ich aber im ParentWindow was das neue Fenster erstellt noch etwas zeichnen nach dem das neue Fenster erstellt wurde.
Nun.. Was denkst du zeichnet sich dann noch nachdem du das Fenster von außerhalb deaktiviert hast? Klassischer Todesstoß

gruss

EWeiss 26. Mai 2018 09:36

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Nebenbei.. das ist auch nicht richtig.

Delphi-Quellcode:
   {Fenste 1 erzeugen und hWnd1 zuweisen}
   hWnd1 := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
     WS_OVERLAPPEDWINDOW,
     CW_USEDEFAULT, CW_USEDEFAULT, WindowWidth1, WindowHeight1, 0, 0, hInstance,
     nil);
CW_USEDEFAULT.. DWORD <> Integer. Du verletzt die untere Grenze.

entweder die Konstanten ganz weg lassen also mit 0 ersetzen oder aber zu integer konvertieren.

gruss

KodeZwerg 26. Mai 2018 09:46

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von EWeiss (Beitrag 1403047)
CW_USEDEFAULT.. DWORD <> Integer. Du verletzt die untere Grenze.

Delphi-Quellcode:
  {Fenste 1 erzeugen und hWnd1 zuweisen}
  hWndMain := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
    WS_OVERLAPPEDWINDOW,
    Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Window1Width, Window1Height, 0, 0, hInstance,
    nil);
Habe das so abgeändert, korrekt oder völlig falsch?

EWeiss 26. Mai 2018 09:52

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von KodeZwerg (Beitrag 1403049)
Zitat:

Zitat von EWeiss (Beitrag 1403047)
CW_USEDEFAULT.. DWORD <> Integer. Du verletzt die untere Grenze.

Delphi-Quellcode:
  {Fenste 1 erzeugen und hWnd1 zuweisen}
  hWndMain := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
    WS_OVERLAPPEDWINDOW,
    Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT), Window1Width, Window1Height, 0, 0, hInstance,
    nil);
Habe das so abgeändert, korrekt oder völlig falsch?

Ist ok.. wobei du auch LPARAM dafür hättest nutzen können.
Ja, ja der EWeiss ist mit nichts zugfrieden.

Delphi-Quellcode:
   {Fenste 1 erzeugen und hWnd1 zuweisen}
   hWnd1 := CreateWindowEx(0, ClassName1, Window1Name, WS_VISIBLE or
     WS_OVERLAPPEDWINDOW,
     LPARAM(CW_USEDEFAULT), LPARAM(CW_USEDEFAULT), WindowWidth1, WindowHeight1, 0, 0, hInstance,
     nil);
LOL :)

gruss

KodeZwerg 26. Mai 2018 09:53

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Danke fürs Aufpassen und Deine Hilfe dabei!

Nachtrag, Integer() mit LPARARM() ersetzt, kannst Du mir auch den Unterschied dabei sagen, das Versteh ich gerade irgendwie nicht so ganz?
Als Du sagtest "Du verletzt die untere Grenze." weil Integer gefordert wird, dachte ich, naiv wie ich bin, Caste ich mir den als Integer. LPARARM ist für mich gleichzusetzen wie ein LongWord also ein cast ala LongWord(CW_USEDEFAULT)

EWeiss 26. Mai 2018 10:21

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Zitat:

Zitat von KodeZwerg (Beitrag 1403052)
Danke fürs Aufpassen und Deine Hilfe dabei!

Nachtrag, Integer() mit LPARARM() ersetzt, kannst Du mir auch den Unterschied dabei sagen, das Versteh ich gerade irgendwie nicht so ganz?
Als Du sagtest "Du verletzt die untere Grenze." weil Integer gefordert wird, dachte ich, naiv wie ich bin, Caste ich mir den als Integer. LPARARM ist für mich gleichzusetzen wie ein LongWord also ein cast ala LongWord(CW_USEDEFAULT)

Seit wann ?
LPARAM ist bei mir immer noch INT_PTR.
INT_PTR = Integer;

LongWord := 0..4294967295; Minus Bereiche ausgeschlossen deshalb Verletzung der Untergrenze.
Integer := -2147483648..2147483647

gruss

KodeZwerg 26. Mai 2018 10:41

AW: Win32 non-Vcl ein zweites Window Modal und Umlaute Frage
 
Vielleicht bringe ich da auch etwas durcheinander. War nicht LParam = 32bit LongWord und wParam = 16bit Word. Ich bin da bestimmt nicht auf dem aktuellen Stand der Dinge.

Hab gerade mal in Delphi geschaut, LParam ergibt ein Interger, jupp!

Deine Erklärung reicht mir völlig aus, Vielen Dank dafür, ich aktualisiere mich mal selbst ^_^

edit
Ps: Deswegen hatte ich es ja Gedanklich erst nicht Verstanden, weil ich da LParam mit LongWord irgendwie verankert hatte was ja keinen Negativ-Wert zulässt wo ich dann wieder bei "Du verletzt die untere Grenze." wäre.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:28 Uhr.
Seite 3 von 3     123   

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