C# GDI绘图—简单画板的实现

最近在学习这个,发现网络上C#很多相关的问答讲解上都不完整,耗费了时间还解决不了自己的问题。所以打算将自己学习过程中的一些东西上传来,分享给初学者们,大家一起勉励吧!(因为是面向初学者的交流,会写的啰嗦点,请见谅)

这里要用到的是​​G​r​a​p​h​i​c​s​类,所以各位在学习的时候要想看看这个相关的基础知识。

先讲解下大家会遇到的问题吧。

1.  画好后的图像在最小化之后玩玩会消失不见,其实这是因为最小化后再打开,窗体进行了重新绘制,所以这时候我们要恢复显示就要在窗体的OnPaint方法中重绘图片。

只要直接调用窗体的OnPaint事件即可。(如下)

         protected override void OnPaint(PaintEventArgs e)

        {

            base.OnPaint(e);

            //编写绘制图片程序

     }

注:OnPaint事件可以对控件或者图像进行重绘,一般出现最小化后打开消失问题可以直接将画图程序复制到这个事件当中即可。此外,这种方法也多用于对于按钮控件等进行重绘美工。

 

2.      如果采用上面这个重绘方法,那么我们就需要将每一次鼠标绘制时的信息都记录起来,这样的话数据太长,重绘也会比较麻烦,消耗资源。所以这里解决的方法是新建一个bitmap来作画,并将bitmap实时显示在容器当中(我这里直接使用了pictrueBox来显示,比较方便)。

 

好了,闲话少说,下面就是程序了 做好了注释,上面也有讲解,应该比较好理解了。

1.      新建一个项目,就form窗体,拖入pictrueBox跟两个button控件。如下

 

 

2.      主程序如下

3.  using System;

4.  usingSystem.Collections.Generic;

5.  usingSystem.ComponentModel;

6.  using System.Data;

7.  using System.Drawing;

8.  using System.Linq;

9.  using System.Text;

10. usingSystem.Threading.Tasks;

11. usingSystem.Windows.Forms;

12. usingSystem.Drawing.Imaging;

13.  

14. namespace paintBox

