Fenster (CWnd) im Dialog (CDialog)



  • Hallo zusammen!

    Ich erstelle innerhalb eines Dialogs ein neues Fenster. Es soll einfach nur einen Text "Bitte warten" enthalten und die ganze Zeit im Vordergrund sein. Dieses ist folgendermassen implementiert:

    class CSplashWindow : public CWnd
    {
      public:
        CSplashWindow(CWnd *pParentWindow);
        ~CSplashWindow();
    
      protected:
        afx_msg void OnPaint();
        DECLARE_MESSAGE_MAP()
    };
    
    // Implementierung
    
    CSplashWindow::CSplashWindow(CWnd *pParentWindow);
    {
      const CRect size(50, 50, 260, 190);
      CreateEx(WS_EX_CLIENTEDGE,
               NULL,
               "",
               WS_VISIBLE | WS_CHILD | WS_DLGFRAME,
               size,
               pParentWindow,
               9999,
               NULL);
      ShowWindow(SW_SHOWNORMAL);
      UpdateWindow();
    }
    
    CSplashWindow::~CSplashWindow()
    {
      DestroyWindow();
    }
    
    BEGIN_MESSAGE_MAP(CSplashWindow, CWnd)
      ON_WM_PAINT()
    END_MESSAGE_MAP()
    
    void CSplashWindow::OnPaint()
    {
      //Text ausgeben....
    }
    

    Wie schaffe ich es, dass das Fenster jetzt die ganze Zeit im Vordergrund bleibt und möglichst das Hauptfenster deaktiviert ist (also ähnliche Funktion wie ein modaler Dialog, nur, dass das Fenster lediglich einen "Anzeige"-Charakter hat, also keine Interaktion bieten soll wie ein Dialog).
    So, wie es jetzt ist, wird der Grafikkontext von den Dialogelementen des Hauptfensters überdeckt, das sieht gar nicht schön aus.

    Viele Grüsse





  • Habe ich ausprobiert, das Problem besteht immernoch.
    Klicke ich in die Client-Area des Hauptfensters, wird mein "Status"-Fenster nicht neu gezeichnet. Ich suche also nach einer eleganten Möglichkeit, dass nicht die Elemente des Hauptfensters bei einem Click den Focus erhalten, sondern immer mein Statusfenster im Vordergrund bleibt. Benutzereingaben sollen also völlig ignoriert werden (solange ein bestimmter Arbeitsthread aktiv ist).

    Im Prinzip ist das wahrscheinlich trivial, ich habe bloss zu wenig Erfahrung in der MFC-Programmierung. Es soll einfach nur ein weiteres Fenster innerhalb einer Dialog-Anwendung erstellt werden, dass auf keine Benutzereingaben wartet (also keine Buttons oder so hat), sondern von der Anwendung irgendwann automatisch geschlossen wird. Danach geht die Dialog-Anwendung "normal" weiter.

    Viele Gruesse



  • Also ich hätte das so gemacht...

    ...
    CWnd* pWnd = new CWnd();
    pWnd->CreateEx(...);
    pWnd->ShowWindow(SW_SHOW);
    pWnd->UpdateWindow();
    pWnd->SetWindowPos(&CWnd::wndTopMost, 50, 50, 260, 190, SWP_NOMOVE | SWP_NOSIZE);
    

    Musste mal versuchen ...

    Gruß
    :: NoName ::



  • Nimm doch einem modalen Dialog und nimm die Titelleiste weg.

    Dann ist doch die Interaktion weg...?!



  • @ ::NoName::
    Mmh, vielleicht mach ich irgendetwas falsch, aber es klappt leider nicht. Klicke ich in das ParentWindow, ist alles wie bisher. Ich glaube es liegt daran, dass mein Fenster einfach keine WM_PAINT-Message empfängt (also nicht aktualisiert wird), wenn in das ParentWindow geklickt wird.

    @~~~~~~~:
    Daran dachte ich auch schon. Aber wenn ich ein Dialog-Fenster mit doModal() aufrufe, wird ja der Programmablauf erst fortgesetzt, wenn das Fenster geschlossen wird. Es soll aber "parallel" weitergearbeitet werden. Mmh, da könnte ich z.B. einen Thread benutzen und von dort aus das Fenster erstellen. Ok. Aber ist das der eleganteste Weg?

    Viele Gruesse



  • Hi zusammen sorry wenn ich mich hier zwischen dränge, hab ein ähnliches Problem.
    Ich lasse ein Dialogfenster beim start eines SDIs automatisch öffnen und wollte es nun in den Vordergund ins SDI verschieben. klappt alles mit dem code unten nur nicht, das es in der Vordergrund geht??
    Habt ihr dafür ne idee???
    Danke für nen top. Hab es bisher mit minimize und dann wieder maximize gemacht ist aber nicht schön

    VMyDialog::OnInitail()
    {
    ShowWindow(SW_SHOW); 
    UpdateWindow(); 
    SetWindowPos(&CWnd::wndTopMost, 50, 50, 260, 190, SWP_NOMOVE | SWP_NOSIZE);
    }
    


  • @Wahnsinnig

    Erstellst du denn Dialog auch per Create ?

    Gruß
    :: NoName ::



  • HI NoName,

    danke hab es noch mal probiert jetzt klappt es rufe einfach

    SetWindowPos(&CWnd::wndTopMost, 50, 50, 260, 190, SWP_NOMOVE | SWP_NOSIZE);
    

    in OnInitial vom Dialog auf klappt dann. Ich muß dann noch herausfinden, wie man blockieren kann , das ein User den dialog verschieben kann.
    Mal sehen. Oder hast du da evtl. nen Tip



  • Vielleicht könntest du den Dialog einfach für eine Weile disablen!
    Mit z.B. EnableWindow(FALSE);

    Ich bin mir zwar nicht ganz sicher, aber ich glaube wenn man einen Dialog
    disabled dann kann dieser keine Messages mehr verarbeiten, somit wäre meine
    Idee nur sinnvoll wenn in dem Dialog nur ein Text stehen würde wie z.B. "Bitte Warten ..." ...

    Gruß
    :: NoName ::



  • hi noname
    danke für den tip leider soll der user da schon noch was anklicken.

    mal sehen, was ich mir da einfallen lasse. vielleicht nehme ich die ganze leiste am Dialog weg, mal sehen, wie es dann mit dem verschieben aussieht 😃


Anmelden zum Antworten