DrawLine macht nur eine einzige Line. Aber warum?



  • {
    class CLine
    public:
    
    	void OnPaint();
    	void DrawLine(HWND hWnd, HINSTANCE hInst);
    	void Init(int X1, int Y1, int X2, int Y2);
    
    private:
    
    	HDC          hdc;
    	PAINTSTRUCT  ps;
    
    	GdiplusStartupInput gdiplusStartupInput;
    	ULONG_PTR           gdiplusToken;
    
    	int m_X1;
    	int m_Y1;
    
    	int m_X2;
    	int m_Y2;
    
    };
    
    void CLine::Init(int X1,int Y1, int X2, int Y2)
    {
    	m_X1 = X1;
    	m_X2 = X2;
    
    	m_Y1 = Y1;
    	m_Y2 = Y2;
    
    }
    
    void CLine::DrawLine(HWND hWnd, HINSTANCE hInst)
    {	
    
    	// Initialize GDI+.
    	GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    
    	hdc = BeginPaint(hWnd, &ps);
    	CLine::OnPaint();
    }
    
    void CLine::OnPaint()
    {
    
    	Graphics graphics(hdc);
    	Pen      pen(Color(255, 0, 0, 255));
    	graphics.DrawLine(&pen, m_X1, m_Y1, m_X2, m_Y2);
    
    }
    
    void Line(HWND hWnd, HINSTANCE hInst)
    {
    
    	CLine Linie1;
    	CLine Linie2;
    
    	Linie1.Init(10, 10, 200, 20);
    	Linie1.DrawLine(hWnd, hInst);
    
    	Linie2.Init(120, 100, 100, 100);
    	Linie2.DrawLine(hWnd, hInst);
    
    }
    

    Wollte mir einen Graphen Zeichnen lassen und hab mir dazu eine Klasse gebaut in der ich einfach Linien Zeichnen kann.
    Problematisch dabei ist, dass immer nur die erste Linie gezogen wird.
    Es werden doch eigentlich alle benötigten Variablen innerhalb der Klasseninstanz für je eine Klasse, also Linie erzeugt,
    wieso lässt sich dann trotzdem nur einen Line Zeichenen?

    Jemand eine Idee?



  • Warum "BeginnPaint()"?
    Nach "BeginnPaint()" kommt ein "EndPaint()"
    Sollte man nicht "GetDC()" verwenden um den "hdc" zu bekommen?



  • Solange man nicht sieht in welchem Kontext das ausgeführt wird, macht diese Frage keinen Sinn.

    BeginPaint/EndPaint gehören nur ein einen WM_PAINT handler.

    Ansonsten sollte Dir klar sein, das der Aufruf von BeginPaint ein WM_ERASEBKGND auslöst. Es wird also der Hintergrund gelöscht.
    Wo wir wieder bei meinem ersten Einwurf sind.

    Vorschlag: Du liest malk ein Buch oder einen Artikel über Win32... 🕶



  • @Martin Richter
    Meinst Du mich?
    Die Frage von mir war an den Thread-Ersteller gerichtet, da er "BeginPaint()" in seiner Klasse aufruft (ohne "EndPaint()" und auch außerhalb von WM_PAINT; CLine::OnPaint() ist ja kein WM_PAINT, da CLine nicht von einer Fensterklasse abgeleitet ist), vielleicht könnte es gerade daran liegen, daß es nicht richtig gezeichnet wird.
    Ich würde hier "GetDC()" verwenden.



  • ralros schrieb:

    @Martin Richter
    Meinst Du mich?

    Nein!

    Ich würde hier "GetDC()" verwenden.

    Auch das macht keinen Sinn, denn eigentlich muss alles Zeichen in einem Fenster immer im Kontext eines WM_PAINT erfolgen. Andernfalls ist das Ergebnis der Ausgabe random und nicht "persistent"...



  • @Martin Richter
    Ja, das ist richtig, man könnte "CLine::OnDraw()" in die WM_PAINT-Nachricht setzen und dann würde man das HDC als Parameter übergeben, dann würde es auch immer gezeichnet werden, wenn es gezeichnet werden muß.
    "GetDC()/ReleaseDC()" würde dann auch funktionieren, aber besser wäre es das Divice-Context-Handle als Parameter zu übergeben.