Childwindow in "MainWindow" vergrößern



  • Liebe Forum-Mitglieder,

    in der Main-Funktion meiner Windows-Applikation erzeuge ich vorerst ein "MainWindow", dem ich dann eine Dialogbox hinzufüge.

    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdArgs, int cmdShow) {
    ...
    mainWindow.create();
    ::CreateDialogParam(hInst, ... );     //Dialogbox
    ...
    }
    

    Die Dialogbox soll dabei immer in der linken unteren Ecke erscheinen. Dies funktioniert auch solange bis das Hauptfenster vergrößert/verkleinert wird. Die Dialogbox bleibt dabei leider noch fix!
    Beim vergrößern/verkleinern des Hauptfensters wird afaik die CALLBACK -Funktion aufgerufen, jedoch nicht die CALLBACK -Funktion der Dialogbox, sodass ich dort erst garnicht die Message WM_SIZE o.ä. erhalte. In dieser könnte ich schließlich meine Dialogbox entsprechend mit SetWindowPos neu positionieren.

    Ich habe vorerst ein handle zur Dialogbox global definiert und positioniere meine Dialogbox fortlaufend in meiner MessageLoop . Dies führt selbstverständlich zu augenunfreundlichem Flackern (<-könnte durch bestimmte Abfragen vermieden werden)....

    Daher die Frage an Euch:
    Wie kann ich elegant ein Childwindow positionieren, wenn sich die Parameter des Hauptfensters ändern.

    p.s.: Die Idee in der CALLBACK -Funktion WM_SIZE des MainWindow das handle meiner Dialogbox zu greifen schlug auch fehl

    p.s.s.: Für jeden Hinweis bin ich dankbar

    Gruß maggus


  • Mod

    maggus schrieb:

    p.s.: Die Idee in der CALLBACK -Funktion WM_SIZE des MainWindow das handle meiner Dialogbox zu greifen schlug auch fehl

    Und wie hast Du es gemacht. Es sollte eigentlich funktionieren.



  • Schön, dass Du Dir die Mühe gemacht und mein Problem studiert hast. Dafür schonmal ein Danke.

    In der CALLBACK -Funktion von mainWin kann ich wie folgt das Fenster neu positionieren:

    ...
    case WM_SIZE:
        RECT rect;
        ::GetWindowRect("aktuellesHandle", &rect);	
    
        HWND childWind = FindWindowEx("aktuellesHandle", 0, NULL, L"NAME von MAINWIN");
        SetWindowPos( childWind,0,0,0,rect.right-rect.left,300,SWP_NOZORDER);
    ...
    

    Meine Dialogbox hat eine andere CALLBACK -Funktion und leider auch keinen Namen (vgl. 4ter Parameter von FindWindowEx).
    Ich frage mich gerade, wie ich an ein handle einer Resource finden kann, da meiner Dialogbox ein Resource-File zugrunde liegt....



  • Bei CreateDialogParam(...) bekommst du doch das Handle auf deinen Dialog zurück gegeben. warum nutzt du diesen nicht bei SetWindowPos sondern suchst umständlich über FindWindow deinen Dialog?

    Also die Rückgabe von CreateDialogParam in einer Variable so merken das du diese später wieder verwenden kannst und dein problem sollte sich erledigt haben



  • Dann werde ich mal versuchen das zurückgegebene Handle der Funktion CreateDialogParam(...) als Parameter der CALLBACK -Funktion von mainWindow zu übergeben. Dann dürfte ich mit SetWindowPos(...) gewünschtes Ziel erreichen.

    Vielen Dank CTecS

    bis denne
    maggus

    p.s. ich melde mich nochmal.



  • Der CALLBACK -Funktion einen weiteren Parameter zu übergeben war natürlich nicht möglich.
    Das Handel meiner Dialogbox erhalte ich in der CALLBACK -Funktion von mainWindows mittels get -Funktion, die ich in der Klasse implementiert habe die mein Dialog mit ::CreateDialogParam(...) erzeugt.
    Hier noch eben ein paar Codeschnipsel:

    -----main.h--------

    #include ...
    //Funktionsdeklarationen, unter anderem auch:
    HWND getDialog();
    

    -----main.cpp------

    HWND hDialog;   //global definiertes Handel 
    int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR cmdArgs, int cmdShow) {
    ...
    mainWindow.create();
    hDialog = CreateDialogParam(...);     //Dialogbox
    ...
    }
    
    HWND getDialog() {return hDialog;}
    

    -----procedure.cpp--------

    LRESULT CALLBACK Win::windowProcedure(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
        LRESULT returnValue = 0;        // return value
    
        // Controller des window Handle's
        static Controller *ctrl;
        ctrl = (Controller*)::GetWindowLongPtr(hwnd, GWL_USERDATA);
    
        HWND childWindow = getDialog();     // handle der Dialogbox 
        HWND canvas = FindWindowEx(hwnd, 0, NULL, L"Zeichenfläche");  // handle einer Zeichfläche
    
        switch(msg)
        {
        ...
        case WM_SIZE:
            returnValue = ...   
    	    SetWindowPos(glWindow,HWND_BOTTOM,0,0,200,300,NULL);
    	    SetWindowPos(canvas, HWND_TOP, 0,  HIWORD(lParam)-160,300,160,NULL);
            break;
         ...
         }
    }
    

    Ich hoffe, dass ich dem Forum gerecht geworden bin und soweit alles richtig gemacht habe. Ein Problem wäre damit vorerst gelöst 🙂

    Euch noch viel Spaß beim Programmieren, wünscht euch
    maggus


Anmelden zum Antworten