Dilaog in Konsolenanwendung öffnen



  • Guten Morgen,

    habe folgendes Problem. möchte ein Dialog (RESOURCE) in einer Win32 Konsolenanwendung öffnen. Hab schon mehrere Möglichkeiten ausprobiert. Entweder hängt sich das Programm auf oder es tut sich gar nichts.

    Jetzt wollte ich fragen ob das überhaupt möglich ist ohne MFC bzw. ob das einer von euch schon mal gemacht hat.

    Vielen Dank für eure Hilfe.

    Gruß pmb



  • pmb schrieb:

    Jetzt wollte ich fragen ob das überhaupt möglich ist ohne MFC bzw. ob das einer von euch schon mal gemacht hat.

    Ich tu jetzt einfach mal so, als hättest du nicht nur gewollt, sondern gleich gefragt 😉

    Ja, das ist möglich ohne MFC, und ja, das hat einer von uns schon mal gemacht.


  • Mod

    Die MFC macht hier keine Unterschiede zur Windows API.
    Ich würde sogar eher sagen, Du hast ein Problem mit der MFC das in einer Konsolen-Anwendung zu machen. 😉



  • Alles klar dann vergiss das "wollte" 😉

    Hat jemand n Codeschnipsel etc. für mich.

    CFehler* m_Dialog;
    m_Dialog = new CFehler();      
    m_Dialog->Create(IDD_FEHLER, AfxGetMainWnd());
    m_Dialog->ShowWindow(SW_SHOW);
    

    So funktioniert es nicht.


  • Mod

    Kann nicht funktionieren. Denn das ist ein "nicht modaler Dialog".

    So was kann nicht gehen, denn eine Konsolenanwendung hat keine Messageloop im klassischen Sinn.

    Modale Dialoge (mit eigener Message-Loop gehen). Hier müsstest Du einen UI Thread mit eigener Messageloop bauen.



  • pmb schrieb:

    So funktioniert es nicht.

    Willst du jetzt mit MFC oder ohne?
    Modal oder nicht?



  • Hab ein Ressourceobjekt ( IDD_DIALOG ).
    Das soll geöffnet werden. Am besten nicht Modal und ohne MFC.




  • Mod

    MFK schrieb:

    http://msdn.microsoft.com/en-us/library/ms645434(v=vs.85).aspx

    Das kann doch ohne Message-Loop nicht funktionieren. Und eine Konsolenanwendung hat keine. Also genügt en Link auf CreateDialog wohl nicht.



  • @Martin
    Was meinst du damit ?
    Hast du dann ein anderen Lösungsvorschlag mit Code.
    Würde mir sehr helfen. Bin ein bisschen in Zeitnot.

    @MFK
    CrateDialog habe ich vorher bereits versucht.
    Ging aber nicht

    Gruß pmb



  • pmb schrieb:

    CrateDialog habe ich vorher bereits versucht.
    Ging aber nicht

    Ganz tolle Fehlerbeschreibung.

    Hattest du denn eine Message Loop? Du musst deinen Dialog selbst mit Nachrichten versorgen, wenn er nicht modal ist.



  • Hier ist mein alter Code:

    HWND g_Dialog = NULL;
    MSG Msg;
    
    g_Dialog = CreateDialog(GetModuleHandle(NULL), MAKEINTRESOURCE(IDD_FEHLER),0,0);
    if(g_Dialog != NULL){ShowWindow(g_Dialog, SW_SHOW);}
    else { MessageBox(0, "CreateDialog returned NULL", "Warning!",  MB_OK | MB_ICONINFORMATION); }
    
    while(GetMessage(&Msg, NULL, 0, 0))
    {
      if(!IsDialogMessage(g_Dialog, &Msg))
      {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
      }
    }
    

  • Mod

    pmb schrieb:

    @Martin
    Was meinst du damit ?
    Hast du dann ein anderen Lösungsvorschlag mit Code.
    Würde mir sehr helfen. Bin ein bisschen in Zeitnot.

    Nein. Oder vielleicht hätte ich den sogar, aber ich habe keine Lust auf solche Anfragen zu reagieren, die scheinbar sowieso nicht berücksichtigen was man sagt.

    Für Deine Zeitnot kann ich nichts. Mir programmiert auch keiner was, wen ich in Zeitnot bin.

    Ich habe Dir alles geschrieben, was an Wissen nötig ist. Du benötigst eine Messageloop, oder einen separaten UI Thread, der den Dialog erzeugt und die Messageloop hostet.



  • Eine DialogProc (4. Parameter von CreateDialog) wäre schon hilfreich. Irgendwo musst du ja beschreiben, was der Dialog tun soll.



  • @MFK
    Also hier der neue Code:

    BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) 
    { 
     switch (uMsg) 
     { 
     case WM_INITDIALOG: 
    	EnableWindow(hwnd, TRUE); 
      break; 
    
      case WM_COMMAND: 
      switch (LOWORD(wParam)) 
      { 
      case IDOK: 
       { 
        EndDialog(hwnd, wParam); 
        PostQuitMessage(0); 
        return true; 
       } 
       break; 
      case IDCANCEL: 
       { 
        EndDialog(hwnd, wParam); 
        PostQuitMessage(0); 
        return true; 
       } 
       break; 
      } 
     } 
     return true; 
    }
    
    void FehlerAnzeige()
    {
    	MSG msg; 
        HWND hwnd = NULL; 
    	hwnd = CreateDialog(GetModuleHandle(NULL),MAKEINTRESOURCE(IDD_FEHLER), NULL, (DLGPROC) DialogProc); 
    	ShowWindow(hwnd, SW_SHOW); 
    	 BOOL bRet; 
    	 while ( (bRet = GetMessage(&msg, NULL, 0, 0)) != 0 ) 
    	 { 
    	  if (bRet == -1 ) 
    	  { 
    	   // handle the error and possibly exit 
    	  } 
    	  else if (!IsWindow(hwnd) || !IsDialogMessage(hwnd, &msg)) 
    	  { 
    	   TranslateMessage(&msg); 
    	   DispatchMessage(&msg); 
    	  } 
    	 } 
    	 return; 
    }
    

    Aber öffnen tut er nicht.



  • Die DialogProc sollte nur TRUE zurückgeben, wenn sie die Nachricht verarbeitet, ansonsten FALSE.



  • Also jetzt hab ich es so:

    BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) 
    { 
     switch (uMsg) 
     { 
     case WM_INITDIALOG: 
    	EnableWindow(hwnd, TRUE); 
    return true;
    
      break; 
    
      case WM_COMMAND: 
      switch (LOWORD(wParam)) 
      { 
      case IDOK: 
       { 
        EndDialog(hwnd, wParam); 
        PostQuitMessage(0); 
        return true; 
       } 
       break; 
      case IDCANCEL: 
       { 
        EndDialog(hwnd, wParam); 
        PostQuitMessage(0); 
        return true; 
       } 
       break; 
      } 
     } 
     return false; 
    }
    


  • Du antwortest mit FALSE auf WM_INITDIALOG.



  • So jetzt aber.
    Eigentlich habe ich doch aber vorher schon mit return true geantwortet.

    BOOL CALLBACK DialogProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam ) 
    { 
     switch (uMsg) 
     { 
     case WM_INITDIALOG: 
    	EnableWindow(hwnd, TRUE); 
    	return true;
      break; 
    
      case WM_COMMAND: 
    	switch (LOWORD(wParam)) 
    	  { 
    	  case IDOK: 
    	   { 
    		EndDialog(hwnd, wParam); 
    		PostQuitMessage(0); 
    		return true; 
    	   } 
    	   break; 
    	  case IDCANCEL: 
    	   { 
    		EndDialog(hwnd, wParam); 
    		PostQuitMessage(0); 
    		return true; 
    	   } 
    	   break; 
    	 } 
       break;
     } 
     return false; 
    }
    


  • Sollte jetzt funktionieren.


Log in to reply