15. {

16.     public partial class Form1 : Form

17.     {

18.         public Form1()

19.         {

20.             InitializeComponent();

21.         }

22.  

23.         Bitmap myImage;//定义一个用于保存即时图像的位图

24.         //取得pictureBox的宽高,用于新建画布大小

25.         int PBwidth;

26.         int PBheight;

27.         bool beginPaint = false;//是否启动画画程序

28.         bool beginMove = false;//判断画画时鼠标是否开始移动

29.         //记录绘图时鼠标的即时坐标信息

30.         int currentXpos;

31.         int currentYpos;

32.  

33.  

34.         //初始化

35.         private void Form1_Load(object sender, EventArgs e)

36.         {

37.             PBwidth = pictureBox1.Width;

38.             PBheight = pictureBox1.Height;

39.         }

40.  

41.         private void button1_Click(object sender, EventArgs e)

42.         {

43.             if (button1.Text == "开始画画")

44.             {

45.                 beginPaint = true;

46.                 button1.Text = "结束画画";

47.                 //新建一个以白色为背景色的画布,并显示在pictureBox

48.                 myImage = new Bitmap(PBwidth, PBheight);

49.                 Graphics g = Graphics.FromImage(myImage);

50.                 g.Clear(Color.White);

51.                 pictureBox1.Image = myImage;

52.             }

53.             else if (button1.Text == "结束画画")

54.             {

55.                 beginPaint = false;

56.                 button1.Text = "开始画画";

57.             }

58.         }

59.  

60.  

61.  

62.  

63.         //当按住鼠标左键时,表示开始画画,并取得按下时的坐标值

64.         private voidpictureBox1_MouseDown(object sender, MouseEventArgs e)

65.         {

66.             if (beginPaint == true)

67.             {

68.                 if (e.Button == MouseButtons.Left)

69.                 {

70.                     beginMove = true;

71.                     currentXpos = e.X;

72.                     currentYpos = e.Y;

73.                 }

74.             }

75.         }

76.  

77.  

78.         //移动作画

79.         private voidpictureBox1_MouseMove(object sender, MouseEventArgs e)

80.         {

81.             if (beginMove)

82.             {

83.                 //在先前建立的位图中建立画布,同于画画

84.                 Graphics gp = Graphics.FromImage(myImage);

85.                 //画线

86.                 Pen myPen = new Pen(Color.Black, 2);

87.                 gp.DrawLine(myPen, currentXpos,currentYpos, e.X, e.Y);

88.                 //将重新画好的图重新指向pictureBox显示

89.                 pictureBox1.Image = myImage;

90.                 gp.Dispose();

91.                 //再记录当前的鼠标值,为下一次移动鼠标画画准备

92.                 currentXpos = e.X;

93.                 currentYpos = e.Y;

94.             }

95.         }

96.  

97.  

98.         //松开鼠标,暂时结束画画

99.         private voidpictureBox1_MouseUp(object sender, MouseEventArgs e)

100.         {

101.             if (e.Button == MouseButtons.Left)

102.             {

103.                 beginMove = false;

104.                 currentXpos = 0;

105.                 currentYpos = 0;

106.             }

107.         }

108.         //保存图像

109.         private void button2_Click(object sender, EventArgs e)

110.         {

111.             if (beginPaint == true)

112.             {

113.                 SaveFileDialog sfd = new SaveFileDialog();

114.                 if (sfd.ShowDialog()== DialogResult.OK)

115.                 {

116.                     //储存为Jpeg格式,加个后缀保存,让Photoshop之类的软件识别

117.                     myImage.Save(sfd.FileName+@".jpeg",ImageFormat.Jpeg);

118.                 }

119.             }

120.             else

121.             {

122.                 MessageBox.Show("请先绘制图像");

123.                 return;

124.             }

125.         }

126.     }

127. }

 

 

 

总结:发散思维,在画画捕捉鼠标移动当中,我们是不是也可以利用这个计算方法来做选取功能。熟悉选取功能做法后,将绘图跟选取结合不就是一个截图工具吗?


http://blog.csdn.net/u011283936/article/details/46635055

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
优化路径是指通过对路径进行优化,使其更加平滑,从而提高路径的质量和效率。在 C# 中,可以使用 GDI+ 来实现路径的优化。 首先,需要创建一个 GraphicsPath 对象,该对象用于存储路径信息。然后,通过调用 GraphicsPath 的 AddLine 或 AddCurve 方法,将路径的线段或曲线段添加到 GraphicsPath 中。接下来,可以使用 GraphicsPath 的 Flatten 或 Widen 方法来优化路径。 Flatten 方法将路径中的曲线段转换为线段,从而使路径更加平滑。Widen 方法则可以将路径进行扩展,从而使路径更加宽阔。可以根据实际需求选择使用哪种方法进行路径优化。 以下是一个简单的示例代码,演示了如何使用 GDI+ 实现路径的优化: ``` // 创建 GraphicsPath 对象 GraphicsPath path = new GraphicsPath(); // 添加路径线段 path.AddLine(0, 0, 100, 100); path.AddLine(100, 100, 200, 100); path.AddLine(200, 100, 300, 0); // 优化路径 path.Flatten(); // 在画布上绘制路径 Graphics graphics = this.CreateGraphics(); graphics.DrawPath(Pens.Black, path); ``` 上述示例代码创建了一个 GraphicsPath 对象,添加了三条直线路径,并使用 Flatten 方法对路径进行优化。最后,使用 DrawPath 方法在画布上绘制优化后的路径。 需要注意的是,路径的优化是一个相对较慢的过程,如果需要对大量路径进行优化,可能会导致性能问题。因此,在实际应用中需要谨慎考虑路径优化的使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值