[問題] 請問為何無法畫圖...

看板C_Sharp (C#)作者 (奇怪 還沒收到??)時間12年前 (2011/08/23 22:58), 編輯推噓0(0075)
留言75則, 2人參與, 最新討論串1/1
我看書上的範例: 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

08/23 23:08, , 1F
我猜應該是缺了將paint_f方法加到form的Paint事件中
08/23 23:08, 1F

08/23 23:11, , 2F
請問是甚麼意思...
08/23 23:11, 2F

08/23 23:11, , 3F
Form的paint事件指的是?
08/23 23:11, 3F

08/23 23:11, , 4F
Paint事件會在控制項繪製的時候執行
08/23 23:11, 4F

08/23 23:12, , 5F
可以查一下Form的Event會比較了解執行時機和次序
08/23 23:12, 5F

08/23 23:14, , 6F
請問是要到TOOLBOX上找一個這種button嗎?
08/23 23:14, 6F

08/23 23:14, , 7F
我是直接在Form.cs上打入這些指令,沒有多做什麼...
08/23 23:14, 7F

08/23 23:15, , 8F
所以所謂的"控制項"繪製指的是...
08/23 23:15, 8F

08/23 23:15, , 9F
不好意思 我還太菜了
08/23 23:15, 9F

08/23 23:19, , 10F
方法一:在表單上選取屬性/找到Paint方法/選取paint_f
08/23 23:19, 10F

08/23 23:20, , 11F
方法二:在 Initialize()方法中增加
08/23 23:20, 11F

08/23 23:21, , 12F
請問所謂的菜單是project -> XXX.property嗎?
08/23 23:21, 12F

08/23 23:24, , 13F
Form1.Paint += paint_f(參數);
08/23 23:24, 13F

08/23 23:25, , 14F
加在InitializeComponent() ?
08/23 23:25, 14F

08/23 23:28, , 15F
沒打清楚,是Form1()的InitializeComponent方法之後
08/23 23:28, 15F

08/23 23:30, , 16F
表單指的是視窗的設計頁,選取表單/檢視/屬性視窗/
08/23 23:30, 16F

08/23 23:32, , 17F
屬性視窗中的閃電符號會列出表單支援的方法
08/23 23:32, 17F

08/23 23:36, , 18F
n...我試一下 好像有點小問題 不過我找到閃電了
08/23 23:36, 18F

08/23 23:36, , 19F
是指property window 下面的那個嗎?
08/23 23:36, 19F

08/23 23:37, , 20F
08/23 23:37, 20F

08/23 23:40, , 21F
所以那個函式不能被呼叫嗎? T - T
08/23 23:40, 21F

08/23 23:41, , 22F
另外我的form上面還有load: 把圖load進picturebox
08/23 23:41, 22F

08/23 23:42, , 23F
和一個exit. 一把paint那邊點選後 就連一開始的載圖都不行
08/23 23:42, 23F

08/23 23:42, , 24F
他是將方法掛在Form的事件上 在事件發生時會執行該段程式
08/23 23:42, 24F

08/23 23:43, , 25F
想必程式是一開始就跑paint那段程式碼八xd...
08/23 23:43, 25F

08/23 23:43, , 26F
所以form一出來就開始畫畫了阿!
08/23 23:43, 26F

08/23 23:44, , 27F
可是我想要把圖載入後再到上面畫畫 不想到form上面畫畫xd.
08/23 23:44, 27F

08/23 23:48, , 28F
是的 在你看到視窗跑出來的時候 圖就畫完了
08/23 23:48, 28F

08/23 23:52, , 29F
那怎麼互動阿?xd....我按button 它畫圖在form上的美夢...
08/23 23:52, 29F

08/23 23:56, , 30F
先跟您說一百聲謝謝! SnowyFox
08/23 23:56, 30F

08/24 00:01, , 31F
自己建立方法 不使用事件 原程式 Form1_Paint中的程式碼
08/24 00:01, 31F

08/24 00:02, , 32F
複製到自訂的方法中 最後的 e.graphics.xxx 替換為
08/24 00:02, 32F

08/24 00:03, , 33F
Graphics g = this.CreateGraphics();
08/24 00:03, 33F

08/24 00:04, , 34F
g.DrawPath(Pens.Black, gp); g.Dispose();
08/24 00:04, 34F

08/24 00:05, , 35F
然後你再從按鈕的 Click 事件去呼叫這個方法
08/24 00:05, 35F

08/24 00:05, , 36F
我也是菜鳥 也有很多不會 當做學習吧 呵呵
08/24 00:05, 36F

08/24 00:07, , 37F
我想一下下喔 ...
08/24 00:07, 37F

08/24 00:13, , 38F
ok 其實您說的方法我一開始是類似那樣的 但是因為g 是
08/24 00:13, 38F

08/24 00:15, , 39F
Graphics 所以少了一個很重要的method 就是.CloseFigure()
08/24 00:15, 39F

08/24 00:15, , 40F
所以我畫的curve和直線 VS非常之雞婆難以形容 居然給老子
08/24 00:15, 40F

08/24 00:16, , 41F
把他們的尾端連起來.......
08/24 00:16, 41F

08/24 00:19, , 42F
你可以去MSDN查一下CloseFigure這個方法 根據說明
08/24 00:19, 42F

08/24 00:20, , 43F
他會將目前畫的圖形封閉沒錯 如果不要的話 你可以不呼叫
08/24 00:20, 43F

08/24 00:20, , 44F
這個方法
08/24 00:20, 44F

08/24 00:24, , 45F
不...是他自己會把我的曲線圖s 的尾巴連起來,根據書上指示
08/24 00:24, 45F

08/24 00:24, , 46F
要用這個method 但無奈要用 picturebox.creategraph();
08/24 00:24, 46F

08/24 00:25, , 47F
就是Graphics paint = plate.CreateGraphics(); 沒有
08/24 00:25, 47F

08/24 00:25, , 48F
.closeFigure()... 好謝謝你 我去msdn看看closeFigure.
08/24 00:25, 48F

08/24 00:28, , 49F
CloseFigure 是 GraphicsPath 的方法
08/24 00:28, 49F

08/24 00:29, , 50F
Graphics 上面是沒有這個方法的 要不要檢查一下用的物件
08/24 00:29, 50F

08/24 00:38, , 51F
對阿 沒有這個方法所以無法阻止尾巴互連的麻煩事
08/24 00:38, 51F

08/24 00:38, , 52F
另外 你遇到的問題 我猜可以用把不想要封閉的圖形集中到
08/24 00:38, 52F

08/24 00:40, , 53F
最後 然後最後不要呼叫 CloseFigure
08/24 00:40, 53F

08/24 00:41, , 54F
呃 你不是有使用 GraphicsPath就是上面程式的 gp 物件嗎?
08/24 00:41, 54F

08/24 00:46, , 55F
我不能用graphicspath 只能用Graphics因為那樣才能
08/24 00:46, 55F

08/24 00:47, , 56F
GraphicsPath paint= picturebox.CreateGraphics();
08/24 00:47, 56F

08/24 00:48, , 57F
才能只針對picturebox去做圖 所以書上有跟我說甚麼
08/24 00:48, 57F

08/24 00:48, , 58F
先封閉再打開 那是在GraphicsPath的東西 我第一步就無法
08/24 00:48, 58F

08/24 00:49, , 59F
寫GraphicsPath paint = plate.CreateGraphics();了
08/24 00:49, 59F

08/24 00:50, , 60F
00:47那行修正為: Graphics paint= picturebox.Create();
08/24 00:50, 60F

08/24 01:12, , 61F
基本上Graphics和GraphicsPath應該是沒有什麼衝突 就像上
08/24 01:12, 61F

08/24 01:13, , 62F
面範例的自己new一個就可以使用了
08/24 01:13, 62F

08/24 01:14, , 63F
只有你在繪製上去的時候需要取得控制項的Graphics物件
08/24 01:14, 63F

08/24 01:15, , 64F
這個部份以你的需要應該是picturebox.CreateGraphics()
08/24 01:15, 64F

08/24 01:16, , 65F
來畫在你指定的控制項上
08/24 01:16, 65F

08/24 01:24, , 66F
或是可以考慮使用Graphics物件的DrawXXX方法
08/24 01:24, 66F

08/24 01:25, , 67F
另外 我不確定你在00:49的語句是否只是誤打
08/24 01:25, 67F

08/24 01:26, , 68F
Graphics和GraphicsPath是不同的物件
08/24 01:26, 68F

08/24 01:27, , 69F
picturebox.CreateGraphics取回的是Graphics物件
08/24 01:27, 69F

08/24 01:28, , 70F
所以無法指定給GraphicsPath物件,要使用的話,要new一個
08/24 01:28, 70F

08/24 01:28, , 71F
GraphicsPath物件來使用
08/24 01:28, 71F

08/24 01:36, , 72F
你說的沒錯,你好認真 先在謝謝你 我再想想看解決方法xd...
08/24 01:36, 72F

08/24 02:35, , 73F
解決了 唉...結果跟這些都沒關係 是我忘記把變數重新clear
08/24 02:35, 73F

08/24 02:36, , 74F
明明是犯過n次的錯誤 但卻又浪費了3/4h 真是tmd T - T
08/24 02:36, 74F

08/24 02:36, , 75F
不過要十分感謝SnowyFox 我又學到了一些新東西 謝謝你!
08/24 02:36, 75F
文章代碼(AID): #1EKy0J7_ (C_Sharp)
文章代碼(AID): #1EKy0J7_ (C_Sharp)