Nichtmodales Dialogfeld verknüpfen
-
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); } }