程序要实现的目的是通过鼠标来控制图片的缩放和移动的效果,也就是说可以鼠标在程序界面上拖动图片,通过鼠标滚轮放大和缩小图片。这种功能在图片浏览程序里面再普通不过了,一般来说,如果是在MFC或者Winform里面实现这两个功能的话,都是通过处理鼠标的移动和滚轮事件,在这两个事件处理函数里面,获取鼠标的位置和滚轮滚动的偏移量,然后针对性地更改图片的位置和高宽度来做的。
比如说,在Winform里面实现鼠标拖拽图片功能的话,代码看起来像下面这样:
// 上一次鼠标移动的位置
private Point m_PreviousMousePosition;
private void DoImageMove(object sender, MouseEventArgs e)
{
// 将sender转化成触发鼠标事件的控件,在Winform程序里面,
// 一般都是PictureBox控件。
PictureBox picture = sender as PictureBox;
Debug.Assert(picture != null);
// 或者鼠标在PictureBox控件的相对坐标,下面的GetMouseRelativePositionTo
// 函数是一个虚构的函数,具体的实现可以Google一下他人的实现方式。
Point mousePosition = GetMouseRelativePositionTo(picture);
// 移动图片,由于MouseMove事件会在我们移动鼠标的时候触发多次,
// 因此我们可以通过获取两次鼠标移动之间,鼠标指针位置的偏移量
// 来知道图片应该移动的偏移量。
picture.X += mousePosition.X - m_PreviousMousePosition.X;
picture.Y += mousePosition.Y - m_PreviousMousePosition.Y;
// 将这次鼠标的位置保存下来。
m_PreviousMousePosition = mousePosition;
}
对于通过滚动条来实现图片缩放的代码应该会是这样:
private void MasterImage_MouseWheel(object sender, MouseWheelEventArgs e)
{
PictureBox picture = sender as PictureBox;
Debug.Assert(picture != null);
// 强迫PictureBox控件在更改大小的时候,自动缩放图片
// 以便填充整个PictureBox控件