Dilaog in Konsolenanwendung öffnen
-
Alles klar dann vergiss das "wollte"
Hat jemand n Codeschnipsel etc. für mich.
CFehler* m_Dialog; m_Dialog = new CFehler(); m_Dialog->Create(IDD_FEHLER, AfxGetMainWnd()); m_Dialog->ShowWindow(SW_SHOW);
So funktioniert es nicht.
-
Kann nicht funktionieren. Denn das ist ein "nicht modaler Dialog".
So was kann nicht gehen, denn eine Konsolenanwendung hat keine Messageloop im klassischen Sinn.
Modale Dialoge (mit eigener Message-Loop gehen). Hier müsstest Du einen UI Thread mit eigener Messageloop bauen.
-
pmb schrieb:
So funktioniert es nicht.
Willst du jetzt mit MFC oder ohne?
Modal oder nicht?
-
Hab ein Ressourceobjekt ( IDD_DIALOG ).
Das soll geöffnet werden. Am besten nicht Modal und ohne MFC.
-
-
MFK schrieb:
http://msdn.microsoft.com/en-us/library/ms645434(v=vs.85).aspx
Das kann doch ohne Message-Loop nicht funktionieren. Und eine Konsolenanwendung hat keine. Also genügt en Link auf CreateDialog wohl nicht.
-
@Martin
Was meinst du damit ?
Hast du dann ein anderen Lösungsvorschlag mit Code.
Würde mir sehr helfen. Bin ein bisschen in Zeitnot.@MFK
CrateDialog habe ich vorher bereits versucht.
Ging aber nichtGruß pmb
-
pmb schrieb:
CrateDialog habe ich vorher bereits versucht.
Ging aber nichtGanz tolle Fehlerbeschreibung.
Hattest du denn eine Message Loop? Du musst deinen Dialog selbst mit Nachrichten versorgen, wenn er nicht modal ist.
-
Hier ist mein alter Code:
HWND g_Dialog = NULL; MSG Msg; g_Dialog = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_FEHLER),0,0); if(g_Dialog != NULL){ShowWindow(g_Dialog, SW_SHOW);} else { MessageBox(0, "CreateDialog returned NULL", "Warning!", MB_OK | MB_ICONINFORMATION); } while(GetMessage(&Msg, NULL, 0, 0)) { if(!IsDialogMessage(g_Dialog, &Msg)) { TranslateMessage(&Msg); DispatchMessage(&Msg); } }
-
pmb schrieb:
@Martin
Was meinst du damit ?
Hast du dann ein anderen Lösungsvorschlag mit Code.
Würde mir sehr helfen. Bin ein bisschen in Zeitnot.Nein. Oder vielleicht hätte ich den sogar, aber ich habe keine Lust auf solche Anfragen zu reagieren, die scheinbar sowieso nicht berücksichtigen was man sagt.
Für Deine Zeitnot kann ich nichts. Mir programmiert auch keiner was, wen ich in Zeitnot bin.
Ich habe Dir alles geschrieben, was an Wissen nötig ist. Du benötigst eine Messageloop, oder einen separaten UI Thread, der den Dialog erzeugt und die Messageloop hostet.
-
Eine DialogProc (4. Parameter von CreateDialog) wäre schon hilfreich. Irgendwo musst du ja beschreiben, was der Dialog tun soll.
-
@MFK
Also hier der neue Code:BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: EnableWindow(hwnd, TRUE); break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { EndDialog(hwnd, wParam); PostQuitMessage(0); return true; } break; case IDCANCEL: { EndDialog(hwnd, wParam); PostQuitMessage(0); return true; } break; } } return true; }
void FehlerAnzeige() { MSG msg; HWND hwnd = NULL; hwnd = CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_FEHLER), NULL, (DLGPROC) DialogProc); ShowWindow(hwnd, SW_SHOW); BOOL bRet; while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 ) { if (bRet == -1 ) { // handle the error and possibly exit } else if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return; }
Aber öffnen tut er nicht.
-
Die DialogProc sollte nur TRUE zurückgeben, wenn sie die Nachricht verarbeitet, ansonsten FALSE.
-
Also jetzt hab ich es so:
BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: EnableWindow(hwnd, TRUE); return true; break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { EndDialog(hwnd, wParam); PostQuitMessage(0); return true; } break; case IDCANCEL: { EndDialog(hwnd, wParam); PostQuitMessage(0); return true; } break; } } return false; }
-
Du antwortest mit FALSE auf WM_INITDIALOG.
-
So jetzt aber.
Eigentlich habe ich doch aber vorher schon mit return true geantwortet.BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) { switch (uMsg) { case WM_INITDIALOG: EnableWindow(hwnd, TRUE); return true; break; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: { EndDialog(hwnd, wParam); PostQuitMessage(0); return true; } break; case IDCANCEL: { EndDialog(hwnd, wParam); PostQuitMessage(0); return true; } break; } break; } return false; }
-
Sollte jetzt funktionieren.
-
er macht ihn aber einfach nicht auf. Es passiert gar nichts.
Das HWND von CreateDialog ist auch 0.
-
pmb schrieb:
er macht ihn aber einfach nicht auf. Es passiert gar nichts.
Tja, bei mir klappt's, mit einem frischen Dialog.
pmb schrieb:
Das HWND von CreateDialog ist auch 0.
Was sagt denn GetLastError?
-
Habs jetzt auch mal mit einem "frischen" Dialog versucht.
Er öffnet sich nun auch bei mir. Ich hab auch herausgefunden woran es
liegt. Ich benutze ActiveXControls im Dialog. Die verhindern auch, dass der
Dialog nicht aufgeht. Muss ich da nochwas initialisieren ?InitCommonControls(); habe ich mal versucht. Hat aber nichts geholfen.
Vielen Dank schonmal MFK.
Jetzt fehlt noch ein kleiner Schritt