MFC-Anwendung: Zeichnen in einem extra Bereich



  • Hallo!

    Ich habe eine Frage zum Zeichnen in MFC. Und zwar habe ich eine MFC-Anwendung, in der ich einen kleinen Bereich zum Zeichnen mit der Maus haben möchte.
    Im Moment habe ich folgenden Code, mit dem ich aber im gesamten Anwendungsfenster zeichnen kann:

    void CTest_mfcDlg::OnMouseMove(UINT nFlags, CPoint point)
    {
    	//Linke Maustaste gedrückt?
    	if ((nFlags & MK_LBUTTON) == (MK_LBUTTON))
    	{
    		//Gerätekontext holen
    		CClientDC dc(this);
    
    	//Linie vom letzten zum aktuellen Punkt zeichnen
    		dc.MoveTo(m_iPrevX, m_iPrevY);
    		dc.LineTo(point.x, point.y);
    
    	//Aktuellen Punkt als letzten Punkt speichern
    		m_iPrevX = point.x;
    		m_iPrevY = point.y;
    	}
    	CDialogEx::OnMouseMove(nFlags, point);
    }
    
    void CTest_mfcDlg::OnLButtonDown(UINT nFlags, CPoint point)
    {
    	//Aktuellen Punkt als Anfangspunkt setzen
    	m_iPrevX = point.x;
    	m_iPrevY = point.y;
    	}
    	CDialogEx::OnLButtonDown(nFlags, point);
    }
    

    m_iPrevX und m_iPrevY sind dabei Membervariablen, in denen jeweils der vorherige Punkt gespeichert wird, um den mit dem neuen zu verbinden.
    Ist es möglich eine Art Rahmen zu benutzen, auf den sich diese Methoden dann beziehen? Außerdem würde mich interessieren, wie ich den Inhalt dann auch wieder löschen kann. Ich vermute mal, das hat etwas mit dem Gerätekontext zu tun oder?

    Vielen Dank! 🙂


  • Mod

    Erzeuge ein eigenes Fenster für diesen Vorgang.
    BTW: Man zeichnet immer nur im OnPaint Handler....



  • Ist es nicht möglich, im Hauptfenster einen Zeichenbereich einzurichten, in dem man mit der Maus zeichnen kann, und den man auch wieder einfach löschen kann?


  • Mod

    mfc_newbie schrieb:

    Ist es nicht möglich, im Hauptfenster einen Zeichenbereich einzurichten, in dem man mit der Maus zeichnen kann, und den man auch wieder einfach löschen kann?

    Die Frage wurde bereits beantwortet: Bau ein eigenes Kindfenster dafür...



  • Das bedeutet also, es funktioniert nur in einem extra Fenster?


  • Mod

    mfc_newbie schrieb:

    Das bedeutet also, es funktioniert nur in einem extra Fenster?

    Nein!
    Wenn Du einen WM_PAINT Handler für Deinen Dialog hast, kannst Du zeichnen wo Du willst (in Deinem Dialog wohlgemerkt), aber es macht keinen Sinn dafür kein Fenster zu verwenden...



  • Danke erstmal!
    Ich habe diesen Thread entdeckt:
    http://www.c-plusplus.net/forum/166555
    Hier benutzt jemand eine Picture Control als Bereich, um darin zu zeichnen.
    Das habe ich ausprobiert, das hat auch ganz gut funktioniert, bis auf ein Problem:
    Die Koordinaten des Picture Controls und des Hauptfensters lassen sich nicht mehr vereinbaren, die Zeichnung wird nicht über dem Mauszeiger gezeichnet.
    Jetzt war meine Idee das OnMouseMove Event nicht für das Hauptfenster sondern für das Picture Control zu definieren. Soweit ich das verstanden habe, muss ich dazu aber eine eigene Klasse ableiten und dort die OnMouseMove Methode implementieren.
    Aber von dort aus kann ich nicht auf die Objekte meiner Hauptdialog-Klasse zugreifen. Wie könnte ich das Problem lösen?



  • vielleicht in dem du dir den Parent (GetParent()) deines PictureCtrl holst was dann automatisch dein Hauptfenster ist, wenn du diesen Zeiger hast kannst du diesen auf dein Hauptfenster Casten und kannst auf die Objekte deiner Hauptklasse zugreifen.


Log in to reply