MDI: Zugriffe
-
Hallo,
ich bin noch nicht so erfahren in MFC und habe folgendes Problem:
Ich hab ein MDI-Applikation in der ich in die CMainFrame-Klasse eine DialogBar eingebunden habe und mit create() erzeugt. Das funktioniert wunderbar, doch ich hab noch eine EditControl in der DialogBar, welche ich mit Daten aus der Dokumentklasse speisen möchte und in der C"projektname"View::OnDraw(CDC* pDC) zu gegebenen Aktionen mit Hilfe einer Methode in der CMainFrame neu darstellen; genauer wenn ich ewtas hinzufüge. Nun möchte ich einfach gerne wissen, wie man aus den einen Klassen auf die anderen zugreifen kann. Hab schon vieles mit AfxGetMainWnd und AfxGetApp probiert, doch irgendwie nicht ans Ziel gekommen. Vielleicht bin ich auch schon zu müde...
vielen dank für eure hilfe
hier ein Printscreen des programmes
gruss nicco
-
ich hatte das problem auch, habs aber gelöst. Bei mir gings, das ich eine Dialogbhar hatte,und den dort eingegebene code in meien anwendung einfügen wollte.
1.) Ich hab CCoolDialogBar benutzt, die es bei Codeproject gab
2.) Hab dann die dazugehörige klasse mit der CMainframe in Verbindung gebrachtCMeinDialog* dlg = new CMeinDialog(this);
Somit konnte ich in meienr CMeinDialog Klasse auf CMainframe zugreifen./Mit ein paar änderungen in CMeinDialog natürlich
so, ich zeig dir das mal
CMainframe OnCreate()
// CDlgDebug* m_cDebug; // CCoolDialogBar m_wndDebugDlgBar; m_cDebug = new CDlgDebug(this); m_wndDebugDlgBar.Create(this, m_cDebug, " Ausgabe", IDD_DEBUG); m_wndDebugDlgBar.SetBarStyle(m_wndDebugDlgBar.GetBarStyle()|CBRS_TOOLTIPS|CBRS_FLYBY);
In CMainDilaog hab ich eine Variable namens CMainFrame *m_pBuddy; hinzegfügt und den Konstruktor geändert:
CDlgDebug::CDlgDebug(CMainFrame *pParent) : CDialog(CDlgDebug::IDD, NULL) { ASSERT(pParent != NULL); m_pBuddy = pParent; //{{AFX_DATA_INIT(CDlgDebug) //}}AFX_DATA_INIT }
Und in meine CMainframe klasse hab ich dies hinzugefügt, um auf meinen VIew zuzugreifen
void CMainFrame::OnInsertText(CString strStart, CString strEnd, int iCBack) { LPTSTR cStart = strStart.GetBuffer (100); LPTSTR cEnd = strEnd.GetBuffer (100); _tcscpy(cStart, strStart); _tcscpy(cEnd, strEnd); CView *pView = GetActiveFrame()->GetActiveView(); if(pView!=NULL) { CString sClassName(pView->GetRuntimeClass()->m_lpszClassName); if(sClassName=="CSampleView") { ((CSampleView*)pView)->OnInsertTag(cStart,cEnd,iCBack); } return; } strStart.ReleaseBuffer(); strEnd.ReleaseBuffer(); }
Viel Spass beim nachkochen
-
vielen dank. ich werd damit mal experimentieren...
gruss nicco
-
hm - nochmals ich. irgendwie geht das nicht, wie ich mir das vorstelle.
also in CMainFrm.h hab ich das:
CDialogBar m_controlDlgBar; CListCtrl* m_popjektlisteListCrtl;
dann in CMainFrm.cpp dies:
// Dialogbar erstellen if (!m_controlDlgBar.Create(this, IDD_DIALOGBAR, CBRS_RIGHT, IDD_DIALOGBAR)) { TRACE0("Dialogbar konnte nicht erstellt werden\n"); return -1; // Fehler bei Erstellung } m_controlDlgBar.EnableDocking(CBRS_ALIGN_LEFT|CBRS_ALIGN_RIGHT); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_controlDlgBar); m_popjektlisteListCrtl = (CListCtrl*) m_controlDlgBar.GetDlgItem(IDC_OBJEKTLISTE); m_popjektlisteListCrtl->InsertColumn(1,"Objekt",LVCFMT_LEFT,80,-1); m_popjektlisteListCrtl->InsertColumn(2,"Position",LVCFMT_LEFT,150,-1); m_popjektlisteListCrtl->InsertColumn(3,"...",LVCFMT_LEFT,40,-1);
... die spalten werden auch einwandfrei angezeigt.
in CCalcassDoc.h habe ich ein eigenes objekt eingebunden:
public: CFachwerk fachwerk;
jetzt möchte ich
1. von der klasse CCalcassView in die ListControl von der controlbar datensätze einfügen und
2. von der klasse CMainFrm auf die klasse CCalcassDoc (fachwerk) und ev. CCalcassView zugreifen, sprich eine methode ausführenoder geht das nicht?
ich hab für den ersten punkt mal das in CCalcassView ausprobiert, aber hat nicht funktioniert!?!
CListCtrl* pobjektliste = (CListCtrl* ) AfxGetMainWnd()->GetDlgItem(IDD_DIALOGBAR)->GetDlgItem(IDC_OBJEKTLISTE);
kann mir jemand helfen? vielen dank im voraus
gruss nicco
-
kann mir niemand helfen?
oder muss ich eine klasse aus der dialogbar machen, weil es sonst nicht geht?
gruss nicco
-
Hast du denn mal geschaut, ob das hier nicht nur reicht?
CListCtrl* pobjektliste = (CListCtrl* ) AfxGetMainWnd()->GetDlgItem(IDC_OBJEKTLISTE);
Habe sowas nicht gemacht, aber wäre eine Idee.
-
vielen dank für deine antwort.
ja, hab ich probiert - leider geht dies auch nicht -> nullpointer...
muss man denn das AfxGetMainWnd() noch irgendwo überschreiben?
-
Sorry, weiss ich leider nicht.
MSDN sagt nurIf your application is an OLE server, call this function to retrieve a pointer to the active main window of the application instead of directly referring to the m_pMainWnd member of the application object.
schon mit m_pMainWnd ausprobiert. Sonst kann ich leider nicht helfen.
-
nein, ist dies ein const pointer?
-
const Pointer? Leider keine Ahnung, was das ist.
Aber ich habe mal nachgeschaut, wie ich mal auf nen Button von einem Thread aus zugegriffen habe:CButton* pExit = (CButton*)AfxGetApp()->m_pMainWnd->GetDlgItem(IDCANCEL);
Oder sein device context benutzt:
CClientDC dc(AfxGetApp()->m_pMainWnd);
Vielleicht hilft das weiter.
-
vielen dank für deine hilfe - leider komm ich so auch nicht auf dies, was ich gerne möchte.
gruss nicco