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_SETFOREGROUND
    

    der 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


Anmelden zum Antworten