C# GDI繪圖—簡單畫板的實現
最近在學習這個,發現網路上C#很多相關的問答講解上都不完整,耗費了時間還解決不了自己的問題。所以打算將自己學習過程中的一些東西上傳來,分享給初學者們,大家一起勉勵吧!(因為是面向初學者的交流,會寫的囉嗦點,請見諒)
這裡要用到的是Graphics類,所以各位在學習的時候要想看看這個相關的基礎知識。
先講解下大家會遇到的問題吧。
1. 畫好後的影象在最小化之後玩玩會消失不見,其實這是因為最小化後再開啟,窗體進行了重新繪製,所以這時候我們要恢復顯示就要在窗體的OnPaint方法中重繪圖片。
只要直接呼叫窗體的OnPaint事件即可。(如下)
protected
{
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. using
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