Statische HWND Variablen



  • Hallo zusammen!

    Ich weiss nich ob ich hier wirklich im richtigen Unterforum bin, da meine Frage sowohl die WinApi als auch C++-Stoff umfasst. Ich hab mich jetzt einmal für dieses hier entschieden 🙂
    Ich habe eine kleine Frage zu statischen (HWND) Variablen. In meiner Callback-Funktion habe ich folgenden Code:

    static HWND hText = GetWindow (hWnd, GW_CHILD);
        static HWND hEditBox = GetWindow (hText, GW_HWNDNEXT);
    	static HWND hUebernehmen = GetWindow (hEditBox, GW_HWNDNEXT);
    	static HWND hBeenden = GetWindow (hUebernehmen, GW_HWNDNEXT);
    

    Ziel ist es, die Handles der Child-Windows von meinem Parent-Window hWnd zu erhalten. Wenn ich das Ganze so schreibe
    bleiben diese Variablen jedoch leer, sprich, alles was ich nachher mit diesen Handles anstellen will funktioniert nicht. Schreibe ich das Ganze hingegen so,

    static HWND hText;		
             static HWND hEditBox; 		
             static HWND hUebernehmen; 		
             static HWND hBeenden; 			 
    
             hText = GetWindow (hWnd, GW_CHILD);					
             hEditBox = GetWindow (hText, GW_HWNDNEXT);				
             hUebernehmen = GetWindow (hEditBox, GW_HWNDNEXT);		
             hBeenden = GetWindow (hUebernehmen, GW_HWNDNEXT);
    

    so funktioniert mein Programm einwandfrei. Weiss vielleicht jemand warum das so ist?
    Normalerweise sollte man doch statische Variablen innerhalb von Funktionen gleichzeitig definieren und initalisieren können, oder etwa nicht?
    Vielen Dank.

    Gruss Der Gast



  • Eigentlich sollte es funktionieren - aber womöglich kommt die Initialisierung bereits, bevor die Fenster erzeugt wurden.



  • Hmm, also bevor meine Nachrichtenschlaufe kommt erstelle ich eigentlich alle Fenster in der WinMain Funktion und prüfe zudem,
    ob die Handles richtig initialisiert wurden (also ob sie nicht == NULL sind). Eigentlich könnte ich es einfach akzeptieren,
    dass es mit der zweiten Methode funktioniert, aber irgendwie interessiert es mich schon warum das mit dem direkten initalisieren nicht klappt 🙂

    Gruss Der Gast



  • Die zweite Methode funktioniert natürlich, die Zuweisungen erfolgen bei jedem Durchlauf, also jedesmal, wenn Windows eine Nachricht an dein Fenster sendet.

    Das erste Mal wird deine Callback-Funktion mit der Nachricht WM_CREATE aufgerufen, und das während des Aufrufs von CreateWindow(Ex). Wenn du die restlichen Fenster anschließend erzeugst, sind die Zuweisungen längst geschehen.

    Was spricht dagegen, die Fenster im WM_CREATE-Zweig zu erzeugen und direkt zuzuweisen, also nicht den Umweg über GetWindow zu gehen?



  • Achso, heisst das also, dass beim Aufruf der CreatWindowEx-Funktion für mein hWnd bereits die Callback-Funktion aufgerufen wird?
    Falls ja, dann verstehe ich warum die erste Methode nicht funktioniert, danke :).
    Dass mit dem Erstellen im WM_CREATE Zweig wäre gar nicht mal so eine schlechte Idee. Das Programm stammt von einem Buch, wobei dort aber die Handles für die Child-Windows global definiert wurden,
    und dann eine Funktion geschrieben wurde um die Child-Windows separat zu kreieren. Als Aufgabe stand dann im Buch, dass man das Programm so umschreiben soll dass die Handles nicht mehr global sind,
    wodurch ich mittels msdn auf GetWindow gekommen bin, um die Handles in der Callback-Funktion bekannt zu machen :).

    Vielen Dank für eure Hilfe!

    Gruss Der Gast



  • Wie geschrieben, WM_CREATE wird nicht dem Message-Queue hinzugefügt, sondern innerhalb von CreateWindow direkt gesendet.

    GetWindow ist imho auch eine schlechte Wahl, um an die Handles von Childs zu kommen. Per GetDlgItem kommst du anhand der ID an die passenden Handles.

    Daher sehe ich auch nicht unbedingt einen Grund, die Handles zu speichern, z.B. kannst du mit

    const int EditFieldID = 30000;
    

    die ID an CreateWindow übergeben und somit jederzeit per GetDlgItem an das Handle des Controls gelangen.



  • Vielen Dank für deine Antwort, GetDlgItem kannte ich bis dato nicht.

    Erscheint mir aber durchaus als sinnvoll, der Erhalt des Handles eines Child-Windows über dessen ID schafft irgendwie mehr Klarheit als das Durchlaufen der Z-Order mit GetWindow 🙂

    Gurss Der Gast


Anmelden zum Antworten