Verdeckte MessageBox()
-
Hallo miteinander,
ich hab mal eine Frage, von der ich nicht genau weiß wie ich sie kurz formulieren soll, weshalb wahrscheinlich auch meine Forum- und Google-Suchen nicht so erfolgreich verlaufen sind. (Suchbegriffe: MessageBox, WS_VISIBLE)
Ich hab ein Programm geschrieben das ein Hauptfenster mit Menüleiste erzeugt in dessen WindowProc ich bei der Erzeugung ein weiteres (OpenGL-)Fenster mit dem Stiel WS_VISIBLE erzeuge, das das Hauptfenster zur Hälfte abdeckt.
In der WindowProc des Hauptfensters bearbeite ich die nachrichten des Menüs und fange auch Fehler ab.
Jetzt zum Problem. Wenn ein Fehler auftritt gebe ich eine MessageBox() aus um den Benutzer darüber zu informieren. Diese werden jedoch nur akustisch durch den von Windows erzeugten Ton angekündigt, bleiben aber unsichtbar bis die Alt-Taste gedrückt wird.
Dies ist auch der Fall, wenn ich die MessageBox mit dem Style MB_SYSTEMMODAL ausstatte.
Was mache ich falsch? Hier sind Auszüge meines Codes
// ************************************************************************************** // Window Protocoll Function // ************************************************************************************** LRESULT CALLBACK MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { static HWND hGLWnd; static HINSTANCE hInst; // handle to the main-window static int cxClient, cyClient; // Window client size static int numElements; // anzahl an elementen static ProgDATA pd; switch(Msg) { case WM_CREATE: hInst = ((LPCREATESTRUCT)lParam)->hInstance; GLPoints(pd.ListOfGLPoints, 2); GLDistLagr(pd.ListOfGLPoints, pd.ListOfGLLagr, 2); EquiDistLagr(pd.ListOfEquiLagr, 2); SetupScreen(pd.ListOfQuads, pd.pData, pd.ListOfGLPoints, pd.ListOfEquiLagr, pd.ListOfGLLagr); hGLWnd = CreateWindow(TEXT("GL_Window"), 0, WS_CHILDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS /*| WS_VISIBLE*/, 0, 0, 0, 0, hWnd, (HMENU)1, hInst, &pd); ShowWindow(hGLWnd, SW_SHOW); return 0; case WM_SIZE: cxClient = LOWORD(lParam)/2; // set new client width cyClient = HIWORD(lParam); // set new client hight MoveWindow(hGLWnd, LOWORD(lParam)/2, 0, LOWORD(lParam)/2, HIWORD(lParam), TRUE); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case IDM_MESH_AUTOREFINE: // Z.B erscheint dies MessageBox nicht, bzw. nur verdeckt!!! MessageBox(hWnd, TEXT("Automatische Verfeinerung ist noch nicht installiert!"), TEXT("TreeSplit"), MB_OK | MB_ICONINFORMATION | MB_APPLMODAL); return 0; // ... weitere case-Zweige der Menüpunkte } break; case WM_PAINT: { HBRUSH hBlueBrush, hRedBrush, hBrushOld; // drawing color HPEN hBluePen, hRedPen, hPenOld; // drawing Pen LOGFONT lf; PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // ... drawing 2D things EndPaint(hWnd, &ps); } return 0; case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd, Msg, wParam, lParam); } LRESULT CALLBACK GLWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { static PIXELFORMATDESCRIPTOR pdf; pdf.nSize = sizeof(PIXELFORMATDESCRIPTOR); pdf.nVersion = 1; pdf.dwFlags = PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL; pdf.iPixelType = PFD_TYPE_RGBA; pdf.cColorBits = 16; pdf.cRedBits = 0; pdf.cRedShift = 0; pdf.cGreenBits = 0; pdf.cGreenShift = 0; pdf.cBlueBits = 0; pdf.cBlueShift = 0; pdf.cAlphaBits = 0; pdf.cAlphaShift = 0; pdf.cAccumBits = 0; pdf.cAccumRedBits = 0; pdf.cAccumGreenBits = 0; pdf.cAccumBlueBits = 0; pdf.cAccumAlphaBits = 0; pdf.cDepthBits = 16; pdf.cStencilBits = 0; pdf.cAuxBuffers = 0; pdf.iLayerType = PFD_MAIN_PLANE; pdf.bReserved = 0; pdf.dwLayerMask = 0; pdf.dwVisibleMask = 0; pdf.dwDamageMask = 0; static HDC hdc = 0; static HGLRC rc = 0; static int PixelFormat = 0; static pProgDATA ppd; switch(Msg) { case WM_CREATE: ppd = (pProgDATA)((LPCREATESTRUCT)lParam)->lpCreateParams; if (!(hdc = GetDC(hWnd))) { MessageBox(hWnd, TEXT("Unable to create a device context for the GL window!"), TEXT("Error"), MB_OK | MB_ICONERROR); DestroyWindow(GetParent(hWnd)); } if (!(PixelFormat = ChoosePixelFormat(hdc, &pdf))) { MessageBox(hWnd, TEXT("Unable to find a suitable pixel format!"), TEXT("Error"), MB_OK | MB_ICONERROR); DestroyWindow(GetParent(hWnd)); } if (!SetPixelFormat(hdc, PixelFormat, &pdf)) { MessageBox(hWnd, TEXT("Unable to set the pixel format!"), TEXT("Error"), MB_OK | MB_ICONERROR); DestroyWindow(GetParent(hWnd)); } if (!(rc = wglCreateContext(hdc))) { MessageBox(hWnd, TEXT("Unable to get a rendering context!"), TEXT("Error"), MB_OK | MB_ICONERROR); DestroyWindow(GetParent(hWnd)); } if (!wglMakeCurrent(hdc, rc)) { MessageBox(hWnd, TEXT("Unable to make the rendering context current!"), TEXT("Error"), MB_OK | MB_ICONERROR); DestroyWindow(hWnd); } if (!InitGL(ppd)) { MessageBox(hWnd, TEXT("Initialization failed."), TEXT("Error"), MB_OK | MB_ICONEXCLAMATION); DestroyWindow(GetParent(hWnd)); } return 0; case WM_SIZE: ResizeGlScene(LOWORD(lParam), HIWORD(lParam)); return 0; case WM_PAINT: DrawGLScene(); SwapBuffers(hdc); return 0; case WM_DESTROY: KillGlWindow(hWnd, hdc, rc); } return DefWindowProc(hWnd, Msg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { WNDCLASSEX wndclass; wndclass.cbSize = sizeof(WNDCLASSEX); wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wndclass.hInstance = hInstance; wndclass.lpfnWndProc = MainWndProc; wndclass.lpszClassName = TEXT("3dTest_OpenGL"); wndclass.lpszMenuName = TEXT("TestProg"); wndclass.style = CS_HREDRAW | CS_VREDRAW; if (!RegisterClassEx(&wndclass)) { MessageBox(0, "Programm arbeitet mit Unicode und setzt windows NT voraus!", "3dTest_OpenGL", MB_OK | MB_SYSTEMMODAL | MB_ICONERROR); return 0; } wndclass.hIcon = 0; wndclass.hIconSm = 0; wndclass.lpfnWndProc = GLWndProc; wndclass.lpszClassName = TEXT("GL_Window"); wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; wndclass.hbrBackground = 0; wndclass.cbWndExtra = sizeof(LPARAM); if (!RegisterClassEx(&wndclass)) { MessageBox(0, "Programm arbeitet mit Unicode und setzt windows NT voraus!", "GL_Window", MB_OK | MB_SYSTEMMODAL | MB_ICONERROR); return 0; } HWND hWnd = CreateWindow(TEXT("3dTest_OpenGL"), TEXT("3d Test OpenGL"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, hInstance, 0); if (!hWnd) { MessageBox(0, TEXT("Die Erzeugung des Anwendungsfensters ist fehlgeschlagen!"), TEXT("3d Test OpenGL"), MB_OK | MB_SYSTEMMODAL | MB_ICONERROR); return 0; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); MSG msg; BOOL bRet = false; HACCEL hAccel = LoadAccelerators(hInstance, TEXT("TestProg")); while (bRet = GetMessage(&msg, 0, 0, 0)) { if (bRet == -1) { MessageBox(hWnd, TEXT("Fehler in der Nachrichtenschlange!"), TEXT("3d Test OpenGL"), MB_OK | MB_ICONERROR); return 0; } else if (hDlgRefine == 0 || !IsDialogMessage(hDlgRefine, &msg)) { if (!TranslateAccelerator(hWnd, hAccel, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } return int(msg.wParam); }Herzlichen Dank im voraus für jegliche Hilfe
Viele Grüße
Knecht
-
Liegt wohl daran, dass dein 2tes Fenster ein Child ist. Mach mal das break am Ende von WM_COMMAND zu einem return.
-
Hallo miteinander,
@WebFritzi: Danke für den Hinweis mit dem break, habe ich sofort ausgebessert.

