winform 以游標指向點為中心 通過滑鼠滾輪對圖片進行縮放
阿新 • • 發佈:2019-02-17
最近一個專案需要涉及到圖片的全屏顯示以及縮放拖動功能,其中縮放實現需要考慮的一點就是為了有更好的使用者體驗,需要在縮放的時候以游標所處位置為參考點,進行縮放操作,簡單來說就是,縮放前後游標在圖片上所處的位置保持不變。
- 實現原理:把圖片放在picturebox中,通過一系列調整,使圖片完全佔滿box,每次通過改變box的size來使得圖片放大縮小,然後再通過改變box的locaton使得游標位置不變。具體演算法就是基本的數學運算了,通過相似三角形求的locaton應該移動的向量,做出位置改變。
void pictureBox1_MouseWheel(object sender, MouseEventArgs e)//滑鼠滾輪事件
{
double step = 1.2 ;//縮放倍率
if (e.Delta > 0)
{
if (pictureBox1.Height >= Screen.PrimaryScreen.Bounds.Height*10)
return;
pictureBox1.Height = (int)(pictureBox1.Height * step);
pictureBox1.Width = (int)(pictureBox1.Width * step);
int px = Cursor.Position.X - pictureBox1.Location.X;
int py = Cursor.Position.Y - pictureBox1.Location.Y;
int px_add = (int)(px * (step - 1.0));
int py_add = (int)(py * (step - 1.0));
pictureBox1.Location = new Point(pictureBox1.Location .X - px_add, pictureBox1.Location.Y - py_add);
Application.DoEvents();
}
else
{
if (pictureBox1.Height <= Screen.PrimaryScreen.Bounds.Height)
return;
pictureBox1.Height = (int)(pictureBox1.Height / step);
pictureBox1.Width = (int)(pictureBox1.Width / step);
int px = Cursor.Position.X - pictureBox1.Location.X;
int py = Cursor.Position.Y - pictureBox1.Location.Y;
int px_add = (int)(px * (1.0 - 1.0 / step));
int py_add = (int)(py * (1.0 - 1.0 / step));
pictureBox1.Location = new Point(pictureBox1.Location.X + px_add, pictureBox1.Location.Y + py_add);
Application.DoEvents();
}
}