1. 程式人生 > >winform 以游標指向點為中心 通過滑鼠滾輪對圖片進行縮放

winform 以游標指向點為中心 通過滑鼠滾輪對圖片進行縮放

最近一個專案需要涉及到圖片的全屏顯示以及縮放拖動功能,其中縮放實現需要考慮的一點就是為了有更好的使用者體驗,需要在縮放的時候以游標所處位置為參考點,進行縮放操作,簡單來說就是,縮放前後游標在圖片上所處的位置保持不變。

  • 實現原理:把圖片放在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(); } }