本文實例講述了WinForm實現的圖片拖拽與縮放功能。分享給大家供大家參考,具體如下:
最近做項目的時候遇到上傳施工平面布置圖,查看,因為圖片比較大,一般的顯示器分辨率無法顯示全,然后還需要放大看清楚圖片里面的文字內容,所以需要用到圖片的拖拽與縮放功能。這里整理下具體操作。
首先新建一個窗體,拖一個panel控件到窗體中,然后在拖一個pictureobx控件到panel中,然后在添加個上傳圖片的按鈕:
具體代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Reflection; namespace 圖像平移縮放 { public partial class Form1 : Form { Bitmap myBmp; Point mouseDownPoint = new Point(); //記錄拖拽過程鼠標位置 bool isMove = false ; //判斷鼠標在picturebox上移動時,是否處于拖拽過程(鼠標左鍵是否按下) int zoomStep = 20; //縮放步長 public Form1() { InitializeComponent(); } //圖片上傳 private void button1_Click( object sender, EventArgs e) { string filename = "" ; OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = "Tiff文件|*.tif|Bmp文件|*.bmp|Erdas img文件|*.img|EVNI文件|*.hdr|jpeg文件|*.jpg|raw文件|*.raw|vrt文件|*.vrt|所有文件|*.*" ; dlg.FilterIndex = 8; if (dlg.ShowDialog() == DialogResult.OK) { filename = dlg.FileName; } if (filename == "" ) { return ; } myBmp = new Bitmap(filename); if (myBmp == null ) { MessageBox.Show( "讀取失敗" ); return ; } textBox1.Text = filename; pictureBox1.Image = myBmp; pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; //設置picturebox為縮放模式 pictureBox1.Width = myBmp.Width; pictureBox1.Height = myBmp.Height; } //鼠標按下功能 private void pictureBox1_MouseDown( object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; isMove = true ; pictureBox1.Focus(); } } //鼠標松開功能 private void pictureBox1_MouseUp( object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isMove = false ; } } //鼠標移動功能 private void pictureBox1_MouseMove( object sender, MouseEventArgs e) { pictureBox1.Focus(); if (isMove) { int x, y; int moveX, moveY; moveX = Cursor.Position.X - mouseDownPoint.X; moveY = Cursor.Position.Y - mouseDownPoint.Y; x = pictureBox1.Location.X + moveX; y = pictureBox1.Location.Y + moveY; pictureBox1.Location = new Point(x, y); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } //鼠標滾輪滾動功能 private void pictureBox1_MouseWheel( object sender, MouseEventArgs e) { int x = e.Location.X; int y = e.Location.Y; int ow = pictureBox1.Width; int oh = pictureBox1.Height; int VX, VY; if (e.Delta > 0) { pictureBox1.Width += zoomStep; pictureBox1.Height += zoomStep; PropertyInfo pInfo = pictureBox1.GetType().GetProperty( "ImageRectangle" , BindingFlags.Instance | BindingFlags.NonPublic); Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null ); pictureBox1.Width = rect.Width; pictureBox1.Height = rect.Height; } if (e.Delta < 0) { if (pictureBox1.Width < myBmp.Width / 10) return ; pictureBox1.Width -= zoomStep; pictureBox1.Height -= zoomStep; PropertyInfo pInfo = pictureBox1.GetType().GetProperty( "ImageRectangle" , BindingFlags.Instance | BindingFlags.NonPublic); Rectangle rect = (Rectangle)pInfo.GetValue(pictureBox1, null ); pictureBox1.Width = rect.Width; pictureBox1.Height = rect.Height; } VX = ( int )(( double )x * (ow - pictureBox1.Width) / ow); VY = ( int )(( double )y * (oh - pictureBox1.Height) / oh); pictureBox1.Location = new Point(pictureBox1.Location.X + VX, pictureBox1.Location.Y + VY); } private void panel2_MouseDown( object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; isMove = true ; } } private void panel2_MouseUp( object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { isMove = false ; } } private void panel2_MouseMove( object sender, MouseEventArgs e) { panel2.Focus(); if (isMove) { int x, y; int moveX, moveY; moveX = Cursor.Position.X - mouseDownPoint.X; moveY = Cursor.Position.Y - mouseDownPoint.Y; x = pictureBox1.Location.X + moveX; y = pictureBox1.Location.Y + moveY; pictureBox1.Location = new Point(x, y); mouseDownPoint.X = Cursor.Position.X; mouseDownPoint.Y = Cursor.Position.Y; } } } } |
這里需要注意一點,類里面用到了一個 pictureBox1_MouseWheel 時間,這個是picturebox控件沒有的時間,所以需要手動去添加這個事件,可以直接在form1的設計類中添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
// // pictureBox1 // this .pictureBox1.BackColor = System.Drawing.Color.White; this .pictureBox1.Location = new System.Drawing.Point(20, 20); this .pictureBox1.Margin = new System.Windows.Forms.Padding(2, 2, 2, 2); this .pictureBox1.Name = "pictureBox1" ; this .pictureBox1.Size = new System.Drawing.Size(67, 34); this .pictureBox1.TabIndex = 0; this .pictureBox1.TabStop = false ; this .pictureBox1.MouseDown += new System.Windows.Forms.MouseEventHandler( this .pictureBox1_MouseDown); this .pictureBox1.MouseMove += new System.Windows.Forms.MouseEventHandler( this .pictureBox1_MouseMove); this .pictureBox1.MouseUp += new System.Windows.Forms.MouseEventHandler( this .pictureBox1_MouseUp); this .pictureBox1.MouseWheel += new System.Windows.Forms.MouseEventHandler( this .pictureBox1_MouseWheel); |
這樣就能直接運行成功了
希望本文所述對大家C#程序設計有所幫助。