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 mit

    pDialog->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);
    	}
    }
    

Anmelden zum Antworten