我目前正致力于visual c ++ 2008 express edition .. 在我的项目中,我有一个包含图像的图片框,现在我必须绘制一个矩形,以便用户选择图像的一部分。 我使用了图片框的“MouseDown”事件和下面的代码来绘制一个矩形:
Void pictureBox1_MouseDown(System::Object^ sender, Windows::Forms::MouseEventArgs^ e)
{
Graphics^ g = pictureBox1->CreateGraphics();
Pen^ pen = gcnew Pen(Color::Blue);
g->DrawRectangle( pen , e->X ,e->Y,width,ht);
}
现在在“DrawRectangle”中,参数“width”和“ht”是静态的,因此上面的代码导致在用户在图片框中的图像上按下鼠标按钮时绘制一个矩形... 我想让用户能够拖动光标并绘制一个他希望的大小矩形。 Plz帮我这个.. Thanx ..
答案 0 :(得分:0)
您不应该直接在事件处理程序中绘制窗口 - 所有绘图都应该在您的Paint事件处理程序中。
你可以做很多事情来使它运作良好,但你需要的技术的核心是:
要在用户拖动鼠标时移动矩形,您必须处理Mouse Moved事件。每次获得一个,你需要Invalidate()来重新绘制窗口。在Paint处理程序中,如果鼠标按钮处于关闭状态,请获取鼠标指针位置并在该位置绘制矩形。
这会让你开始,但它会有一些问题 - 窗口会随着不断重绘而闪烁,而且可能有点慢。
您可以采取其他措施来改善这一点,包括:
仅使您需要的表单部分无效(需要删除旧矩形的位置,以及需要绘制新矩形的位置)
在Invalidate()之后,立即调用Update()以使重绘尽快发生
“双缓冲”渲染,和/或将窗口内容存储在屏幕外位图中,以便您可以更快速地重新渲染背景上的矩形,而不会闪烁。 (但这是一种非常先进的技术)。