Dilaog in Konsolenanwendung öffnen



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



  • OleInitialize() hab ich versucht.
    Hat leider nichts gebracht. Muss ich nochmal bissle googlen.
    Grundsätzlich denke ich auch das es möglich ist.

    Nochmals Vielen Dank


  • Mod

    Das geht gar nicht OleInitialize benötigt ein STA mit Message Loop.

    Weiterhin kannst Du mit Dialogen, die ActiveX Controls beinhalten nicht CreateDialog verwenden. Das ist ein spezielles Feature das nur mit der MFC geht.



  • Wenn Du eine Resource hast, und eine dialogklasse machst Du so:

    zb in einer Konsole anwendung die mindestens MFC statisch linkt und
    und eine dlg.cpp enthält:

    class CLuaEditHost : public CWinThread
    {
    public:
    	CLuaEditHost::CLuaEditHost(CString Path)
    	{
    		m_LuaEdit.m_File = Path;
    
    		CreateThread(CREATE_SUSPENDED);
    		m_bAutoDelete = true;
    		ResumeThread();//WaitForSingleObject(adapter->m_hThread, INFINITE)//delete(adapter) ;
    	}
    
    	virtual ~CLuaEditHost(){};
    
    	BOOL CLuaEditHost::InitInstance()
    	{
    		m_pMainWnd = &m_LuaEdit;
    
    		if(!m_LuaEdit.Create(IDD_LUAEDITOR))
    		 return FALSE;
    
    		return m_LuaEdit.Load(m_LuaEdit.m_File);
    	}
    
    	CLuaEditor    m_LuaEdit;
    };
    

    LuaHost hier als scheinkapsel

    m_pLuaHost = new CLuaEditHost(m_LuaPath);
    getch();//
    

Anmelden zum Antworten