Control zeichnet ausserhalb des Bereiches



  • Hallo

    Ich habe ein von der Klasse CStatic abgeleitet. Und hier die OnPaint Methode überschrieben.
    Und lass da anhand eines kleinen Rechenbespieles Linien zeichnen.
    Jetzt ist mir aufgefallen, dass die Linien über das Control hinausgezeichnet werden.
    Das ist von Koordinaten auch ganz ok aber diesen Bereich will ich gar nicht darstellen.
    Ich wüsste schon eine Lösung...

    CRect clientRect;
    GetClientRect(clientRect);

    Und dann überprüfen ab wo die Linen zu zeichnen sind.
    Aber gibt es da nicht eine einfachere Lösung ? 🙂

    Grüße
    Martin


  • Mod

    Zeig mal wie Du zeichnest. Du nimmst sicherlich nur den CPaintDC?



  • Hi

    Ja ganz genau ...

    void CMonitor::OnPaint() 
    {
    	CPaintDC dc(this); // device context for painting
    
        CRect clientRect;
        GetClientRect(clientRect);
    
    	CBrush bckGrndBrush;   
    	bckGrndBrush.CreateSolidBrush(m_ColorBkGnd); 
    
    	dc.FillRect(&clientRect,&bckGrndBrush);
    	....
    	....
    	for (int x = 0; x < m_cPos ; x++ )
    	{
    		dc.MoveTo(...);
    		dc.LineTo(...);
    	}
    	...
    

    So in etwa ... hab das jetzt kurz so ausgeschnitten, weil ich da ziemlich viel herumbaue und nichts fertig ist.
    Aber ich Zeichen da halt irgendwelche mathematischen Funktionen hineinen.

    Was heißt "nur" ? sollte man es anderes machen ?

    Grüße



  • IntersectClipRect(dc, clientRect.left, clientRect.top, clientRect.right, clientRect.bottom);
    

    Ich hab jetzt zusätzlich das noch eingebaut.
    Damit scheint es zu funktionieren ...


  • Mod

    Solange Du einen CPaintDC hast ist es unmöglich außerhalb des Clientbereiches zu zeichnen. Das IntersectClipRect ist unnötig.



  • Hmm 😕 ? 😕
    Aber genau das ist ja meine Problem, eben das über den Bereich gezeichnet wird.
    Ich hab von CStatic abgeleitet.

    In dem ich das hinzufüge ..
    IntersectClipRect(..)
    Wird nicht mehr über den Bereich gezeichnet ...

    Ist das abhängig von der Basisklasse ?


  • Mod

    Nein! Ein CClientDC und ein CPaintDC ist grundsätzlich geclipt.

    Benutzt Du irgendwo in Deinem Zeichenzeugs noch einen anderen CDC?



  • Hi

    😕 ?? 😕
    Nö das ist ein ganz ein kleines Test-Programm. Da mache ich nicht viel.
    Ausser ein bisschen Zeichnen 🙂

    // Monitor.h
    -----------------------------------
    
    class Monitor : public CStatic
    {
    	DECLARE_DYNAMIC(Monitor)
    
    public:
    	Monitor();
    	virtual ~Monitor();
    
    protected:
        afx_msg void OnPaint();
    
    	DECLARE_MESSAGE_MAP()
    };
    
    // Monitor.cpp
    --------------------------------------
    
    IMPLEMENT_DYNAMIC(Monitor, CStatic)
    
    Monitor::Monitor()
    {
    
    }
    
    Monitor::~Monitor()
    {
    }
    
    BEGIN_MESSAGE_MAP(Monitor, CStatic)
        ON_WM_PAINT()
    END_MESSAGE_MAP()
    
    void Monitor::OnPaint() 
    {
    	CPaintDC dc(this);
    
        CRect clientRect;
        GetClientRect(clientRect);
    
    	CBrush bckGrndBrush;   
    	bckGrndBrush.CreateSolidBrush(RGB(0,100,0)); 
    
    	dc.FillRect(&clientRect,&bckGrndBrush);
    
    	CPen penColorLine(PS_SOLID,1,RGB(255,100,0));
    	dc.SelectObject(&penColorLine);
    
    	dc.MoveTo(10,-600); // hier wird dann "rausgezeichnet"
    	dc.LineTo(10,600); 
    }
    

    Und in dem Beispiel kann ich ohne
    IntersectClipRect(dc, clientRect.left, clientRect.top, clientRect.right, clientRect.bottom);
    definitv über den Bereich zeichnen. ...
    Und mit Linto,MoveTo zeichne ich halt meine Sinus-Funktionen bzw Raster oder sowas ...

    Oder mache ich da schon was grundsätzlich falsch ??

    Grüße


Anmelden zum Antworten