看板 C_Sharp 關於我們 聯絡資訊
我看書上的範例: using ~~~(省) namespace WindowsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Paint(object sender, PaintEventArgs e) { GraphicsPath gp = new GraphicsPath(); // GraphicsPath物件 Point p1 = new Point(10, 20); // 直線的兩端 Point p2 = new Point(100, 20); gp.AddLine(p1, p2); // 將 直線 加入到 GraphicsPath物件 gp.CloseFigure(); // 先封閉 第一條直線 Point p3 = new Point(10, 50); // 直線的兩端 Point p4 = new Point(100, 50); gp.AddLine(p3, p4); // 將第二條直線 加入到 GraphicsPath物件 e.Graphics.DrawPath(Pens.Black, gp); // 繪出GraphicsPath物件 } } } 我很好奇why我們都沒有call 畫圖的那個method 就是arguments中有 (object sender, PaintEventArgs e) 那行的程式 他就會自動執行所以可以畫圖 到底是誰call 那行程式導致可以畫圖?? 最重要的是... 我也是按照 ********************************************************************* using ~~ 一堆一堆 namespace test001 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void paint_f(object sender, PaintEventArgs e) { GraphicsPath paint = new GraphicsPath(); ........一堆 e.Graphics.DrawCurve(pen, pt); } } } 去做 就不會自動畫圖 / \ 好幾天了 好悶阿 請高手指點 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.155.193
SnowyFox:我猜應該是缺了將paint_f方法加到form的Paint事件中 08/23 23:08
m13m13m:請問是甚麼意思... 08/23 23:11
m13m13m:Form的paint事件指的是? 08/23 23:11
SnowyFox:Paint事件會在控制項繪製的時候執行 08/23 23:11
SnowyFox:可以查一下Form的Event會比較了解執行時機和次序 08/23 23:12
m13m13m:請問是要到TOOLBOX上找一個這種button嗎? 08/23 23:14
m13m13m:我是直接在Form.cs上打入這些指令,沒有多做什麼... 08/23 23:14
m13m13m:所以所謂的"控制項"繪製指的是... 08/23 23:15
m13m13m:不好意思 我還太菜了 08/23 23:15
SnowyFox:方法一:在表單上選取屬性/找到Paint方法/選取paint_f 08/23 23:19
SnowyFox:方法二:在 Initialize()方法中增加 08/23 23:20
m13m13m:請問所謂的菜單是project -> XXX.property嗎? 08/23 23:21
SnowyFox:Form1.Paint += paint_f(參數); 08/23 23:24
m13m13m:加在InitializeComponent() ? 08/23 23:25
SnowyFox:沒打清楚,是Form1()的InitializeComponent方法之後 08/23 23:28
SnowyFox:表單指的是視窗的設計頁,選取表單/檢視/屬性視窗/ 08/23 23:30
SnowyFox:屬性視窗中的閃電符號會列出表單支援的方法 08/23 23:32
m13m13m:n...我試一下 好像有點小問題 不過我找到閃電了 08/23 23:36
m13m13m:是指property window 下面的那個嗎? 08/23 23:36
SnowyFox:是 08/23 23:37
m13m13m:所以那個函式不能被呼叫嗎? T - T 08/23 23:40
m13m13m:另外我的form上面還有load: 把圖load進picturebox 08/23 23:41
m13m13m:和一個exit. 一把paint那邊點選後 就連一開始的載圖都不行 08/23 23:42
SnowyFox:他是將方法掛在Form的事件上 在事件發生時會執行該段程式 08/23 23:42
m13m13m:想必程式是一開始就跑paint那段程式碼八xd... 08/23 23:43
m13m13m:所以form一出來就開始畫畫了阿! 08/23 23:43
m13m13m:可是我想要把圖載入後再到上面畫畫 不想到form上面畫畫xd. 08/23 23:44
SnowyFox:是的 在你看到視窗跑出來的時候 圖就畫完了 08/23 23:48
m13m13m:那怎麼互動阿?xd....我按button 它畫圖在form上的美夢... 08/23 23:52
m13m13m:先跟您說一百聲謝謝! SnowyFox 08/23 23:56
SnowyFox:自己建立方法 不使用事件 原程式 Form1_Paint中的程式碼 08/24 00:01
SnowyFox:複製到自訂的方法中 最後的 e.graphics.xxx 替換為 08/24 00:02
SnowyFox:Graphics g = this.CreateGraphics(); 08/24 00:03
SnowyFox:g.DrawPath(Pens.Black, gp); g.Dispose(); 08/24 00:04
SnowyFox:然後你再從按鈕的 Click 事件去呼叫這個方法 08/24 00:05
SnowyFox:我也是菜鳥 也有很多不會 當做學習吧 呵呵 08/24 00:05
m13m13m:我想一下下喔 ... 08/24 00:07
m13m13m:ok 其實您說的方法我一開始是類似那樣的 但是因為g 是 08/24 00:13
m13m13m:Graphics 所以少了一個很重要的method 就是.CloseFigure() 08/24 00:15
m13m13m:所以我畫的curve和直線 VS非常之雞婆難以形容 居然給老子 08/24 00:15
m13m13m:把他們的尾端連起來....... 08/24 00:16
SnowyFox:你可以去MSDN查一下CloseFigure這個方法 根據說明 08/24 00:19
SnowyFox:他會將目前畫的圖形封閉沒錯 如果不要的話 你可以不呼叫 08/24 00:20
SnowyFox:這個方法 08/24 00:20
m13m13m:不...是他自己會把我的曲線圖s 的尾巴連起來,根據書上指示 08/24 00:24
m13m13m:要用這個method 但無奈要用 picturebox.creategraph(); 08/24 00:24
m13m13m:就是Graphics paint = plate.CreateGraphics(); 沒有 08/24 00:25
m13m13m: .closeFigure()... 好謝謝你 我去msdn看看closeFigure. 08/24 00:25
SnowyFox:CloseFigure 是 GraphicsPath 的方法 08/24 00:28
SnowyFox:Graphics 上面是沒有這個方法的 要不要檢查一下用的物件 08/24 00:29
m13m13m:對阿 沒有這個方法所以無法阻止尾巴互連的麻煩事 08/24 00:38
SnowyFox:另外 你遇到的問題 我猜可以用把不想要封閉的圖形集中到 08/24 00:38
SnowyFox:最後 然後最後不要呼叫 CloseFigure 08/24 00:40
SnowyFox:呃 你不是有使用 GraphicsPath就是上面程式的 gp 物件嗎? 08/24 00:41
m13m13m:我不能用graphicspath 只能用Graphics因為那樣才能 08/24 00:46
m13m13m:GraphicsPath paint= picturebox.CreateGraphics(); 08/24 00:47
m13m13m:才能只針對picturebox去做圖 所以書上有跟我說甚麼 08/24 00:48
m13m13m:先封閉再打開 那是在GraphicsPath的東西 我第一步就無法 08/24 00:48
m13m13m:寫GraphicsPath paint = plate.CreateGraphics();了 08/24 00:49
m13m13m:00:47那行修正為: Graphics paint= picturebox.Create(); 08/24 00:50
SnowyFox:基本上Graphics和GraphicsPath應該是沒有什麼衝突 就像上 08/24 01:12
SnowyFox:面範例的自己new一個就可以使用了 08/24 01:13
SnowyFox:只有你在繪製上去的時候需要取得控制項的Graphics物件 08/24 01:14
SnowyFox:這個部份以你的需要應該是picturebox.CreateGraphics() 08/24 01:15
SnowyFox:來畫在你指定的控制項上 08/24 01:16
SnowyFox:或是可以考慮使用Graphics物件的DrawXXX方法 08/24 01:24
SnowyFox:另外 我不確定你在00:49的語句是否只是誤打 08/24 01:25
SnowyFox:Graphics和GraphicsPath是不同的物件 08/24 01:26
SnowyFox:picturebox.CreateGraphics取回的是Graphics物件 08/24 01:27
SnowyFox:所以無法指定給GraphicsPath物件,要使用的話,要new一個 08/24 01:28
SnowyFox:GraphicsPath物件來使用 08/24 01:28
m13m13m:你說的沒錯,你好認真 先在謝謝你 我再想想看解決方法xd... 08/24 01:36
m13m13m:解決了 唉...結果跟這些都沒關係 是我忘記把變數重新clear 08/24 02:35
m13m13m:明明是犯過n次的錯誤 但卻又浪費了3/4h 真是tmd T - T 08/24 02:36
m13m13m:不過要十分感謝SnowyFox 我又學到了一些新東西 謝謝你! 08/24 02:36