Problem mit MessageBox()



  • Hallo zusammen!

    Hier mein Code zum besseren Verständnis:

    BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
    {
       HWND hWnd;
    
       hInst = hInstance; // Instanzenhandle in der globalen Variablen speichern
    
       hWnd = CreateDialogW(hInst,(LPCWSTR) IDD_MAIN, NULL, (DLGPROC) WndProc);
    
       if (!hWnd)
       {
          return FALSE;
       }
    
       ShowWindow(hWnd, nCmdShow);
       UpdateWindow(hWnd);
    
       return TRUE;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    	int wmId, wmEvent;
    	PAINTSTRUCT ps;
    	HDC hdc;
    
    	switch (message)
    	{
    	case WM_COMMAND:
    		wmId    = LOWORD(wParam);
    		wmEvent = HIWORD(wParam);
    		// Menüauswahl bearbeiten:
    		switch (wmId)
    		{
    		case ID_TEST:
    			MessageBox(NULL, L"Hallo",L"Test",MB_OK); // <<<<< Darum geht's
    			break;
    
    [...]
    

    Die MessageBox, die in der gekennzeichneten Zeile aufgerufen wird, nimmt keine Befehle an und ich weiß nicht wieso. Das ist aber nur der Fall, wenn sie innerhalb dieser "switch" Anweisung aufgerufen wird. Ich kann weder den "OK" Button drücken, noch funktioniert das X zum schließen. Anscheinend hängt das ganze aber damit zusammen, dass die Anwendung als Hauptfenster eine Dialogbox verwendet.

    Hat jemand einen Tip, wie ich das Problem lösen bzw. umgehen kann?

    Danke schon mal im Voraus,
    veryxRV



  • setz doch ma n breakpoint und schau ob du beim switch ueberhaupt ankommst

    ps. ich selber machs immer so das ich variablen nur deklarieren lass wenn ich sie auch brauch, so kannst du zb die
    int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;
    getrost weglassen und erst deklarieren wenn du sie brauchst, zuden kannst du LOWORD(wParam) usw auch ohne die int benutzen

    //dazuedit, zeig auch mal mitte deinen ganzen switch zweig, hast du ein default?



  • Um Genaueres zu sagen, bräuchte man etwas mehr Code.
    Wie sieht die Auswertung der MessageBox aus?
    Wird die MessageBox vom Dialog oder vom Hauptfenster aufgerufen? Durch die NULL im HWND-Parameter der MessageBox hat die MessageBox gar kein Eltern-Fenster. So weiß das Programm gar nicht, wo es die MessageBox zuordnen soll.



  • Wie oft ich den Fehler jetzt schon gesehen hab...:

    hWnd = CreateDialogW(hInst,(LPCWSTR) IDD_MAIN, NULL, (DLGPROC) WndProc);
    

    Hättest Du das nicht gecastet, wär Dir wahrscheinlich aufgefallen, dass die Syntax für eine Dialog-Prozedur so aussieht:

    INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam);
    

    Falls Du eine Nachricht bearbeitet hast: return (TRUE); , andernfalls return (FALSE); !



  • CodeFinder schrieb:

    Wie oft ich den Fehler jetzt schon gesehen hab...:

    hWnd = CreateDialogW(hInst,(LPCWSTR) IDD_MAIN, NULL, (DLGPROC) WndProc);
    

    Komisch. Hab gerade mal im Petzold nachgeschaut, der macht das auch so. Ist das neu?



  • 😕 ne eigentlich nich neu! 😃



  • Mißverständnis. Ich meinte, ob CodeFinders Methode neu ist, wo doch der Petzold 😕 ... naja ihr wißt schon... 😉

    CodeFinder schrieb:

    INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam);
    


  • definiere Neu ?
    denn das buch hat scho ein paar jahre hinter sich und sind so einige änderungen seit dem hinzugekommen ,unterdessen steht im fast jedem tut ob alt oder neu die methode von CodeFinder 😃



  • Winapi.de schrieb:

    LRESULT CALLBACK ChildProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    LRESULT CALLBACK CheckProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

    http://pronix.linuxdelta.de/C/win32/win32_5.shtml schrieb:

    LRESULT CALLBACK CheckRadioProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
    LRESULT CALLBACK CheckEditProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
    LRESULT CALLBACK CheckListboxProc( HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam )
    {

    http://www.winapi.net/index.php?inhalt=s8 schrieb:

    BOOL CALLBACK DialogProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

    😕 😕 😕
    Seit wann ist denn CodeFinders Methode gültig? Und was bewirkt sie im Vergleich zu der alten Schreibweise?



  • INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam);
    

    Jeder machts anders ???????

    naja wenn ich ne nachrichten prozedure erstelle fürn Dialog nehm ich

    INT_PTR CALLBACK DlgProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM
    


  • INT_PTR .... ist schon richtig, wird aber als true/false verwendet, somit geht auch bool ....



  • Elektronix schrieb:

    Seit wann ist denn CodeFinders Methode gültig? Und was bewirkt sie im Vergleich zu der alten Schreibweise?

    Einfach nur in den Headern nachgucken. Auf/Unter "Win32" bewirkt sie nichts :

    ----------------------
    INT_PTR -> BaseTsd.h :
    ----------------------
    #if defined(_WIN64) 
     typedef __int64 INT_PTR; 
    #else 
     typedef int INT_PTR;        // <- !
    #endif
    ----------------------
    BOOL -> WinDef.h :
    ----------------------
    typedef int BOOL;            // <- !
    

    Bei einer DialogProc soll nur true oder false zurückgegeben werden.
    Bei einer WindowProc kann aber je nach WM_xxxx auch z.B. ein Handle zurückgegeben werden.



  • Huh, was für ein Tumult ich hier ausgelößt habe 😃 ...also der Petzold ist schon etwas älter und so genommen ist es 'neuer'. Der Sinn der Sache ist, dass Eure DlgProc's dann auch auf einem späteren 64-Bit-Rechner funktionieren (nativ). Dafür muss man dann zwar neukompilieren, aber nichts am Quellcodeändern.


Anmelden zum Antworten