在窗体上选择图像的一部分

时间:2012-07-11 08:46:07

标签: c# winforms mouse picturebox

我正在制作选择图像部分的乐器。我有PictrureBox,以及简单的方法:

void StartPanel(object sender, MouseEventArgs args)
{
    xStart = args.X;
    yStart = args.Y;
    panelStarted = true;
    pan.Location = new Point(xStart, yStart);
}
void FinishPanel(object sender, MouseEventArgs args)
{
    xFinish = args.X;
    yFinish = args.Y;
    panelStarted = false;
}

void UpdatePanel(object sender, MouseEventArgs args)
{
    if (panelStarted)
    {
        int x = args.X;
        int y = args.Y;

        int newxstart = xStart;
        int newystart = yStart;
        int neww = 0;
        int newh = 0;

        if (x >= xStart)
            neww = x - xStart;
        else
        {
            neww = xStart - x;
            newxstart = x;
        }
        if (y >= yStart)
            newh = y - yStart;
        else
        {
            newh = yStart - y;
            newystart = y;
        }

        pan.Size = new Size(neww, newh);
        pan.Location = new Point(newxstart, newystart);
    }
}

当我向右和向下移动鼠标时,它绝对可以。但当我向左或向上移动时,我可以看到我所在区域的眨眼。所以我理解,这是因为当我向左或向上移动鼠标时,我的面板被重绘,因为Panel.Location被更改,当我向右和向下移动鼠标时,位置没有改变,只有大小被改变,所以它没有重绘,只是一些像素被添加到面板。对此有什么标准解决方案?

2 个答案:

答案 0 :(得分:0)

由于您在调整面板大小时描述了绘图问题,因此最简单的解决方法是将您正在使用的面板替换为双缓冲的面板,并在调整事件大小时失效:

public class BufferedPanel : Panel {
  public BufferedPanel() {
    this.DoubleBuffered = true;
    this.ResizeRedraw = true;
  }
}

答案 1 :(得分:0)

试图看看你想要做什么并不容易,但我想你正在使用一个面板作为一个可拖动的控件来拖动图片框表面捕捉下面的图像部分(如镜头) - 是吗?

如果是这样,那么这不是最好的方法。最好只在图片框表面上绘制一个矩形并“拖动”它 - 这很简单,只需使用鼠标事件设置左上角并使用onpaint在图像上绘制未填充的矩形。在准备好时捕获图像也很简单,使用您想要的任何事件,然后将图像复制到新的位图。

将一个控件放在另一个控件上通常会导致闪烁 - 即使是双缓冲也是如此。它还需要更多的代码。