0

我目前正在使用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”是静态的,所以上面的代码导致在用户按下图片框图像上的鼠标按钮的位置绘制一个矩形......我想允许用户能够拖动光标并绘制一个他希望大小的矩形..请帮助我..谢谢..

4

1 回答 1

0

您不应该在事件处理程序中直接绘制到您的窗口 - 所有绘图都应该在您的 Paint 事件处理程序中。

您可以做很多事情来使其正常工作,但您需要的技术核心是:

要在用户拖动鼠标时移动矩形,您必须处理 Mouse Moved 事件。每次你得到一个,你需要 Invalidate() 来重新绘制你的窗口。在您的 Paint 处理程序中,如果鼠标按钮按下,则获取鼠标指针位置并在该位置绘制矩形。

这会让你开始,但它会有一些问题 - 窗口会在不断重绘时闪烁,并且可能有点慢。

您还可以采取其他措施来改善这一点,包括:

  • 仅使您需要的表单部分无效(需要删除旧矩形的位置,以及需要绘制新矩形的位置)

  • 在 Invalidate() 之后,立即调用 Update() 以使重绘尽快发生

  • “双缓冲”渲染,和/或将窗口内容存储在屏幕外位图中,以便您可以更快地重新渲染顶部矩形的背景,而不会闪烁。(但这是一种相当先进的技术)。

于 2010-03-19T07:18:21.760 回答