Nichtmodales Dialogfeld verknüpfen
-
Hallo,
nichtmodale Dialogfelder kann ich bereits erstellen, jedoch verstehe ich nicht wie ich sie Verknüpfen kann mit z.B. der CView Klasse eines SDI Programmes.
Grundsätzlich habe ich gedacht sollte es so Funktionieren
Ich habe mein Nichtmodales Dialogfeld CMyDialog mit einer Checkbox (m_bAnzeige1) und eine Button der Update heißt (OnApply).
Je nachdem ob das Hackerl an oder aus ist soll er mir ein Rechteck anzeigen (in der OnDraw Funktion der View)
Die Membervariable die für die CView Erstellt worden ist lautet m_bAnzeige2
Das ist mal mein vorläufiger Code der zumindest mal zur Verständnis beitragen soll, funktionieren tut er leider nicht, denn er "updatet" nichts wenn ich das Hackerl der Checkbox aus oder an mache. (OnApply Funktion ist noch gar nicht eingebaut)
void CGfxView::OnDraw(CDC* pDC) { CGfxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen CMyDialog m_pMyDialog; m_bAnzeige2 = m_pMyDialog.m_bAnzeige1; if(m_bAnzeige2 == TRUE) { CPen maxPen(PS_SOLID,5,RGB(255,0,0)); pDC->SelectObject(&maxPen); pDC->Rectangle(100,100,200,200); } }
könnte mir vielleicht jemand erklären wie ich das richtig mache?
danke mal,
mfG Harry
-
hat noch niemand so etwas gemacht? ich bräuchte einfach ein wenns geht konkretes Beispiel wie ich einen nichtmodularen Dialog mit zB der OnDraw Klasse verknüpfe um durch eine Checkbox etwas anzuzeigen oder eben nicht...
vielleicht hat ja jemand Lust mir per icq zu antworten 122541692 wäre sehr nett, würde dann die Lösung hier reinposten damit andere auch was davon haben...
mfg Harry
-
In diesen Zeilen ist der Fehler:
CMyDialog m_pMyDialog; m_bAnzeige2 = m_pMyDialog.m_bAnzeige1;
Das ist eine neue Dialoginstanz - nicht die, die du siehst.
Wo machst du den Dialog auf, zeig mal bitte.
-
Um das Dialogfeld sofort zu öffnen beim Ausführen des Programmes (SDI) in der Oncreate Funktion der MainFrm Klasse:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Symbolleiste konnte nicht erstellt werden\n"); return -1; // Fehler bei Erstellung } if (!m_wndStatusBar.Create(this) || !m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { TRACE0("Statusleiste konnte nicht erstellt werden\n"); return -1; // Fehler bei Erstellung } // ZU ERLEDIGEN: Löschen Sie diese drei Zeilen, wenn Sie nicht wollen, dass die Symbolleiste // andockbar ist. CMyDialog* pDialog; pDialog = new CMyDialog(); pDialog->Create(IDD_DIALOG1,this); pDialog->ShowWindow(SW_SHOW); m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); return 0; }
in Der VIew möchte ich dann die Variable m_bGrid aktualisieren und dann durch eine If Abfrage (zu Testzwecken ein Rechteck) angezeigt oder eben nicht bekommen
void CGfxView::OnDraw(CDC* pDC) { CGfxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen if(m_bGrid) { CPen maxPen(PS_SOLID,5,RGB(255,0,0)); pDC->SelectObject(&maxPen); pDC->Rectangle(100,100,200,200); } }
Ich hab mal angefangen mit SendMessage herumzuprobieren aber mir ist leider nicht klar wie ich das 1. genau machen muss und 2. wie er mir die Daten dann in der OnDraw der CView Klasse aktualisiert
mfg harry
-
Mach pDialog mal zu einer public Membervariablen im MainFrame.
Dann kommst du mit AfxGetMainWnd an den Mainframe (musst noch casten) und kannst den nach dem Zeiger fragen.Dann sollte das gehen.
-
danke mal ich habs folgendermaßen nun gemacht:
einfügen der Variable in mainfrm
// Implementierung public: CMyDialog* pDialog;
jetzt den Code in der OnDraw aktualisiert:
gibt mir aber nen Runtime error aus bzw. mit pDialog->... komm ich nicht auf die Membervariable die die Checkbox beinhaltet...void CGfxView::OnDraw(CDC* pDC) { CGfxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CMainFrame* pDialog = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); ASSERT (pDialog); if(m_bGrid == TRUE) { CPen maxPen(PS_SOLID,5,RGB(255,0,0)); pDC->SelectObject(&maxPen); pDC->Rectangle(100,100,200,200); } }
-
Dein Hauptfenster ist der MainFrame, nicht der Dialog.
-
Ähm wie meinst du das?
nicht den Pointer pDialog verwenden fürs Casten oder wie?
-
Ups, jetzt war ich auf den Variablennamen reingefallen.
Sorry.
Du kommst mitpDialog->pDialog->fCheckbox
an die Checkbox.
Du hangelst dich einfach vom MainFrame über die Member (Dialog) an dessen Member, die Checkbox.
-
danke, leider kommt nochn Runtime error
hab 2 warnungen und zwar...
'dynamic_cast' fuer polymorphen Typ 'class CWnd' mit /GR- verwendet; unvorhersehbares Verhalten moeglich
-
harryhcen01 schrieb:
'dynamic_cast' fuer polymorphen Typ 'class CWnd' mit /GR- verwendet; unvorhersehbares Verhalten moeglich
Schalte in den Projekteinstellungen RTTI ein.
Wo kommt der Runtime Error? Hast du mal debugged?
-
wenn ich RTTI einschalte kommt zwar keine Warnung, jedoch stürzt das Programm ab....
in dieser Casting Zeile
CMainFrame* pDialog = dynamic_cast<CMainFrame*>(AfxGetMainWnd()); ASSERT (pDialog);
-
Für die MFC brauchst Du keine RTTI! Das macht die MFC selber...
Frage einfach so ab (ohne RTTI):
CObject* pObj = (CObject*) AfxGetMainWnd(); if(pMyObject->IsKindOf( RUNTIME_CLASS( CMainFrame ) ) ) { // Yuhu! }
-
oke danke habs mal so probiert...Fehler oder Warnung kommt zwar keine nur funktionierts noch nicht...liegt daran weil ich nicht weiß wie ich die Variable m_bGrid von der MyDialog über die CMainFrm in die CView OnDraw() bekomme...bzw. geht das mit dem pDialog->pDialog->m_bGrid nicht (bei mir zumindest..)
void CGfxView::OnDraw(CDC* pDC) { CGfxDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CMainFrame* pDialog = (CMainFrame*)AfxGetMainWnd(); if(pDialog->IsKindOf(RUNTIME_CLASS(CMainFrame)) == TRUE) { CPen maxPen(PS_SOLID,5,RGB(255,0,0)); pDC->SelectObject(&maxPen); pDC->Rectangle(100,100,200,200); } }