最近在学习这个,发现网络上C#很多相关的问答讲解上都不完整,耗费了时间还解决不了自己的问题。所以打算将自己学习过程中的一些东西上传来,分享给初学者们,大家一起勉励吧!(因为是面向初学者的交流,会写的啰嗦点,请见谅)
这里要用到的是Graphics类,所以各位在学习的时候要想看看这个相关的基础知识。
先讲解下大家会遇到的问题吧。
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.youkuaiyun.com/u011283936/article/details/46635055