1

我正在使用 Psion 的 SDK 在移动设备上提供签名控制。我想在签名控件(这是一个图片框)周围绘制一个矩形。我在Paint事件中放入了以下内容,但问题是它闪烁(当你在图片框上签名时,图片框一直在刷新。

有没有办法可以将它放入表单的加载事件中,所以它只加载一次?我知道它需要有 PainEventArgs 但我不太确定。

    private void scSignature_Paint(object sender, PaintEventArgs e)
    {
        e.Graphics.DrawRectangle(new Pen(Color.Black, 2f), 0, 0,
            e.ClipRectangle.Width - 1,
            e.ClipRectangle.Height - 1
            );
    }

谢谢

4

2 回答 2

7

在 CF 中绘画时防止闪烁和垃圾产生的提示:

  1. 覆盖 OnPaintBackground 并将其留空
  2. 如果您有多个操作,请不要直接绘制Graphics交给您。而是创建一个Bitmap缓冲区,在其中绘制,然后将该位图的内容绘制到Graphics
  3. 不要在上面的 #2 中为每个 Paint 创建缓冲区。创建一个并重用它。
  4. 不要重绘静态项目(如签名控件中的框)。相反,将其绘制一次到 bufferedBitmap中,将该位图绘制到 #2 中的缓冲区,然后绘制动态项
  5. 不要用每种油漆创建钢笔、画笔等。缓冲和重用。

在您的情况下,这些建议可能如下所示:

class Foo : Form
{
    private Bitmap m_background;
    private Bitmap m_backBuffer;
    private Brush m_blackBrush;
    private Pen m_blackPen;

    public Foo()
    {
        m_blackBrush = new SolidBrush(Color.Black);
        m_blackPen = new Pen(Color.Black, 2);

        // redo all of this on Resize as well
        m_backBuffer = new Bitmap(this.Width, this.Height);
        m_background = new Bitmap(this.Width, this.Height);
        using (var g = Graphics.FromImage(m_background))
        {
            // draw in a static background here
           g.DrawRectangle(m_blackBrush, ...);
            // etc.
        }
    }

    protected override void OnPaintBackground(PaintEventArgs e)
    {
    }

    protected override void  OnPaint(PaintEventArgs e)
    {
        using (var g = Graphics.FromImage(m_backBuffer))
        {
            // use appropriate back color
            // only necessary if the m_background doesn't fill the entire image
            g.Clear(Color.White);

            // draw in the static background
            g.DrawImage(m_background, 0, 0);

            // draw in dynamic items here
            g.DrawLine(m_blackPen, ...);
        }

        e.Graphics.DrawImage(m_backBuffer, 0, 0);         
    } 
}
于 2012-07-23T14:49:46.547 回答
0

这当然不是一个优雅的方法,但是如果您可以确保您的图片框完全没有边框,您可以改为在图片框容器控件上绘制一个实心矩形。将其放置在图片框的正后方,使其各边宽 1px,因此它看起来像图片框周围的 1px 边框。

可能的示例(覆盖包含图片框的控件的 OnPaint 方法):

protected override OnPaint(object sender, PaintEventArgs e)
{
     base.OnPaint(sender, e);
     int x = scSignature.Location.X - 1;
     int y = scSignature.Location.Y - 1;
     int width = scSignature.Size.Width + 2;
     int height = scSignature.Size.Height + 2;
     using (Brush b = new SolidBrush(Color.Black))
     {
        e.Graphics.FillRectangle(b,x,y,width,height);
     }

}
于 2012-07-23T12:56:08.173 回答