none
CView innerhalb eines Dialoges RRS feed

  • Frage

  • Hi,

    ich hatte es mir einfach gemacht und die View direkt mit dem Dialog als
    Parent zu erzeugen.
    In meinem speziellen Fall ist es eine CListView im Report-Modus.
    Dieser Dialog wird von einem MDI-Child aus erzeugt, dass seinerseits ein
    CListView im Report-Modus ist.

    Wenn ich jetzt in der "Dialog-"View in einen Header zum Sortieren klicke,
    dann landet diese Message aber im View des MDI-Child.

    Die Ursache habe ich herausgefunden:
    Ich habe noch ein SplitterWnd (in dem ist die View eingebettet).
    Und was steht im Quelltext:
    BOOL CSplitterWnd::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
     if (CWnd::OnNotify(wParam, lParam, pResult))
       return TRUE;
     // route commands to the splitter to the parent frame window
     *pResult = EnsureParentFrame()->SendMessage(WM_NOTIFY, wParam, lParam); <- hier geht die Message zum MainFrame- Fenster
       return TRUE;
    }

    und in CMDIFrameWnd::OnCmdMsg ist dann ein pActiveChild->OnCmdMsg(...)
    also kein Wunder soweit wieso die Message fehlgeleitet wird.

    Jetzt ist meine Idee, dass ich im Dialog erst ein CMDIChildWnd als Child einbaue,
    welches als Parent für mein CView/CSplitterWnd fungiert.
    Und hoffentlich MDIActivate passend umsetzt.

    Gibt es fertige Beispiele?
    Ich hatte mich mal auf codeguru umgesehen und nicht wirklich was passendes gefunden.

    Tschüß, Holger.

    Freitag, 4. Februar 2011 13:35

Antworten

  • Das geht auch wieder nicht, weil ein CMDICHild natürlich einen CMDIFRame als Parent erwartet.

    BTW: Welchen Sinn macht ein CListView, wenn Du ein CListCtrl hast?

    Ansonsten Paul DiLascias Artikel, in dem er einen CHTMLView verbiegt.
    http://www.microsoft.com/msj/0100/c/c0100.aspx

    Leider musst Du Wayback verwenden, denn auch dieser Artikel wurde mittlerweile gelöscht. <seufz>


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 4. Februar 2011 16:10
    Moderator
  • Den Artikel habe ich mir angesehn. Ich sehe nicht, dass dieser mir weiterhilft.
    Mein Routingproblem ist ja, dass das SplitterWnd WM_COMMAND/WM_NOTIFY an
    EnsureParentFrame weiterleitet.
    Und da das SplitterWnd direkt im CDialog eingebettet ist, landen die Nachrichten im CMainFrame.

    Eben. Weil ein SplitterWindow auch wieder nur in einem Frame leben darf.
    Dann müsstest Du CSplitterWnd auch anpassen mit einer eigenen Implementierung.

    Vermutlich komme ich nicht drum herum, irgendwann tatsächlich ein MDIChildWnd in den Dialog
    einzubauen, damit das Routing immer richtig läuft.
    Mal sehen.

    Das habe ich Dir schon gesagt, dass es nicht geht. Ein MDI-Child erwartet immer ein MDI-Frame als Parent.

    In der BCG, habe ich mal Code geschrieben, mit der man ein eigenes CFrameWnd als "modalen Dialog" starten kann. Ob das in der MFC-Next geht kann ich Dir nicht sagen.

    Alternativ (aber auch Klimmzug)
    - neuen UI Thread starten
    - in diesem neuen UI Thread ein eigene CFrameWnd öffnen
    - eigenes/eigentliches CMainFrame disablen
    - Nun Message Pump ausführen und warten bis der UI Thread terminiert.

    Dann hast Du ähnliches "modales Verhalten" eines CFrameWnd.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 7. Februar 2011 09:57
    Moderator

