grosse Verständinsprobleme bei SDI
-
Hallo
Ich habe jetzt mal die Geschichte mit den mehreren Views probiert. Ich habe es, wenn ich ehrlich nur abgeschrieben und nicht richtig verstanden und deswegen habe ich noch ein par Fragen:
1. Wie man einen neuen Dialog erstellt weiß ich und habe ich auch gemacht. Diesem habe ich eine Klasse zugeordnet (abgeleitet von VFormview). Dann habe ich noch einen Klasse von CDocument abgeleitet. Müssen die beiden Klassen irgendwie miteinander verbunden werden, damit einmal als View und einmal als Doc angesehen werden. Wenn ich in CDiaolg2View GetDocument aufrufe, woher weiß er dann, dass ich CDialog2Doc meine? Wie gesagt: Ich bin etwas wirr, was diese View/Doc- Architektur angeht.
2. Ich bekomme immer folgende Fehlermeldung:error C2039: 'CreateWnd' : is not a member of 'CSDITestView'
gehört hierzu:
template<class View, class Doc> View* create_view(CWnd* f_pParent) { View* view = new View(); Doc* doc = new Doc(); CCreateContext createContext; createContext.m_pNewViewClass = 0; createContext.m_pNewDocTemplate = 0; createContext.m_pLastView = 0; createContext.m_pCurrentFrame = 0; createContext.m_pCurrentDoc = doc; view->CreateWnd(f_pParent, createContext); return view; }
3. Wie kann ich dann eigentlich die Funktion SwitchView aufrufen? Ich dachte mir, dass ich einen View habe, auf dem es ein Button gibt; und wenn dieser gedrückt wird, ruft er den zweiten View auf. Keine Ahnung wie das gehen soll.
Danke für eure Geduld
chrische
-
Zeig mal die Zeile zu der Fehlermeldung.
Du kannst das SwitchView auch von einem Konpf aus aufrufen - das ist aber etwas schwieriger als vom Menü aus. (Beides zusammen geht wieder rel. einfach.)
Das mit dem GetDocument funktioniert, nur ein Cast fehlt...
CMyDoc* pDoc = dynamic_cast<CMyDoc*>(GetDocument()); ASSERT(pDoc);
-
Hallo!
Hier die Zeile der Fehlermeldung:
view->CreateWnd(f_pParent, createContext);
estartu_de schrieb:
Du kannst das SwitchView auch von einem Konpf aus aufrufen - das ist aber etwas schwieriger als vom Menü aus. (Beides zusammen geht wieder rel. einfach.)
Wie könnte man das denn lösen?
estartu_de schrieb:
Das mit dem GetDocument funktioniert, nur ein Cast fehlt...
CMyDoc* pDoc = dynamic_cast<CMyDoc*>(GetDocument()); ASSERT(pDoc);
Verstehe ich dich richtig: Man muss View und Doc nicht noch einmal speziell einader zuordnen?
Danke
chrische
-
chrische5 schrieb:
Hier die Zeile der Fehlermeldung:
view->CreateWnd(f_pParent, createContext);
Hast du diese Funktion im View?
void CSDITestView::CreateWnd(CWnd* f_pParent, CCreateContext& f_rCreateContext) { VERIFY(Create(0, 0, WS_CHILD | WS_BORDER, CRect(0, 0, 0, 0), f_pParent, AFX_IDW_PANE_FIRST, &f_rCreateContext)); SendMessage(WM_INITIALUPDATE, 0, 0); }
chrische5 schrieb:
Verstehe ich dich richtig: Man muss View und Doc nicht noch einmal speziell einader zuordnen?
Doch, muss man - aber das machst du ja auch. Mit
pNextView = create_view<CSDITestView, CSDITestDoc>(this);
Der CreateContext macht das dann.
Hast du eigentlich schon mal eigene Nachrichten erstellt und behandelt?
Denn damit kannst du das Umschalten auch von einem Button aus machen.
Einfach in der Handlerfunktion die Nachricht losschicken:AfxGetMainWnd()->SendMessage(WM_SCHALTE_UM_AUF_VIEW, IDD_SDITEST_VIEW2);
Oder so ähnlich. Weiß du, wie ich meine oder soll ich erklären?
-
Hallo
Wie immer: Dankeschön schon vorher.
estartu_de schrieb:
chrische5 schrieb:
Hier die Zeile der Fehlermeldung:
view->CreateWnd(f_pParent, createContext);
Hast du diese Funktion im View?
[cpp]Ich hatte sie nicht drin und habe dies jetzt nachgeholt und ich bekomme leider neue Fehlermeldung:
error C2065: 'WM_INITIALUPDATE' : undeclared identifier
Hast du eigentlich schon mal eigene Nachrichten erstellt und behandelt?
Denn damit kannst du das Umschalten auch von einem Button aus machen.
Einfach in der Handlerfunktion die Nachricht losschicken:
[cpp]
AfxGetMainWnd()->SendMessage(WM_SCHALTE_UM_AUF_VIEW, IDD_SDITEST_VIEW2);[/cpp]
Oder so ähnlich. Weiß du, wie ich meine oder soll ich erklären?Ich habe noch nie eigenen Nachrichten erstellt und würde mich sehr über eine Erklärung von dir freuen. Ich würde dich aber bitten kleinschrittig vorzugehen, weil das absolutes Neuland für mich ist.
chrische
-
Hallo!
chrische5 schrieb:
error C2065: 'WM_INITIALUPDATE' : undeclared identifier
Das ist rel. einfach: Du hast ein include vergessen.
#include "afxpriv.h"
Die Nachrichten mache ich nachher in Ruhe.
-
Hallo
Du hattest natürlich Recht. Ich habe deine Anweisung befolgt und es lässt sich erstmal ohne Problem compilieren. Ich wollte nur mal schreiben, dass ich es hingekriegt habe, über das Menü die Views zu wechseln. Wirklich echt super. Dazu hätte ich aber wie immer noch eine Frage: Wie kann ich es einrichten, dass er alle View maximiert anzeigt?
chrische
-
Alle Views? Du hast doch immer nur einen gleichzeitig.
Oder hast du das als MDI hinbekommen?Naja, auf Knopfdruck wechseln geht jetzt so:
AfxGetMainWnd()->SendMessage(WM_COMMAND, ID_DES_MENUE_BEFEHLS);
-
Hallo
Ich habe immer nur einen View (SDI) Er zeigt mir aber nur einen View im Vollbild un d wenn ich zu dem anderen wechsele zeigt er diesem nicht im Vollbild.
chrische
-
Ich habe schon alles durchsucht - ich finde keinen Code dafür. Bei mir geht es so.
Kannst du mal nen Screenshot von dem Aussehen nach dem Umschalten an estartu_de@c-plusplus.net schicken?