我有一个应用程序可以打开图像并在窗口中显示它。确切地说,我将此图像存储在表单类的内部字段中,并将其绘制在附加到该表单上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;。
lblCursorAtValue
,scbHorizontal
- 只是一些滚动条,无关紧要,我只需要它们来计算位置。
scbVertical
- nullText
,等于&#34; ---&#34;。
最初没有使用const string
方法。当我完成这一切时,我注意到,当我将光标移动到我的面板上时,标签的内容根本不会改变!只有当我停止移动光标时,我才能看到标签的新值。所以我添加了Invalidate()
来强制重绘标签。仍然是同样的问题。我甚至还检查了一件事 - 将一个方法附加到此标签的lblCursorAtValue.Invalidate()
事件,而不是填充它,然后设置一个断点。在运行时,调试器只有在我停止移动光标或者超出Panel的界限后才停在那里。 Paint
ToolStripLabel
或Update()
上没有此类方法,因此我无法使用比Refresh()
强的任何内容。我真的不知道为什么会这样,我怎么能解决它。
答案 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来修复它,所以我不必创建它只是为了获得像素颜色。