Alle Antworten

  • Man kann Views nicht n Dialogen untrbringen. Views benötigen ein CFRameWnd als descendant Parent. Ansonsten geht alles Routing in die Hose.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 4. Februar 2011 15:19
    Moderator
  • Hi,

    "Martin Richter [MVP]" schrieb im Newsbeitrag news:2226bc20-a54b-496c-9b8e-34c5faf76ebc@communitybridge.codeplex.com...

    Man kann Views nicht n Dialogen untrbringen. Views benötigen ein CFRameWnd als descendant Parent. Ansonsten geht alles Routing in die Hose.

    genau dass wäre meine Idee:
    der Dialog hat ein CMDIChildWnd als Child und in dieses wird die CView eingebunden...
    Aber auch das hat sicherlich diverse Fallstricke. Deshalb die Suche nach einem "fertigen" Framework

    tschüß, Holger.

    Freitag, 4. Februar 2011 15:25
  • Das geht auch wieder nicht, weil ein CMDICHild natürlich einen CMDIFRame als Parent erwartet.

    BTW: Welchen Sinn macht ein CListView, wenn Du ein CListCtrl hast?

    Ansonsten Paul DiLascias Artikel, in dem er einen CHTMLView verbiegt.
    http://www.microsoft.com/msj/0100/c/c0100.aspx

    Leider musst Du Wayback verwenden, denn auch dieser Artikel wurde mittlerweile gelöscht. <seufz>


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Freitag, 4. Februar 2011 16:10
    Moderator
  • Wieso verwendest Du in Deinem Dialog kein CListCtrl im "Report view modus"?

    Edit:

    Hach hat der Martin schon festgestellt... :-))

    Montag, 7. Februar 2011 05:54
  • Hi,

    "Martin Richter [MVP]" schrieb im Newsbeitrag news:e393b909-29b6-418e-a9be-8af6d4b7b807@communitybridge.codeplex.com...

    Das geht auch wieder nicht, weil ein CMDICHild natürlich einen CMDIFRame als Parent erwartet.

    BTW: Welchen Sinn macht ein CListView, wenn Du ein CListCtrl hast?

    Ansonsten Paul DiLascias Artikel, in dem er einen CHTMLView verbiegt.
    http://www.microsoft.com/msj/0100/c/c0100.aspx

    Leider musst Du Wayback verwenden, denn auch dieser Artikel wurde mittlerweile gelöscht. <seufz>

    Die Funktionalität, die ich im Dialog benötige, habe ich ja bereits als Doc-View fertig.
    Ich will das ganze nur deshalb in einen Dialog pressen, damit ich den User dazu zwingen
    kann, eine bestimmte Tätigkeit auszuführen bevor er was anderes machen kann.

    Den Artikel habe ich mir angesehn. Ich sehe nicht, dass dieser mir weiterhilft.
    Mein Routingproblem ist ja, dass das SplitterWnd WM_COMMAND/WM_NOTIFY an
    EnsureParentFrame weiterleitet.
    Und da das SplitterWnd direkt im CDialog eingebettet ist, landen die Nachrichten im CMainFrame.

    Urprünglich wollte ich ja im CDialog erst ein CMDIChildWnd und erst in dieses dann
    das SplitterWnd einbauen. Aber z.Zt. habe ich mich entschieden, einfach direkt in das
    Cmd-Routing des SplitterWnds einzugreifen:

    BOOL CDialogSplitterWnd::OnCommand(WPARAM wParam, LPARAM lParam)
    {
     if (CWnd::OnCommand(wParam, lParam))
       return TRUE;
      CDialog *pParentDialog=GetSafeParent<CDialog>(this);
     if (pParentDialog)
       return !pParentDialog->SendMessage(WM_COMMAND, wParam, lParam);
      return !EnsureParentFrame()->SendMessage(WM_COMMAND, wParam, lParam);
    }

    BOOL CDialogSplitterWnd::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
    {
     if (CWnd::OnNotify(wParam, lParam, pResult))
       return TRUE;
      CDialog *pParentDialog=GetSafeParent<CDialog>(this);
     if (pParentDialog)
     {
       *pResult=pParentDialog->SendMessage(WM_NOTIFY, wParam, lParam);
       return TRUE;
     }
      *pResult = EnsureParentFrame()->SendMessage(WM_NOTIFY, wParam, lParam);
     return TRUE;
    }

    Vermutlich komme ich nicht drum herum, irgendwann tatsächlich ein MDIChildWnd in den Dialog
    einzubauen, damit das Routing immer richtig läuft.
    Mal sehen.

    Tschüß, Holger.

    Montag, 7. Februar 2011 08:59
  • Den Artikel habe ich mir angesehn. Ich sehe nicht, dass dieser mir weiterhilft.
    Mein Routingproblem ist ja, dass das SplitterWnd WM_COMMAND/WM_NOTIFY an
    EnsureParentFrame weiterleitet.
    Und da das SplitterWnd direkt im CDialog eingebettet ist, landen die Nachrichten im CMainFrame.

    Eben. Weil ein SplitterWindow auch wieder nur in einem Frame leben darf.
    Dann müsstest Du CSplitterWnd auch anpassen mit einer eigenen Implementierung.

    Vermutlich komme ich nicht drum herum, irgendwann tatsächlich ein MDIChildWnd in den Dialog
    einzubauen, damit das Routing immer richtig läuft.
    Mal sehen.

    Das habe ich Dir schon gesagt, dass es nicht geht. Ein MDI-Child erwartet immer ein MDI-Frame als Parent.

    In der BCG, habe ich mal Code geschrieben, mit der man ein eigenes CFrameWnd als "modalen Dialog" starten kann. Ob das in der MFC-Next geht kann ich Dir nicht sagen.

    Alternativ (aber auch Klimmzug)
    - neuen UI Thread starten
    - in diesem neuen UI Thread ein eigene CFrameWnd öffnen
    - eigenes/eigentliches CMainFrame disablen
    - Nun Message Pump ausführen und warten bis der UI Thread terminiert.

    Dann hast Du ähnliches "modales Verhalten" eines CFrameWnd.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Montag, 7. Februar 2011 09:57
    Moderator