Dilaog in Konsolenanwendung öffnen


  • 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.



  • er macht ihn aber einfach nicht auf. Es passiert gar nichts.
    Das HWND von CreateDialog ist auch 0.



  • pmb schrieb:

    er macht ihn aber einfach nicht auf. Es passiert gar nichts.

    Tja, bei mir klappt's, mit einem frischen Dialog.

    pmb schrieb:

    Das HWND von CreateDialog ist auch 0.

    Was sagt denn GetLastError?



  • Habs jetzt auch mal mit einem "frischen" Dialog versucht.
    Er öffnet sich nun auch bei mir. Ich hab auch herausgefunden woran es
    liegt. Ich benutze ActiveXControls im Dialog. Die verhindern auch, dass der
    Dialog nicht aufgeht. Muss ich da nochwas initialisieren ?

    InitCommonControls(); habe ich mal versucht. Hat aber nichts geholfen.

    Vielen Dank schonmal MFK.
    Jetzt fehlt noch ein kleiner Schritt 🙄



  • pmb schrieb:

    Ich benutze ActiveXControls im Dialog.

    Ich denke, dass das möglich ist, aber ich weiß nicht, wie. Möglicherweise reicht OleInitialize.


Anmelden zum Antworten