Erweiterte MessageBox



  • Hallo,

    ich schreibe gerade ein WinAPI-Programm und an einer Stelle möchte ich die Bestätigung des Anwenders für weitere Schritte haben. Das könnte ich problemlos mit der Funktion MessageBox() mit dem Parameter MB_YESNO machen, aber ich möchte zusätzlich die Option geben, dass die Bestätigung nicht nochmal angezeigt wird, und dazu gibt es keinen default style für die Messageboxes. Also habe ich mir das Fenster selber erstellt (mit Ressourcen). Alles funktioniert einwandfrei, aber ich möchte nur wissen, ob das so geht und es keine Schwachstellen besitzt 🙂
    Ich erstelle das modelss window mit:

    int iCofirmResult = DialogBox(hInst, MAKEINTRESOURCE(IDR_CONFIRMSYNC), hDlgMain, (DLGPROC)ConfirmSync);
    

    Die Funktion an sich macht nicht viel - gibt nur einen Rückgabewert zurück (je nach dem, auf was geklickt wurde):

    LRESULT CALLBACK ConfirmSync(HWND hWndDlgConf, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(Msg)
    	{
    	case WM_COMMAND:
    		{
    			switch (LOWORD(wParam))
    			{
    			case ID_PROCEED:
    				{
    					EndDialog(hWndDlgConf, 11);
    					//return TRUE; da das Fenster beendet wird
    				}
    
    			case IDCANCEL:
    				{
    					EndDialog(hWndDlgConf, 0);
    					//return FALSE;
    				}
    			}
    
    		} break;
    	}
    	return FALSE;
    }
    

    Danke!

    Edit: Eigentlich braucht man auch das "return FALSE" am Ende nicht, weil das Programm viel früher beendet wird, oder?



  • Vor "case IDCANCEL:" fehlt noch "break;". Außerdem solltest Du WM_INITDIALOG mit TRUE beantworten, damit der Focus entsprechend gesetzt wird. Und das return FALSE brauchst Du selbstverständlich, da sonst kein Wert zurückgeben wird.

    Das, was Du haben willst, gibt es aber auch bereits in fertig, siehe SHMessageBoxCheck.



  • Danke für den Hinweis, bei den Shells habe ich nicht geguckt 😉 Aber wenn ich das richtig verstanden habe, dann übernimmt die EndDialog()-Funktion beim Schließen die Rückgabe eines Wertes der Funktion (2. Parameter), sodass return (und damit auch break )überflüssig wird (das Fenster wird schon davor gelöscht). Deswegen habe ich das auch auskommentiert.



  • Dein Fenster bekommt aber auch andere Messages als WM_COMMAND - und dann wird EndDialog nicht aufgerufen.


Anmelden zum Antworten