C#开发实例-订制屏幕截图工具(七)添加放大镜功能的代码示例


本文摘自PHP中文网,作者黄舟,侵删。

由于截图时可能需要精确截取某一部分,所以需要放大镜的功能,这样截取的时候才更容易定位截图的位置。

添加PictureBox,name属性设置为“pictureBox_zoom”;


在“Form1_Load”事件处理函数中添加以下代码:

1

2

3

//设置放大镜的大小

            this.pictureBox_zoom.Width = this.ZoomBoxWidth;

            this.pictureBox_zoom.Height = this.ZoomBoxHeight;

在“ExitCutImage”方法中添加代码:

在“Form1_MouseUp”事件处理函数中添加代码:


在“ShowForm”方法的else条件最后添加代码:

1

2

3

4

5

if (this.ZoomBoxVisible)

                {

                    UpdateCutInfoLabel(UpdateUIMode.ShowZoomBox);

                    this.pictureBox_zoom.Show();

                }

在“UpdateCutInfoLabel”函数最后添加以下代码:

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

if (this.pictureBox_zoom.Visible || (updateUIMode & UpdateUIMode.ShowZoomBox) != UpdateUIMode.None)

            {

                Point zoomLocation = new Point(MousePosition.X + 15, MousePosition.Y + 22);

                if (zoomLocation.Y + this.pictureBox_zoom.Height > this.Height)

                {

                    if (zoomLocation.X + this.pictureBox_zoom.Width > this.Width)

                    {

                        zoomLocation = new Point(MousePosition.X - this.pictureBox_zoom.Width - 10, MousePosition.Y - this.pictureBox_zoom.Height - 10);

                    }

                    else

                    {

                        zoomLocation = new Point(MousePosition.X + 15, MousePosition.Y - this.pictureBox_zoom.Height - 15);

                    }

                }

                else

                {

                    if (zoomLocation.X + this.pictureBox_zoom.Width > this.Width)

                    {

                        zoomLocation = new Point(MousePosition.X - this.pictureBox_zoom.Width - 15, MousePosition.Y);

                    }

                }

                this.pictureBox_zoom.Location = zoomLocation;

                if (!this.pictureBox_zoom.Visible)

                {

                    this.pictureBox_zoom.Show();

                }

            }

在“Form1_KeyUp”事件处理函数中添加以下代码:


为“pictureBox_zoom”添加“Paint”事件处理程序,代码如下:

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

/// <summary>

/// 放大镜组件重绘事件处理程序

/// 实时显示鼠标指针位置放大后的图像

/// </summary>

/// <param name="sender"></param>

/// <param name="e"></param>

private void pictureBox_zoom_Paint(object sender, PaintEventArgs e)

{

    Bitmap bmp_lbl = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height);

    int srcWidth = (int)(this.ZoomBoxWidth / 10);

    int srcHeight = (int)(this.ZoomBoxHeight / 10);

 

    Bitmap bmp = new Bitmap(srcWidth, srcHeight);

    Rectangle srcRect = new Rectangle(MousePosition.X - 5, MousePosition.Y - 4, srcWidth, srcHeight);

    if (!isCuting)

    {

        srcRect = new Rectangle(MousePosition.X - 6, MousePosition.Y - 5, srcWidth, srcHeight);

    }

    Graphics g = Graphics.FromImage(bmp);

    g.DrawImage(screenImage, 0, 0, srcRect, GraphicsUnit.Pixel);

    g.Dispose();

 

    //Zoom

    int x, y;

    for (int row = 0; row < bmp.Height; row++)

    {

        for (int col = 0; col < bmp.Width; col++)

        {

            Color pc = bmp.GetPixel(col, row);

            for (int h = 0; h < 10; h++)

            {

                for (int w = 0; w < 10; w++)

                {

                    x = col * 10 + w;

                    y = row * 10 + h;

                    if (x < bmp_lbl.Width && y < bmp_lbl.Height)

                    {

                        bmp_lbl.SetPixel(x, y, pc);

                    }

                }

            }

        }

    }

 

    e.Graphics.DrawImage(bmp_lbl, 0, 0);

 

    int blockX = e.ClipRectangle.Width / 2;

    int blockY = e.ClipRectangle.Height / 2;

 

    SolidBrush brush = new SolidBrush(Color.FromArgb(10, 124, 202));

    Pen pen = new Pen(brush, 2.0F);

    e.Graphics.DrawLine(pen, new Point(0, blockY), new Point(e.ClipRectangle.Width, blockY));

    e.Graphics.DrawLine(pen, new Point(blockX, 0), new Point(blockX, e.ClipRectangle.Height));

 

    g.Dispose();

    bmp_lbl.Dispose();

}

编译,运行,截图看看效果吧!

阅读剩余部分

相关阅读 >>

利用unity脚本自定义分辨率实现相机截一张高清截图

C#如何实现两个richtextbox控件滚动条同步滚动的简单方法

详细介绍C#时间戳和js时间戳互转方法的代码分享

详解C#集合类型大盘点的图文代码

C#中static void main(string[] args) 参数的示例代码详解

.net框架-微软给出的C#编程风格代码实例

C#开发实例-订制屏幕截图工具(五)针对拖拽时闪烁卡顿的优化

C# win32控制台应用程序忽略ctrl + c阻止程序退出的代码示例(图)

C#开发实例-订制屏幕截图工具(二)创建项目、注册热键、显示截图主窗口

C#最齐全的上传图片方法介绍

更多相关阅读请进入《C#》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...