Update von gezeichneten Linien in Zeichenprogramm



  • Hallo,

    ich habe ein Zeichenprogramm erstellt, in welchem ich manchmal modale Fenster aufpoppen lasse (zum bearbeiten der gzeichneten Linien).

    Wenn ich jetzt dieses aufgepoppte Modale Fenster verschiebe und über die Linien lege, möchte ich, dass die Linien trotzdem weiterhin gezeichnet werden und nicht verschwinden.

    Gelöst habe ich das damit, dass ich den Zeichenbefehl in die Behandlungsroutine ONPAINT gesetzt habe, das funktioniert auch ganz gut bis auf eine Kleinigkeit:
    Beim ersten Verschieben des Fensters wird die Linie direkt neu gezeichnet.
    Verschiebe ich das Fenster dann erneut (über der Linie), dann wird die Linie nicht direkt neu gezeichnet. Erst bei erneutem Verschieben des Fenster wird die Linie dann wieder neu gezeichnet.

    Klingt kompliziert, hier eine genaue Erklärung:

    1.) Linie zeichnen:
    -------------------------

    2.) Fenster aufpoppen lassen:
    ----||-------------

    3.) Fenster Verschieben:
    -------||-------------
    Bis hier geht alles genau so wie ich das möchte!

    4.) Fenster erneut verschieben:
    ------- ||-------------
    Jetzt sieht man so eine Lücke

    5.) Verschiebe ich das Fenster jetzt nochmal:
    -------- ||-------------

    Und diese Lücke habe ich jetzt immer beim verschieben, so als ob alle Behandlungsrountinen immer um 1 versetzt aufgerufen wird. Die Lücke geht übrigens immer bis zur vorherigen Grenze des Fensters.
    Ich hoffe, die Erklärung is verständlich.

    Falls jemand Ideen hat und Screenshots braucht, können wir auch welche schicken...

    Ich bitte um Hilfe, was das denn sein könnte und wie ich das Problem am besten lösen könnte.


  • Mod

    Der Zeichenbefehl gehört nur in die OnPaint Funktion! Nur dann werden auch Bildschirm Updates korrekt durchgeführt.

    Die Frage ist was machst Du anders? Arbeitest Du mit dem Paintrect das im PaintDC übergweben wird.
    Setzt Du die Mapping Modes korrekt?



  • So schaut mein Code in der OnPaint aus:

    void CMalenDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // Gerätekontext für Zeichnen
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Symbol in Client-Rechteck zentrieren
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Symbol zeichnen
    		dc.DrawIcon(x, y, m_hIcon);	
    
    	}
    	else
    	{
    	m_DrawBoard.DrawLines(m_pDrawingElements, this);
    	m_DrawBoard.DrawCircles(m_pDrawingElements, this);
    	m_DrawBoard.DrawPushPoint(m_pDrawingElements, this);
    
    	CDialog::OnPaint();
    	}
    
    }
    

    Dabei ist CDrawBoard eine Klasse, in welcher meine Zeichungsroutinen stehen (mit dcMoveTo, LineTo usw.) und m_DrawBoard ist meine Variable vom Typ CDrawBoard, um die Routinen aufzurufen...

    Über die m_pDrawingElements rufe ich gespeicherte Koordinaten ab...

    Mapping Modes???


Anmelden zum Antworten