Benutzer mit den meisten Antworten
CView innerhalb eines Dialoges

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.
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.aspxLeider musst Du Wayback verwenden, denn auch dieser Artikel wurde mittlerweile gelöscht. <seufz>
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Samstag, 5. Februar 2011 21:32
- Als Antwort markiert Robert BreitenhoferModerator Montag, 28. Februar 2011 17:19
-
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- Als Antwort markiert Robert BreitenhoferModerator Montag, 28. Februar 2011 17:19
Alle Antworten
-
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" Frameworktschüß, Holger.
-
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.aspxLeider musst Du Wayback verwenden, denn auch dieser Artikel wurde mittlerweile gelöscht. <seufz>
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Samstag, 5. Februar 2011 21:32
- Als Antwort markiert Robert BreitenhoferModerator Montag, 28. Februar 2011 17:19
-
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.
-
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- Als Antwort markiert Robert BreitenhoferModerator Montag, 28. Februar 2011 17:19