Tab Controll -> Dialog zu Laufzeit ändern !
-
Hi,
Ich hab da ein Problem mit dem Tab-Controll - hinter einem Tab-Controll sind Dialogeboxen hinterlegt. Erzeugt wird das Tab Control mit den Boxen wie folgt (THX den Leuten von WinApi.net
)
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);
So nun wird der DialogProzedur 3 (IDD_DIALOG3) ausgewählt, wenn nun der Benutzer da auf einen Button klickt, soll diese Dialogbox3 verschwinden und z.B. Dialogbox 5 erscheinen (dabei bleibt die "Registerkarte" gleich) - nur wie bekomme ich das hin, das ich dann das TabControll diese Nachricht schicke und somit phDlg[2] ändere ???? Oder gibt es vielleicht auch eine andere einfachere Lösung
MfG Unwissender
-
*psuh*
Wieso meldet der Debugger Fehler bei folgendem Code:
WM_ZWEIG: phDlg = (HWND*)GetWindowLongPtr(hWnd, GWLP_USERDATA); DestroyWindow(phDlg[2]); delete phDlg[2]; phDlg[2] = CreateDialog(((LPCREATESTRUCT)lParam)->hInstance, MAKEINTRESOURCE(IDD_DIALOG2), hWnd, DlgProc2); return TRUE;
Wieso kann ich die Handel nicht neu überschreiben ??? Oder besser gesagt, wie kann ich die Handel neu überschreiben
???
MfG Unwissender
-
Was für einen Fehler meldet er denn?
-
Unwissender schrieb:
delete phDlg[2];
Was macht denn das?
-
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 compilierenFehler:
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