原创“.NET研究”企业级控件库之图片浏览控件

简介:   在上两篇:我介绍了原创企业级控件库之组合查询控件 和原创企业级控件库之大数据量分页控件,受到了很多朋友的支持,给了我很大的动力,在此我特表感谢。有的朋友要求把源码提供上来,我在第一篇就讲了,源码会在我这个系列讲完之后提供,大家先别着急,如果你确实需要,可以时常关注此系列,谢谢大家。

  在上两篇:我介绍了原创企业级控件库之组合查询控件 和原创企业级控件库之大数据量分页控件,受到了很多朋友的支持,给了我很大的动力,在此我特表感谢。有的朋友要求把源码提供上来,我在第一篇就讲了,源码会在我这个系列讲完之后提供,大家先别着急,如果你确实需要,可以时常关注此系列,谢谢大家。其实,在系列文章中,我已把核心代码贡献出来了。学习有时是参考别人与实践别人的劳动成果的过程,你光把别人的代码拿过来用用,不研究其实质,进步很慢。

  这篇我将给大家介绍:企业级控件库之图片浏览控件。

  摘要

  我想大家用过或听说过ACDSee 对于图片浏览的强大功能,我接下来介绍的控件与ACDSee相比,可谓是天壤之别,虽没有其强大的功能,但用在一些常用的软件上,提供一些常用的基本功能还是可以的。同时,我只提供一个模子,代码开源,你可以随便修改以满足自己的需要。

  成就别人、等于成就自己。我没什么要求,欢迎大家多多支持与评论,觉得不错的,记得点击文章左下角的关注博客,就这么简单。同时,你要用什么好的想法,也可以与我交流,谢谢。

  图片浏览控件运行效果如下图:

  本控件类图:

  本控件类详细信息:

  本控件核心代码:

  
  
1 . #region 滚动鼠标滚轮实现鼠标缩放
2 . /* ***********************************************************
3. * 滚动鼠标滚轮实现鼠标缩放
4. ***********************************************************
*/
5 . private void picView_MouseWheel( object sender, MouseEventArgs e)
6 . {
7 . switch (keyAction)
8 . {
9 . case 1 :
10 . if (e.Delta > 0 && picView.Width < 10000 )
11 . {
12 . zoom(e.Location, 1100 );
13 . }
14 . else if (e.Delta < 0 && picView.Image.Width / picView.Width < 5 )
15 . {
16 . zoom(e.Location, 900 );
17 . }
18 . CenterImage(); // 使图片居中显示
19 . break ;
20 . case 2 :
21 . if (hScrollBarImageView.Visible)
22 . hScrollBarImageView.Value = (hScrollBarImageView.Value - e.Delta < 0 ? 0 : (hScrollBarImageView.Value - e.Delta > hScrollBarImageView.Maximum ? hScrollBarImageView.Maximum : hScrollBarImageView.Value - e.Delta));
23 . break ;
24 . default :
25 . if (vScrollBarImageView.Visible)
26 . vScrollBarImageView.Value = (vScrollBarImageView.Value - e.Delta < 0 ? 0 : (vScrollBarImageView.Value - e.Delta > vScrollBarImageView.Maximum ? vScrollBarImageView.Maximum : vScrollBarImageView.Value - e.Delta));
27 . break ;
28 . }
29 . }
30 . #endregion

  滚动鼠标滚轮实现鼠标缩放

  下面给出整个控件的完整代码及窗体调用方法:

  一、控件完整代码:

  图像显示控件

