Tab Controll -> Dialog zu Laufzeit ändern !



  • Was für einen Fehler meldet er denn?



  • Unwissender schrieb:

    delete phDlg[2];
    

    Was macht denn das?



  • @flenders

    Ich hab mal einen Screenshot vom Fehler gemacht http://nixosoft.firemans-page.de/Sicherheit/IUpload/fehler.JPG.

    Der Debugger meint es liege am Befehl:

    phDlg[2] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DlgProc2);
    

    @-King-
    Da hatte ich was probiert 😃 - aber ohne delete stützt das Programm genauso (siehe Screenshot) ab 😞

    Es muss doch aber möglich sein, den Dialog zur Laufzeit zu ändern 😕

    MfG Unwissender 🙂



  • Hast du in Userdata einen Pointe auf phDlg Array gespeichert? zeig mal den Code, wie du das anstellst - da liegt nämlich imho der Fehler. Oder müsste es so aussehen 😕 :

    *phDlg = (HWND*)GetWindowLongPtr(hWnd, GWLP_USERDATA);
    


  • Hi,

    So werden die Dialoge initialisiert:

    phDlg    = new HWND[8];
                 phDlg[0] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG1), hWnd, DlgProc1);
                 phDlg[1] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DlgProc2);
    			 phDlg[2] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG3), hWnd, DlgProc3);
    			 phDlg[3] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG4), hWnd, DlgProc4);
    			 phDlg[4] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG5), hWnd, DlgProc5);
    			 phDlg[5] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG6), hWnd, DlgProc6);
    			 phDlg[6] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG7), hWnd, DlgProc7);
    			 phDlg[7] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG8), hWnd, DlgProc8);
    
    SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)phDlg);
    

    MfG Unwissender 🙂



  • Hast du meinen Code mal ausprobiert 🙄



  • @flender
    Ja - kann ich aber nicht compilieren 😞

    Fehler:

    HWND* kann nicht in HWND konvertiert werden.

    MfG Unwissender



  • Hast du das delete phDlg[2]; jetzt eigentlich rausgenommen - ist da nämlich völlig fehl am Platz

    Das mit dem *phDlg = ... war glaub' ein Denkfehler meinerseits 🙄



  • Moin,

    Das mit dem delete war ein Test von mir - das hab ich natürlich wieder rausgenommen - doch leider geht es trotzdem nicht :(. Es muss doch aber einen Code geben, der es möglicht macht ein TabControl - Registerkarte -> im laufenden Betrieb zu ändern 😞 - hast du flenders keinen Code dazu 😃

    MfG Unwissender



  • ((LPCREATESTRUCT)lParam)->hInstance funktioniert nur in WM_CREATE
    Du solltest also am Bestem in WM_CREATE hInstance in einer WndProc-statischen Variable speichern und dann mit dieser weiterarbeiten
    War erst gestern die Ursache für ein Problem 😉



  • Super super super - das war der Fehler - danke danke danke danke danke 🙂

    MfG Unwissender 🙂



  • Schei*** 😡

    Jetzt hab ich das nächste Problem - ich kann nun zwar das Fenster ändern - doch ledier wird es erst richtig angezeigt, nachdem ich das Hauptfenster minimiert bzw. die Größe verändert habe - manuel.

    Probiert hab ich bis jetzt folgendes:

    //... Neuen Dialog initialisiert in phDlg[2] - nun anzeigen
    				 SendMessage(hWnd,WM_SIZE,SIZE_RESTORED,0); // WM SIZE
    
    				 InvalidateRect(phDlg[2],NULL,TRUE); // Neuer Dialog updaten
    				 UpdateWindow(phDlg[2]);
    				 InvalidateRect(hWndTemp,NULL,TRUE);// TAB updaten
    				 UpdateWindow(hWndTemp);
    				 InvalidateRect(hWnd,NULL,TRUE);// Hauptfenster updaten
    				 UpdateWindow(hWnd);
    

    Warum geht InvalidateRect und WM_SIZE nicht ???

    MfG Unwissender 🙂



  • Kann es sein, dass du das Fenster noch gar nicht angezeigt hast? -> ShowWindow / UpdateWindow



  • Doch hab ich - aber zu Sicherheit hier nochmal:

    //... Neuen Dialog initialisiert in phDlg[2] - nun anzeigen
    				 SendMessage(hWnd,WM_SIZE,SIZE_RESTORED,0); // WM SIZE
    
    				 ShowWindow(phDlg[2],SW_SHOW);
    				 UpdateWindow(phDlg[2]);
    				 ShowWindow(hWndTemp,SW_SHOW); // Normal zum test
    				 UpdateWindow(hWndTemp);
    
    				 InvalidateRect(phDlg[2],NULL,TRUE); // Neuer Dialog updaten
    				 UpdateWindow(phDlg[2]);
    				 InvalidateRect(hWndTemp,NULL,TRUE);// TAB updaten
    				 UpdateWindow(hWndTemp);
    				 InvalidateRect(hWnd,NULL,TRUE);// Hauptfenster updaten
    				 UpdateWindow(hWnd);
    

    Dieser Code geht auch nicht. Erst wenn ich das Fenster minimiere oder einwenig vergrössere wird alles richtig angezeigt 😕. Aber ich schick doch die richtigen Messages - oder ??

    MfG Unwissender 🙂



  • Wie wird es denn angezeigt, wenn es "erst nicht richtig angezeigt" wird?
    Ansonsten könntest du mal mit Spy++ o.ä. nachschauen, was für Messages so gesendet werden



  • Die neue Dialogbox wird oben Links am Fenster angesetzt und überdeckt alles - so scheint es zumindest 😞

    MfG Unwissender



  • Also sie sitzt an der richtigen Stelle, aber die alte Dialogbox wird darunter auch noch angezeigt, oder hab ich's falsch verstanden 🙄
    DestroyWindow(phDlg[2]); hast du ja noch drin gelassen, oder 😉



  • Nein das alte Fenster wird gelöscht. Als Übergangslösung mach ich nun mit MoveWindow(...), das Fenster um ein Pixel grösser und gleich wieder kleiner. Das merkt man zwar nicht und hat nun auch endlich den gewünschten Aktualisierungseffekt - aber ich find es keine elegante Lösung 😉

    MfG Unwissender 🙂


Anmelden zum Antworten