Aber sonst stehe ich glaube ich gerade etwas auf dem schlauch. Kannst Du mir bitte kurz erklären, wie der WS_CHILD-Stiel die MessageBox beinflusst, bzw. wie ich sie aufrufen muss, damit sie sichtbar erscheint?

Herzlichen Dank!
Viele Grüße
Knecht
-
So ganz versteh ich jetzt nicht das Problem, aber probier mal das Flag
MB_SETFOREGROUNDder MessageBox mitzugeben.
-
Hallo miteinander,
habe leider vergessen diese Flag zu erwähnen, aber auch mit diesem Flag bleibt die MessageBox verborgen. Trotzdem danke für den Hinweis.
Hat noch jemand eine Idee woran das liegen kann? Danke schon mal im voraus
Viele Grüße
Knecht
-
Wozu ist denn dieses zweite Fenster gedacht?
-
WebFritzi schrieb:
Wozu ist denn dieses zweite Fenster gedacht?
Das Programm passt 2d-FEM-Netze für die "Discontinuous Galerkin Methode" lokal an um den fehler zu verringern. Im Hauptfenster benutze ich die Paint funktionen der API um das Netz darzustellen auf dem gerechnet wird.
Im zweiten (child-)Fenster, das ein OpenGL-Fenster ist stelle ich die approximierte Funktion über der Domain dar (-> 2d-Domain + Lösung = 3D).
Viele Grüße
Knecht
-
Hat niemand eine Idee, weshalb die Message Boxen nicht angezeigt werden?
Bin um jeden Hinweis dankbar.
Was ich noch dazu sagen wollte: Auch Meldungen vom System, die während der Entwicklung aufgetreten sind bleiben verdeckt.
-
Das Problem liegt bei dem OGL Fenster, denn dieses verdeckt immer die MessageBox.
Die Fehler musst du schon in eine Datei schreiben, und später auswerten.
Oder aber du versteckst kurz vor der MessageBox das OGL Fenster.
-
Und wieso verdeckt das OGL-Fenster die MessageBox? Und welches meinst du damit? Das Hauptfenster oder das Child?
-
Warum das so ist, weiß ich nicht genau, aber das Problem hat man auch mit Direct3D.
Ich meine das Child-window.
-
qasdfgh schrieb:
Warum das so ist, weiß ich nicht genau, aber das Problem hat man auch mit Direct3D.
Ich meine das Child-window.Ich glaube, dass es etwas mit dem "double-buffering" zu tun hat, würde aber ungerne meinen Hintern darauf verwetten...
Jedenfalls nochmal Danke an alle die versucht haben zu helfen.
Viele Grüße
Knecht