代码
   
   
1 #region 版权信息
2 /* ---------------------------------------------------------------------*
3 // Copyright (C) 2010
http://www.cnblogs.com/huyong
4 // 版权所有。
5 // 项目 名称:《Winform通用控件库》
6 // 文 件 名: UcImageView.cs
7 // 类 全 名: DotNet.Controls.UcImageView
8 // 描 述: 图像显示控件
9 // 创建 时间: 2010-08-05
10 // 创建人信息: [**** 姓名:胡勇 QQ:80368704 E-Mail:80368704@qq.com *****]
11 *----------------------------------------------------------------------
*/
12 #endregion
13
14 using System;
15 using System.ComponentModel;
16 using System.Drawing;
17 using System.Windows.Forms;
18 using System.Drawing.Printing;
19 using DotNet.Common;
20
21 namespace DotNet.Controls
22 {
23 /// <summary>
24 /// 图像显示控件
25 /// UcImageView
26 ///
27 /// 修改纪录
28 /// 2010-11-6 胡勇 优化相关代码。
29 /// 2010-8-5 胡勇 创建图像显示控件
30 ///
31 /// <author>
32 /// <name> 胡勇 </name>
33 /// <QQ> 80368704 </QQ>
34 /// <Email> 80368704@qq.com </Email>
35 /// </author>
36 /// </summary>
37 public partial class UcImageView : UserControl
38 {
39 #region 构造函数
40 public UcImageView()
41 {
42 InitializeComponent();
43 // 记录PnlMain的size
44 panelOldSize.X = PnlMain.Width;
45 panelOldSize.Y = PnlMain.Height;
46 }
47 #endregion
48
49 #region 公共变量
50 private Point StartP = new Point( 0 , 0 );
51 private bool isMouseDown = false ;
52 private Point panelOldSize = new Point( 0 , 0 );
53 private int imgIndexBy1000 = 0 ;
54 private int keyAction = 0 ;
55 private int w, h;
56 #endregion
57
58 #region 公共事件
59
60 [Category( " 图片浏览 " ), Description( " 移动或漫游图片的Checked事件Changed时发生。 " ), Browsable( true )]
61 public event EventHandler OnMnuMoveImageCheckedChanged;
62
63 #endregion
64
65 #region 公共方法
66
67 #region 增加图片到PictureBox:void AddImage(string fileName, bool isAsync)
68 /// <summary>
69 /// 增加要显示的图片
70 /// </summary>
71 /// <param name="fileName"> 图片路径全名 </param>
72 /// <param name="isAsync"> true:异步方式加载图片 </param>
73 public void AddImage( string fileName, bool isAsync)
74 {
75 if (isAsync) // 异步加载图片
76 {
77 // 图片异步加载完成后的处理事件
78 picView.LoadCompleted += new AsyncCompletedEventHandler(picView_LoadCompleted);
79 // 图片加裁时,显示等待光标
80 picView.UseWaitCursor = true ;
81 // 采用异步加裁方式
82 picView.WaitOnLoad = false ;
83 // 开始异步加裁图片
84 picView.LoadAsync(fileName);
85 }
86 else
87 {
88 picView.Image = Image.FromFile(fileName); // 载入图片
89 }
90
91 InitialImage();
92
93 }
94
95 /// <summary>
96 /// 增加要显示的图片
97 /// </summary>
98 /// <param name="img"> Image </param>
99 public void AddImage(Image img)
100 {
101 if (img != null )
102 {
103 picView.Image = img;
104 InitialImage();
105 }
106 else
107 {
108 picView = null ;
109 }
110 }
111 #endregion
112
113 #region 得到ImageView中的图片:Image GetImageInImageView()
114 /// <summary>
115 /// 得到ImageView中的图片
116 /// </summary>
117 /// <returns> Image </returns>
118 public Image GetImageInImageView()
119 {
120 if (picView.Image != null )
121 {
122 return picView.Image;
123 }
124 else
125 {
126 return null ;
127 }
128 }
129 #endregion
130
131 #region 放大、缩小、适应图片大小、移动图片、左旋转图片与右旋转图片
132 /// <summary>
133 /// 放大图片
134 /// </summary>
135 public void ZoomInImage()
136 {
137 if (picView.Image != null )
138 {
139 if (picView.Width < 5000 )
140 {
141 zoom(picView.Location, 1100 );
142 CenterImage();
143 }
144 else
145 {
146 MessageBox.Show( " 对不起,不能再进行放大! " , " 提示信息 " ,MessageBoxButtons.OK,MessageBoxIcon.Information);
147 }
148 }
149 }
150
151 /// <summary>
152 /// 缩小图片
153 /// </summary>
154 public void ZoomOutImage()
155 {
156 if (picView.Image != null )
157 {
158 if (picView.Image.Width / picView.Width < 5 && - 7 < 0 )
159 {
160 zoom(picView.Location, 900 );
161 CenterImage();
162 }
163 else
164 {
165 MessageBox.Show( " 对不起,不能再进行缩小! " , " 提示信息 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
166 }
167 }
168 }
169
170 /// <summary>
171 /// 适应图片大小
172 /// </summary>
173 public void FitImageSize()
174 {
175 if (picView.Image != null )
176 {
177 float r1 = ( float ) this .w / this .picView.Width;
178 float r2 = ( float ) this .h / this .picView.Height;
179 this .picView.Scale(r1, r2);
180 this .picView.Left = ( this .PnlMain.Width - this .picView.Width) / 2 ;
181 this .picView.Top = ( this .PnlMain.Height - this .picView.Height) / 2 ;
182 this .picView.Cursor = Cursors.Default;
183 CenterImage();
184 }
185 }
186
187 /// <summary>
188 /// 移动图片
189 /// </summary>
190 public void MoveImage()
191 {
192 mnuMy.Checked = MnuMoveImageChecked;
193 }
194
195 /// <summary>
196 /// 左旋转图片
197 /// </summary>
198 public void LeftRotateImage()
199 {
200 if (picView.Image != null )
201 {
202 picView.Image.RotateFlip(RotateFlipType.Rotate90FlipX);
203 picView.Refresh();
204 CenterImage();
205 }
206 }
207
208 /// <summary>
209 /// 右旋转图片
210 /// </summary>
211 public void RightRotateImage()
212 {
213 if (picView.Image != null )
214 {
215 picView.Image.RotateFlip(RotateFlipType.Rotate90FlipY);
216 picView.Refresh();
217 CenterImage();
218 }
219 }
220 #endregion
221
222 #endregion
223
224 #region 公共属性
225 private bool _mnuMoveImageChecked;
226 /// <summary>
227 /// 确定漫游菜单项是否处于选中状态(用于是否可以移动或漫游图片)
228 /// </summary>
229 [Category( " 图片浏览 " ), Description( " 确定漫游菜单项是否处于选中状态(用于是否可以移动或漫游图片) " ),Browsable( false )]
230 public bool MnuMoveImageChecked
231 {
232 get
233 {
234 return _mnuMoveImageChecked;
235 }
236 set
237 {
238 _mnuMoveImageChecked = value;
239 this .mnuMy.Checked = _mnuMoveImageChecked;
240 }
241 }
242
243 private bool _mnuPrintVisible = true ; // 默认可见
244 /// <summary>
245 /// 确定打印菜单项是可见还是隐藏
246 /// </summary>
247 [Category( " 图片浏览 " ), Description( " 确定打印菜单项是可见还是隐藏 " ), Browsable( true )]
248 public bool MnuPrintVisible
249 {
250 get
251 {
252 return _mnuPrintVisible;
253 }
254 set
255 {
256 _mnuPrintVisible = value;
257 this .mnuPrint.Visible = _mnuPrintVisible;
258 }
259 }
260 #endregion
261
262 #region 私有方法
263
264 private void picView_LoadCompleted( object sender, AsyncCompletedEventArgs e)
265 {
266 // 图片加载完成后,将光标恢复
267 picView.UseWaitCursor = false ;
268 }
269
270 #region 图片缩放
271 /// <summary>
272 /// 图片缩放
273 /// </summary>
274 /// <param name="center"> 缩放中心点 </param>
275 /// <param name="zoomIndexBy1000"> 缩放倍率的1000倍 </param>
276 private void zoom(Point center, int zoomIndexBy1000)
277 {
278 // 记录原始的picView的Size
279 Point oldSize = new Point(picView.Width, picView.Height);
280 // 实施放大(以x方向为基准计算得出y方向大小,防止多次运算误差积累使Image和picView的尺寸不匹配)
281 picView.Width = picView.Width * zoomIndexBy1000 / 1000 ;
282 picView.Height = picView.Width * imgIndexBy1000 / 1000 ;
283 // 重新定位标定后的picView位置
284 picView.Left -= ((picView.Width - oldSize.X) * (center.X * 1000 / oldSize.X)) / 1000 ;
285 picView.Top -= ((picView.Height - oldSize.Y) * (center.Y * 1000 / oldSize.Y)) / 1000 ;
286 // 重新设定横向滚动条最大值和位置
287 if (picView.Width - PnlMain.Width > 0 )
288 {
289 hScrollBarImageView.Visible = true ;
290 hScrollBarImageView.Maximum = picView.Width - PnlMain.Width + vScrollBarImageView.Width + 2 ;
291 hScrollBarImageView.Value = (picView.Left >= 0 ? 0 : ( - picView.Left > hScrollBarImageView.Maximum ? hScrollBarImageView.Maximum : - picView.Left));
292 }
293 else
294 {
295 hScrollBarImageView.Visible = false ;
296 }
297 // 重新设定纵向滚动条最大值和位置
298 if (picView.Height - PnlMain.Height > 0 )
299 {
300 vScrollBarImageView.Visible = true ;
301 vScrollBarImageView.Maximum = picView.Height - PnlMain.Height + hScrollBarImageView.Width + 2 ;
302 vScrollBarImageView.Value = (picView.Top >= 0 ? 0 : ( - picView.Top > vScrollBarImageView.Maximum ? vScrollBarImageView.Maximum : - picView.Top));
303 }
304 else
305 {
306 vScrollBarImageView.Visible = false ;
307 }
308 }
309 #endregion
310
311 #region 图片加裁到PictureBox中后,对其进行初始化操作
312 /// <summary>
313 /// 图片加裁到PictureBox中后,对其进行初始化操作
314 /// </summary>
315 private void InitialImage()
316 {
317 ImageChange(); // 得到最适合显示的图片尺寸
318 this .w = this .picView.Width;
319 this .h = this .picView.Height;
320
321 // 设定图片位置
322 picView.Location = new Point( 0 , 0 );
323 // 设定图片初始尺寸
324 picView.Size = picView.Image.Size;
325 // 设定图片纵横比
326 imgIndexBy1000 = (picView.Image.Height * 1000 ) / picView.Image.Width;
327 // 设定滚动条
328 if (picView.Width - PnlMain.Width > 0 )
329 {
330 hScrollBarImageView.Maximum = picView.Width - PnlMain.Width + vScrollBarImageView.Width + 2 ; // + hScrollBarImageView.LargeChange
331 hScrollBarImageView.Visible = true ;
332 }
333 if (picView.Height - PnlMain.Height > 0 )
334 {
335 vScrollBarImageView.Maximum = picView.Height - PnlMain.Height + hScrollBarImageView.Height + 2 ; // + vScrollBarImageView.LargeChange
336 vScrollBarImageView.Visible = true ;
337 }
338 CenterImage();
339 }
340 #endregion
341
342 #region 居中与全屏显示图片
343
344 /// <summary>
345 /// 使图片全屏显示
346 /// </summary>
347 private void FullImage()
348 {
349 if (picView.Image.Width < picView.Width && picView.Image.Height < picView.Height)
350 {
351 picView.SizeMode = PictureBoxSizeMode.CenterImage;
352 }
353 CalculateAspectRatioAndSetDimensions();
354 }
355
356
357 /// <summary>
358 /// 保持图片居中显示
359 /// </summary>
360 private void CenterImage()
361 {
362 picView.Left = PnlMain.Width / 2 - picView.Width / 2 ;
363 picView.Top = PnlMain.Height / 2 - picView.Height / 2 ;
364 }
365
366 #endregion
367
368 #region CalculateAspectRatioAndSetDimensions
369 /// <summary>
370 /// CalculateAspectRatioAndSetDimensions
371 /// </summary>
372 /// <returns> double </returns>
373 private double CalculateAspectRatioAndSetDimensions()
374 {
375 double ratio;
376 if (picView.Image.Width > picView.Image.Height)
377 {
378 ratio = picView.Image.Width / picView.Image.Height;
379 picView.Height = Convert.ToInt16( double .Parse(picView.Width.ToString()) / ratio);
380 }
381 else
382 {
383 ratio = picView.Image.Height / picView.Image.Width;
384 picView.Width = Convert.ToInt16( double .Parse(picView.Height.ToString()) / ratio);
385 }
386 return ratio;
387 }
388 #endregion
389
390 #region 用于适应图片大小
391 /// <summary>
392 /// 用于适应图片大小
393 /// </summary>
394 private void ImageChange()
395 {
396 this .picView.Height = this .picView.Image.Height;
397 this .picView.Width = this .picView.Image.Width;
398 float cx = 1 ;
399 if ( this .picView.Image.Height > this .PnlMain.Height) cx =
400 ( float )( this .PnlMain.Height - 10 ) / ( float ) this .picView.Image.Height;
401
402 this .picView.Scale(cx);
403 this .picView.Left = ( this .PnlMain.Width - this .picView.Width) / 2 ;
404 this .picView.Top = ( this .PnlMain.Height - this .picView.Height) / 2 ;
405 }
406 #endregion
407
408 #endregion
409
410 #region 窗口(PnlMain)尺寸改变时图像的显示位置控制
411 /* ***********************************************************
412 * 窗口(PnlMain)尺寸改变时图像的显示位置控制
413 ***********************************************************
*/
414 private void PnlMain_Resize( object sender, EventArgs e)
415 {
416 // 对左右的方向操作(左右)
417 if (picView.Width <= PnlMain.Width) // 图片左右居中
418 {
419 picView.Left = (PnlMain.Width - picView.Width) / 2 ;
420 hScrollBarImageView.Visible = false ;
421 }
422 else if (picView.Left < 0 && picView.Width + picView.Left < PnlMain.Width) // 图片靠右
423 {
424 picView.Left = PnlMain.Width - picView.Width;
425 hScrollBarImageView.Visible = true ;
426 }
427 else if (picView.Left > 0 && picView.Width + picView.Left > PnlMain.Width) // 图片靠左
428 {
429 picView.Left = 0 ;
430 hScrollBarImageView.Visible = true ;
431 }
432 else // 保证显示的中心图样不变(左右)
433 {
434 picView.Left += (PnlMain.Width - panelOldSize.X) / 2 ;
435 hScrollBarImageView.Visible = true ;
436 }
437 // 设定横向滚动条最大值
438 hScrollBarImageView.Maximum = (picView.Width - PnlMain.Width > 0 ? picView.Width - PnlMain.Width + hScrollBarImageView.Maximum + 2 : 0 );
439 // 设定横向滚动条Value
440 hScrollBarImageView.Value = (picView.Left >= 0 ? 0 : - picView.Left);
441 // 重置旧的pannel1的Width
442 panelOldSize.X = PnlMain.Width;
443
444 // 对上下的方向操作(上下)
445 if (picView.Height <= PnlMain.Height) // 图片上下居中
446 {
447 picView.Top = (PnlMain.Height - picView.Height) / 2 ;
448 vScrollBarImageView.Visible = false ;
449 }
450 else if (picView.Top < 0 && picView.Height + picView.Top < PnlMain.Height) // 图片靠下
451 {
452 picView.Top = PnlMain.Height - picView.Height;
453 vScrollBarImageView.Visible = true ;
454 }
455 else if (picView.Top > 0 && picView.Height + picView.Top > PnlMain.Height) // 图片靠上
456 {
457 picView.Top = 0 ;
458 vScrollBarImageView.Visible = true ;
459 }
460 else // 保证显示的中心图样不变(上下)
461 {
462 picView.Top += (PnlMain.Height - panelOldSize.Y) / 2 ;
463 vScrollBarImageView.Visible = true ;
464 }
465 // 设定纵向滚动条最大值
466 vScrollBarImageView.Maximum = (picView.Height - PnlMain.Height > 0 ? picView.Height - PnlMain.Height + vScrollBarImageView.Maximum + 2 : 0 );
467 // 设定纵向滚动条Value
468 vScrollBarImageView.Value = (picView.Top >= 0 ? 0 : - picView.Top);
469 // 重置旧的pannel1的Height
470 panelOldSize.Y = PnlMain.Height;
471 }
472 #endregion
473
474 #region 滚动条滚动时,图片移动
475 /* ***********************************************************
476 * 滚动条滚动时,图片移动
477 ***********************************************************
*/
478 private void vScrollBarImageView_ValueChanged( object sender, EventArgs e)
479 {
480 picView.Top = - vScrollBarImageView.Value;
481 }
482
483 private void hScrollBarImageView_ValueChanged( object sender, EventArgs e)
484 {
485 picView.Left = - hScrollBarImageView.Value;
486 }
487 #endregion
488
489 #region PictureBox 鼠标按下、鼠标进入、松开与移动事件
490 private void picView_MouseDown( object sender, MouseEventArgs e)
491 {
492 StartP = e.Location;
493 isMouseDown = true ;
494 }
495
496 private void picView_MouseEnter( object sender, EventArgs e)
497 {
498 picView.Focus();
499 }
500
501 private void picView_MouseMove( object sender, MouseEventArgs e)
502 {
503 if (mnuMy.Checked && isMouseDown)
504 {
505 this .picView.Cursor = Cursors.SizeAll;
506 // 计算出移动后两个滚动条应该的Value
507 int x = - picView.Left + StartP.X - e.X;
508 int y = - picView.Top + StartP.Y - e.Y;
509
510 // 如果滚动条的value有效则执行操作;
511 if (x >= - PnlMain.Width + 10 && x <= picView.Width - 10 )
512 {
513 if (hScrollBarImageView.Visible)
514 {
515 if (x > 0 )
516 hScrollBarImageView.Value = x > hScrollBarImageView.Maximum ? hScrollBarImageView.Maximum : x;
517 picView.Left = - x - (vScrollBarImageView.Visible && x < 0 ? vScrollBarImageView.Width : 0 );
518 }
519 else
520 picView.Left = - x;
521 }
522
523 if (y >= - PnlMain.Height + 10 && y <= picView.Height - 10 )
524 {
525 if (vScrollBarImageView.Visible)
526 {
527 if (y > 0 )
528 vScrollBarImageView.Value = y > vScrollBarImageView.Maximum ? vScrollBarImageView.Maximum : y;
529 picView.Top = - y - (hScrollBarImageView.Visible &&上海徐汇企业网站设计与制作amp; y < 0 ? hScrollBarImageView.Height : 0 );
530 }
531 else
532 picView.Top = - y;
533 }
534
535
536 /* ****************************************************
537 * 给予调整滚动条调整图片位置
538 *****************************************************
539 计算出移动后两个滚动条应该的Value
*/
540 /* int w = hScrollBarImageView.Value + StartP.X -e.X;
541 int z = vScrollBarImageView.Value + StartP.Y -e.Y;
542 如果滚动条的value有效则执行操作;
543 否则将滚动条按不同情况拉到两头
544 if (w >= 0 && w <= hScrollBarImageView.Maximum)
545 {
546 hScrollBarImageView.Value = w;
547 }
548 else
549 {
550 hScrollBarImageView.Value = (w < 0 ? 0 : hScrollBarImageView.Maximum);
551 }
552 if (z >= 0 && z <= vScrollBarImageView.Maximum)
553 {
554 vScrollBarImageView.Value = z;
555 }
556 else
557 {
558 vScrollBarImageView.Value = (z < 0 ? 0 : vScrollBarImageView.Maximum);
559 }
*/
560 }
561 else
562 {
563 this .picView.Cursor = Cursors.Default;
564 }
565 }
566
567 private void picView_MouseUp( object sender, MouseEventArgs e)
568 {
569 isMouseDown = false ;
570 }
571 #endregion
572
573 #region 滚动鼠标滚轮实现鼠标缩放
574 /* ***********************************************************
575 * 滚动鼠标滚轮实现鼠标缩放
576 ***********************************************************
*/
577 private void picView_MouseWheel( object sender, MouseEventArgs e)
578 {
579 switch (keyAction)
580 {
581 case 1 :
582 if (e.Delta > 0 && picView.Width < 10000 )
583 {
584 zoom(e.Location, 1100 );
585 }
586 else if (e.Delta < 0 && picView.Image.Width / picView.Width < 5 )
587 {
588 zoom(e.Location, 900 );
589 }
590 CenterImage(); // 使图片居中显示
591 break ;
592 case 2 :
593 if (hScrollBarImageView.Visible)
594 hScrollBarImageView.Value = (hScrollBarImageView.Value - e.Delta < 0 ? 0 : (hScrollBarImageView.Value - e.Delta > hScrollBarImageView.Maximum ? hScrollBarImageView.Maximum : hScrollBarImageView.Value - e.Delta));
595 break ;
596 default :
597 if (vScrollBarImageView.Visible)
598 vScrollBarImageView.Value = (vScrollBarImageView.Value - e.Delta < 0 ? 0 : (vScrollBarImageView.Value - e.Delta > vScrollBarImageView.Maximum ? vScrollBarImageView.Maximum : vScrollBarImageView.Value - e.Delta));
599 break ;
600 }
601 }
602 #endregion
603
604 #region 窗体按键事件处理
605
606 private void UcImageView_KeyDown( object sender, KeyEventArgs e)
607 {
608 if (e.Control)
609 keyAction = 1 ;
610 else if (e.Shift)
611 keyAction = 2 ;
612 }
613
614 private void UcImageView_KeyUp( object sender, KeyEventArgs e)
615 {
616 keyAction = 0 ;
617 }
618
619 private void picView_KeyDown( object sender, KeyEventArgs e)
620 {
621 if (e.Control)
622 keyAction = 1 ;
623 else if (e.Shift)
624 keyAction = 2 ;
625 else
626 keyAction = 3 ;
627 }
628 private void picView_KeyUp( object sender, KeyEventArgs e)
629 {
630 keyAction = 0 ;
631 }
632 #endregion
633
634 #region 快捷菜单事件代码
635 // 放大图片
636 private void mnuZoomIn_Click( object sender, EventArgs e)
637 {
638 this .ZoomInImage();
639 }
640
641 // 缩小图片
642 private void mnuZoomOut_Click( object sender, EventArgs e)
643 {
644 this .ZoomOutImage();
645 }
646
647 // 适应图片大小
648 private void mnuFitSize_Click( object sender, EventArgs e)
649 {
650 this .FitImageSize();
651 }
652
653 // 漫游图片
654 private void mnuMy_Click( object sender, EventArgs e)
655 {
656 MnuMoveImageChecked = ! mnuMy.Checked;
657 this .MoveImage();
658 }
659
660 // 左旋转图片
661 private void mnuLeftRotate_Click( object sender, EventArgs e)
662 {
663 this .LeftRotateImage();
664 }
665
666 // 右旋转图片
667 private void mnuRightRotate_Click( object sender, EventArgs e)
668 {
669 this .RightRotateImage();
670 }
671
672 #region 打印图片
673 // 打印图片
674 private void mnuPrint_Click( object sender, EventArgs e)
675 {
676 if (picView.Image != null )
677 {
678 PrintDialog printDgImageView = new PrintDialog();
679
680 /* 设置纸张类型
681 PaperSize pg = new PaperSize("A3",297,420);
682 printDocImageView.DefaultPageSettings.PaperSize = pg;
*/
683 PaperSize pg = new PaperSize( " A3 " , 23 , 33 );
684 printDgImageView.Document = printDocImageView;
685 if (printDgImageView.ShowDialog() == DialogResult.OK)
686 {
687 try
688 {
689 printDocImageView.Print();
690 }
691 catch
692 {
693 // 停止打印
694 printDocImageView.PrintController.OnEndPrint(printDocImageView, new System.Drawing.Printing.PrintEventArgs());
695 }
696 }
697 }
698 else
699 {
700 DialogHelper.ShowWarningMsg( " 对不起,没有要打印的数据! " );
701 }
702 }
703
704 private void printDocImageView_PrintPage( object sender, PrintPageEventArgs e)
705 {
706 this .FitImageSize(); // 实际尺寸
707 if (picView.Image != null )
708 {
709 e.Graphics.DrawImage(picView.Image, picView.Location.X, picView.Location.Y, picView.Width, picView.Height);
710 }
711 }
712 #endregion
713
714 #endregion
715
716 #region 窗体事件
717 private void mnuMy_CheckedChanged( object sender, EventArgs e)
718 {
719 if (OnMnuMoveImageCheckedChanged != null )
720 {
721 MnuMoveImageChecked = this .mnuMy.Checked;
722 OnMnuMoveImageCheckedChanged(sender, EventArgs.Empty);
723 }
724 }
725 #endregion
726 }
727 }

  二、WinForm窗体调用方法完整代码: 

  WinForm窗体调用UcImageView控件完整代码

  
  
1 . using System;
2 . using System.Collections.Generic;
3 . using System.ComponentModel;
4 . using System.Data;
5 . using System.Drawing;
6 . using System.Text;
7 . using System.Windows.Forms;
8 . using DotNet.Common;
9 . namespace DotNet.WinForm.Example11 {
10 . public partial class FrmUcImageView : Form13 {
11 . public FrmUcImageView()
12 . {
13 . InitializeComponent();
14 . }
15 . private void FrmUcImageView_Shown( object sender, EventArgs e)
16 . {
17 . try
18 . {
19 . ucImageViewTest.AddImage(Image.FromFile(Application.StartupPath + " \\windows7.jpg " ));
20 . }
21 . catch (Exception ex)
22 . {
23 . DialogHelper.ShowErrorMsg(ex.Message);
24 上海企业网站设计与制作an style="color: #000000;">. }
25 . }
26 . private void btnAdd_Click( object sender, EventArgs e)
27 . {
28 . openImgDlg.Filter = " Image Files(*.jpg;*.jpeg;*.tiff;*.gif)|*.jpg;*.gpeg;*.tiff;*.gif|All files (*.*)|*.* " ; // 图片文件的类型
29 . if (openImgDlg.ShowDialog() == DialogResult.OK)
30 . {
31 . string FileName, pathName;
32 . pathName = openImgDlg.FileName;
33 . FileName = FileHelper.GetName(pathName);
34 . ucImageViewTest.AddImage(Image.FromFile(pathName));
35 . }
36 . }
37 . private void btnZoomIn_Click( object sender, EventArgs e)
38 . {
39 . ucImageViewTest.ZoomInImage();
40 . }
41 . private void btnZoomOut_Click( object sender, EventArgs e)
42 . {
43 . ucImageViewTest.ZoomOutImage();
44 . }
45 .
46 . private void btnMy_Click( object sender, EventArgs e)
47 . {
48 . btnMy.Checked = ucImageViewTest.MnuMoveImageChecked = ! btnMy.Checked;
49 . ucImageViewTest.MoveImage();
50 . }
51 . private void btnFitSize_Click( object sender, EventArgs e)
52 . {
53 . ucImageViewTest.FitImageSize();
54 . }
55 . private void btnLeftRotate_Click( object sender, EventArgs e)
56 . {
57 . ucImageViewTest.LeftRotateImage();
58 . }
59 . private void btnRightRotate_Click( object sender, EventArgs e)
60 . {
61 . ucImageViewTest.RightRotateImage();
62 . }
63 . private void ucImageViewTest_OnMnuMoveImageCheckedChanged( object sender, EventArgs e)
64 . {
65 . // 使ucImageViewDj中的快捷菜单中的漫游的选中状态与当前窗口漫游按钮的选中状态保持一至
66 . btnMy.Checked = ucImageViewTest.MnuMoveImageChecked;
67 . }
68 . private void btnExit_Click( object sender, EventArgs e)
69 . {
70 . this .Close();
71 . }
72 . }
73 . }
目录
相关文章
|
1月前
|
C#
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
一个.NET开源、轻量级的运行耗时统计库 - MethodTimer
|
1月前
|
人工智能 自然语言处理 API
适用于 .NET 稳定的官方OpenAI库
适用于 .NET 稳定的官方OpenAI库
|
4月前
|
开发框架 JavaScript 前端开发
震撼!破解 ASP.NET 服务器控件 Button 执行顺序之谜,颠覆你的开发认知!
【8月更文挑战第16天】在ASP.NET开发中,通过Button控件实现先执行JavaScript再触后台处理的需求十分常见。例如,在用户点击按钮前需前端验证或提示,确保操作无误后再传递数据至后台深度处理。此过程可通过设置Button的`OnClientClick`属性调用自定义JavaScript函数完成验证;若验证通过,则继续触发后台事件。此外,结合jQuery也能达到相同效果,利用`__doPostBack`手动触发服务器端事件。这种方式增强了应用的交互性和用户体验。
52 8
|
1月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
33 4
|
2月前
|
安全 Java 网络安全
Android远程连接和登录FTPS服务代码(commons.net库)
Android远程连接和登录FTPS服务代码(commons.net库)
33 1
|
1月前
|
开发框架 安全 .NET
.NET使用Moq开源模拟库简化单元测试
.NET使用Moq开源模拟库简化单元测试~
|
2月前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
2月前
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
69 8
|
2月前
|
存储 开发框架 .NET
.NET 8 实现无实体库表 API 部署服务
【10月更文挑战第12天】在.NET 8中,可通过以下步骤实现无实体库表的API部署:首先安装.NET 8 SDK及开发工具,并选用轻量级Web API框架如ASP.NET Core;接着创建新项目并设计API,利用内存数据结构模拟数据存储;最后配置项目设置并进行测试与部署。此方法适用于小型项目或临时解决方案,但对于大规模应用仍需考虑持久化存储以确保数据可靠性与可扩展性。
|
2月前
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。
105 0