ToolStripLabel不会立即重绘

时间:2013-03-01 17:34:41

标签: c# .net windows-forms-designer

我有一个应用程序可以打开图像并在窗口中显示它。确切地说,我将此图像存储在表单类的内部字段中,并将其绘制在附加到该表单上Paint的{​​{1}}事件的方法中。它是这样的:

Panel

变量private void pnlImage_Paint(object sender, PaintEventArgs e) { var g = e.Graphics; if (image != null) { g.DrawImage(image, imageLocation); } } 是包含打开后图像的表单类(类型image)的字段; Image与滚动和滚动条相关联,这与此案例无关。

在该表单上,我还在其底部放置了imageLocation,并且在此ToolStrip上有一些ToolStrip,它们应该是关于图像的一些指标。例如。有一个ToolStripLabels,我想显示鼠标光标在我的图像上的当前位置,或者 - 从另一个角度 - 鼠标光标下的像素位置(在图像上)。所以我在附加到ToolStripLabel事件的方法中更新了我的标签的值,如下所示:

MouseMove

方法private void pnlImage_MouseMove(object sender, MouseEventArgs e) { UpdateCursorAtLabel(e.X, e.Y); // <---- method of interest UpdateColorLabel(e.X, e.Y); // other label, showing color of the pixel. It's an identical thing, so I did not mention it } 的内容,直接负责更新&#34;光标在&#34;标签是:

UpdateCursorAtLabel(int, int)

void UpdateCursorAtLabel(int cursorX, int cursorY) { lblCursorAtValue.Text = image != null ? String.Format("{0}, {1}", scbHorizontal.Value + cursorX, scbVertical.Value + cursorY) : nullText; lblCursorAtValue.Invalidate(); } - 这是应该在鼠标下显示像素位置的标签,例如&#34; 234,117&#34;。 lblCursorAtValuescbHorizontal - 只是一些滚动条,无关紧要,我只需要它们来计算位置。 scbVertical - nullText,等于&#34; ---&#34;。

最初没有使用const string方法。当我完成这一切时,我注意到,当我将光标移动到我的面板上时,标签的内容根本不会改变!只有当我停止移动光标时,我才能看到标签的新值。所以我添加了Invalidate()来强制重绘标签。仍然是同样的问题。我甚至还检查了一件事 - 将一个方法附加到此标签的lblCursorAtValue.Invalidate()事件,而不是填充它,然后设置一个断点。在运行时,调试器只有在我停止移动光标或者超出Panel的界限后才停在那里。 Paint ToolStripLabelUpdate()上没有此类方法,因此我无法使用比Refresh()强的任何内容。我真的不知道为什么会这样,我怎么能解决它。

1 个答案:

答案 0 :(得分:0)

解决了它。我忘了一件至关重要的事情并且UpdateColorLabel(int, int)方法并不像开始时那样无关紧要。因为它就像:

void UpdateColorLabel(int cursorX, int cursorY)
{
    if (image == null)
    {
        lblColorValue.Text = nullText;
    }
    else
    {
        var imageCursorLocation = new Point(scbHorizontal.Value + cursorX, scbVertical.Value + cursorY);
        var px = new Bitmap(image).GetPixel(imageCursorLocation.X, imageCursorLocation.Y);
        lblColorValue.Text = String.Format("R = {0}, G = {1}, B = {2}", px.R, px.G, px.B);
    }            
}

在里面有一条线,它弄乱了所有东西:

var px = new Bitmap(image).GetPixel(imageCursorLocation.X, imageCursorLocation.Y);

是的,在这一行中,我创建全新的位图,每个鼠标移动一个像素后!!! 创建位图是一项相当耗时的操作。因此应用程序没有时间更新我的标签外观,因为它正忙于创建数百个位图......

我通过存储Bitmap而不是Image来修复它,所以我不必创建它只是为了获得像素颜色。