Windows.h -> EnableWindow() -> TRUE -> FALSE -> Window minimiert.. Wieso?



  • Hallo,
    Mein Projekt enthält zwei Windows -> MainWindow und InfoWindow.
    Per Button, innerhalb des MainWindows, wird das InfoWindow gestartet/geöffnet.
    Wird der Button betätigt, wird das MainWindow, mittels EnableWindow(MainhWnd, FALSE), gesperrt.

    • es kann also nur noch das InfoWindow genutzt werden
      Das InfoWindow enthält einen Button - zum Schließen des InfoWindows.
      Wird dieser betätigt, wird das MainWindow, mittels EnableWindow(MainhWnd, TRUE), wieder freigestellt.
      Soweit so gut...
      Wird allerdings das rote Destroy-"X" betätigt (vom InfoWindow), schließt das InfoWindow und das MainWindow minimiert sich.. ?!
      Ich möchte gerne, dass das MainWindow geöffnet bleibt. Ich habe innerhalb der Switch-Abfrage (des InfoWindows) im falle des WM_DESTROY das Fenster auch wieder, mittels EnableWindow(MainhWnd, TRUE), aktiviert. Ich kann es auch manuell wieder öffnen und wieder bedienen.. Ich kann auch ShowWindow(MainhWnd, SW_SHOW(NORMAL)) darein schreiben.. doch es minimiert sich..

    Weiß Jemand wieso und was dabei hilft ?

    LRESULT CALLBACK InfoWindowProcedure(HWND hInfoWindow, UINT msg, WPARAM wp, LPARAM lp) {
    	switch (msg) {
    	case WM_COMMAND:
    		switch (wp) {
    		case BUTTON_SCHLIESSEN:
    			EnableWindow(MainhWnd, TRUE);
    			DestroyWindow(hInfoWindow);
    			break;
    		}
    		break;
    	case WM_CREATE:
    		AddButtonSchliessen(hInfoWindow);
    		break;
    	case WM_DESTROY:
    		EnableWindow(MainhWnd, TRUE);
    		break;
    	default:
    		return DefWindowProcW(hInfoWindow, msg, wp, lp);
    	}
    	return 0;
    }
    


  • Warum benutzt du nicht einfach einen modalen Dialog?



  • Das scheint genau das zu sein, was ich möchte..
    Allerdings bekomme ich die DialogBox nicht richtig eingebunden..
    Es gibt keine Fehler, aber irgendwie startet die Box nicht.

    BOOL CALLBACK DlgProcTest(HWND, UINT, WPARAM, LPARAM);
    
    LRESULT CALLBACK MainWindowProcedure(HWND MainhWnd, UINT msg, WPARAM wp, LPARAM lp) {
    	static HINSTANCE hInstance;
    	switch (msg) {
    	case WM_CREATE:
    		hInstance = ((LPCREATESTRUCT)lp)->hInstance;
    		MainWindow = MainhWnd;
    		AddMenus(MainhWnd);
    		AddControls(MainhWnd);
    		break;
    	case WM_COMMAND:
    		switch (wp) {
    		case FILE_MENU_NEW:
    			MessageBeep(MB_OK);
    			break;
    		case ABOUT_MENU_INFO:
    			//EnableWindow(MainhWnd, FALSE);
    			DialogBox(hInstance, TEXT("IDR_IDD_TESTDIA1"), MainhWnd, DlgProcTest);
    			//infoWindow(MainhWnd, hInstance);
    			break;
    		case FILE_MENU_EXIT:
    			DestroyWindow(MainhWnd);
    			break;
    		case BUTTON_1:
    
    			break;
    		}
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProcW(MainhWnd, msg, wp, lp);
    	}
    	return 0;
    }
    
    BOOL CALLBACK DlgProcTest(HWND hDlg, UINT message,
    	WPARAM wParam, LPARAM lParam)
    {
    	switch (message)
    	{
    	case WM_INITDIALOG:
    		return TRUE;
    
    	case WM_COMMAND:
    		switch (LOWORD(wParam))
    		{
    		case IDOK:
    		case IDCANCEL:
    			EndDialog(hDlg, 0);
    			return TRUE;
    		}
    		break;
    	}
    	return FALSE;
    }
    

    Ressource: https://www.bilder-upload.eu/bild-2547e2-1574858411.png.html



  • Ok... Fehler gefunden:

    Falsch:

    	DialogBox(hInstance, TEXT("IDR_IDD_TESTDIA1"), MainhWnd, DlgProcTest);
    

    Richtig:

    	DialogBox(hInstance, MAKEINTRESOURCE(IDR_IDD_TESTDIA1), MainhWnd, DlgProcTest);
    


  • Noch einmal kurz zur ursprünglichen Frage:
    Die Reihenfolge ist erst Reaktivieren des Hauptfensters, anschließend Zerstören des Childs.
    Wenn du es andersherum machst, sucht der Fenstermanager das nächste aktive Fenster und bringt dieses in den Vordergrund.
    Da es sich dabei wahrscheinlich um die (maximierte) IDE handelt, bist du davon ausgegangen, dass dein Fenster minimiert wurde - ist aber nicht so.
    Aber mit modalen Dialogen fährt man in dem Fall ohnehin besser.



  • es gibt auch noch WM_CLOSE, welches unmittelbar nach dem schließen und nicht erst nach den aufräumarbeiten, gesendet wird. vielleicht geht es damit?



  • @TKuehn Magst Du bitte aufhören Deine Fragen in C++/cli zu stellen? Deine Fragen zur WinAPI gehören dort hin: Betriebssysteme / WinAPI. Danke.



  • @yahendrik Ja, das war wohl der Fehler. Danke dir!

    @Swordfish Aber natürlich, das wusste ich nicht.


Log in to reply