Thursday, April 7, 2011

c# CF, WinForms and double buffer

Hi!

I have a CF 2.0 app with a PictureBox on a Form. I want to move the PictureBox with mouse move and I need to add Double Buffer to the form to avoid flickering.

How can I do this?

Thanks!

From stackoverflow
  • You don't need the Form double-buffered, you need the PB to be. That's not so easy to come by in CF. However, you could create your own control, PB is pretty simple. For example:

    using System;
    using System.Drawing;
    using System.Windows.Forms;
    
    public class MyPictureBox : Control {
      private Image mImage;
      public Image Image {
        get { return mImage; }
        set { mImage = value; Invalidate(); }
      }
      protected override void OnPaintBackground(PaintEventArgs pevent) {
        // Do nothing
      }
      protected override void OnPaint(PaintEventArgs e) {
        using (Bitmap bmp = new Bitmap(this.ClientSize.Width, this.ClientSize.Height)) {
          using (Graphics bgr = Graphics.FromImage(bmp)) {
            bgr.Clear(this.BackColor);
            if (mImage != null) bgr.DrawImage(mImage, 0, 0);
          }
          e.Graphics.DrawImage(bmp, 0, 0);
        }
        base.OnPaint(e);
      }
    }
    

    Hopefully, I didn't use stuff that isn't available in CF...

    VansFannel : PB? What is the meaning of PB?
    Hans Passant : PB == PictureBox.
    VansFannel : It doesn't work. I need double buffer on Form because I moving the entire PictureBox (I think).
    Quibblesome : This is the correct code, but what you'll need to do is create a container (a panel for example) that draws like this. Worst case scenario is that you'll have to swap out a picture box for something custom you manually draw and control inside the panel.

0 comments:

Post a Comment

Note: Only a member of this blog may post a comment.