2009-03-01 7 views
0

Ich bin Entwickler und C# App für Windows Mobile. Ich habe ein benutzerdefiniertes Steuerelement mit OnPaint überschrieben, um ein Bild zu zeichnen, dass der Benutzer mit dem Zeiger bewegt. Meine eigene OnPaint-Methode ist folgende:Benutzerdefiniertes Steuerelement zum Anzeigen eines Bilds: Verschieben Sie das Bild in

 

protected override void OnPaint(PaintEventArgs e) 
{ 
    Graphics gxOff; //Offscreen graphics 
    Brush backBrush; 

    if (m_bmpOffscreen == null) //Bitmap for doublebuffering 
    { 
     m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height); 
    } 

    gxOff = Graphics.FromImage(m_bmpOffscreen); 

    gxOff.Clear(Color.White); 

    backBrush = new SolidBrush(Color.White); 
    gxOff.FillRectangle(backBrush, this.ClientRectangle); 

    //Draw some bitmap 
    gxOff.DrawImage(imageToShow, 0, 0, rectImageToShow, GraphicsUnit.Pixel); 

    //Draw from the memory bitmap 
    e.Graphics.DrawImage(m_bmpOffscreen, this.Left, this.Top); 

    base.OnPaint(e); 
} 
 

Die imageToShow es das Bild ist.

Die rectImageToShow es auf Ereignis OnResize auf diese Weise initialisiert ist:

 
rectImageToShow = 
    new Rectangle(0, 0, this.ClientSize.Width, this.ClientSize.Height); 
 

this.Top und this.Left sind die topLeft Ecke, um das Bild innerhalb des benutzerdefinierten Steuerelement zu zeichnen.

Ich denke, es wird gut funktionieren, aber wenn ich das Bild verschiebe es nie die ganze Kontrolle. Ich sehe immer einen Teil der vorherigen Zeichnung.

Was mache ich falsch?

Vielen Dank!

Antwort

2

Ich denke, Sie haben den Bildpuffer des Controls nicht gelöscht. Sie haben nur den Rückpuffer gelöscht. Versuchen Sie dies zwischen den 2 DrawImage-Anrufen:

e.Graphics.Clear(Color.White); 

Dies sollte zuerst alle übrig gebliebenen Bilder löschen.


Alternativ können Sie es neu zu schreiben, so dass alles auf den Rückpuffer gemalt wird und der hintere Puffer wird dann auf dem Bildschirm malen genau (0, 0), so dass alle Probleme aufgrund der Hintergrundpuffer Zeichnung wird Logik statt irgendwo dazwischen.

Etwas wie folgt aus:

Graphics gxOff; //Offscreen graphics 
Brush backBrush; 

if (m_bmpOffscreen == null) //Bitmap for doublebuffering 
{ 
    m_bmpOffscreen = new Bitmap(ClientSize.Width, ClientSize.Height); 
} 

// draw back buffer 
gxOff = Graphics.FromImage(m_bmpOffscreen); 

gxOff.Clear(Color.White); 

backBrush = new SolidBrush(Color.White); 

gxOff.FillRectangle(backBrush, this.Left, this.Top, 
    this.ClientRectangle.Width, 
    this.ClientRectangle.Height); 

//Draw some bitmap 
gxOff.DrawImage(imageToShow, this.Left, this.Top, rectImageToShow, GraphicsUnit.Pixel); 

//Draw from the memory bitmap 
e.Graphics.DrawImage(m_bmpOffscreen, 0, 0); 

base.OnPaint(e); 

nicht sicher, ob das richtig ist, aber Sie sollten die Idee.

+0

Es funktioniert mit: e.Graphics.Clear (Color.White); – VansFannel