schließe ich mein Dialog (und Thread) richtig?



  • Ich möchte einen Thread erstellen der sich um ein Dialogfenster *kümmert*. Der folgende Code dazu funktionert bei mir auch wunderbar aber ich bin mir nicht sicher ob ich den Dialoag "korrekt" schließe. Das Dialogfenster soll sich nur über das "X" in der Titelleiste schließen lassen. Sollte ich jetzt WM_CLOSE abfangen oder reicht ID_CANCEL zum Beenden? Und wozu gibts auch noch WM_DESTROY? *verwirrt* Ist der Code korrekt so? Bin für jeden Tipp dankbar.

    #include <windows.h>
    #include "resource.h"
    
    LRESULT CALLBACK DlgProc(HWND hWndDlg, UINT Msg, WPARAM wParam, LPARAM lParam)
    {
        switch(Msg)
        {
        case WM_INITDIALOG:
    		// init my stuff here
            return TRUE;
    	case WM_CLOSE:
    		PostQuitMessage(0);
    		break;
        case WM_COMMAND:
            switch(wParam)
            {
            case IDCANCEL:
    			// ??
    			return TRUE;
            }
            break;
    	}
        return FALSE;
    }
    
    DWORD WINAPI DialogThread(LPVOID lpParameter)
    {
    	MSG  msg;
    	BOOL bRet;
    	HWND hwnd_dialog_main;
    
    	MessageBoxA(0,"THREAD START","debug",MB_OK);
    
    	hwnd_dialog_main = CreateDialog(NULL,MAKEINTRESOURCE(IDD_DIALOG1),0,reinterpret_cast<DLGPROC>(DlgProc));
    	if (hwnd_dialog_main == 0)
    	{
    		MessageBoxA(0,"hwnd_dialog_main error",0,MB_OK);
    		return 0;
    	}
    	ShowWindow(hwnd_dialog_main,SW_SHOW);
    
    	while ( (bRet=GetMessage(&msg,0,0,0)) != 0 )
    	{
    		if (bRet == -1)
    		{
    			MessageBoxA(0,"GetMessage() error",0,MB_OK);
    			break;
    		}
            if(!IsDialogMessage(hwnd_dialog_main, &msg))
            {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
    	}
    	EndDialog(hwnd_dialog_main,0);
    	MessageBoxA(0,"THREAD END","debug",MB_OK);
    	return ERROR_SUCCESS;
    }
    
    int main()
    {
    	CreateThread(NULL,NULL,&DialogThread,NULL,NULL,NULL);
    	while (!(GetKeyState('1')&0x8000))
    	{
    		Sleep(20);
    	}
    	return ERROR_SUCCESS;
    }
    


  • WM_CLOSE -> DestroyWindow()
    ID_CANCEL -> DestroyWindow()
    WM_DESTROY -> PostQuitMessage()


  • Mod

    Wenn Du das so machst kanst Du auch einfach DialogBox aufrufen, statt CreateDialog, ShowDialog, MessageLoop



  • Vielen Dank! Ihr habt mir beide sehr geholfen. Habe den ganzen Krempel auch gegen DialogBox(...) ausgetauscht. Da ich sehr viele Dialoge *basteln* will erhöht das die übersicht im Code enorm.

    @Martin: "Beiträge: 8999" .. na komm einer geht noch! 😛


  • Mod

    ichbinnureingast schrieb:

    Vielen Dank! Ihr habt mir beide sehr geholfen. Habe den ganzen Krempel auch gegen DialogBox(...) ausgetauscht. Da ich sehr viele Dialoge *basteln* will erhöht das die übersicht im Code enorm.

    @Martin: "Beiträge: 8999" .. na komm einer geht noch! 😛

    Schon passiert. Der hier ist dan aus reinem Fun 9001... 🕶


Anmelden zum Antworten