作者m13m13m (奇怪 還沒收到??)
看板C_Sharp
標題[問題] 請問為何無法畫圖...
時間Tue Aug 23 22:58:25 2011
我看書上的範例:
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
1F:→ SnowyFox:我猜應該是缺了將paint_f方法加到form的Paint事件中 08/23 23:08
2F:→ m13m13m:請問是甚麼意思... 08/23 23:11
3F:→ m13m13m:Form的paint事件指的是? 08/23 23:11
4F:→ SnowyFox:Paint事件會在控制項繪製的時候執行 08/23 23:11
5F:→ SnowyFox:可以查一下Form的Event會比較了解執行時機和次序 08/23 23:12
6F:→ m13m13m:請問是要到TOOLBOX上找一個這種button嗎? 08/23 23:14
7F:→ m13m13m:我是直接在Form.cs上打入這些指令,沒有多做什麼... 08/23 23:14
8F:→ m13m13m:所以所謂的"控制項"繪製指的是... 08/23 23:15
9F:→ m13m13m:不好意思 我還太菜了 08/23 23:15
10F:→ SnowyFox:方法一:在表單上選取屬性/找到Paint方法/選取paint_f 08/23 23:19
11F:→ SnowyFox:方法二:在 Initialize()方法中增加 08/23 23:20
12F:→ m13m13m:請問所謂的菜單是project -> XXX.property嗎? 08/23 23:21
13F:→ SnowyFox:Form1.Paint += paint_f(參數); 08/23 23:24
14F:→ m13m13m:加在InitializeComponent() ? 08/23 23:25
15F:→ SnowyFox:沒打清楚,是Form1()的InitializeComponent方法之後 08/23 23:28
16F:→ SnowyFox:表單指的是視窗的設計頁,選取表單/檢視/屬性視窗/ 08/23 23:30
17F:→ SnowyFox:屬性視窗中的閃電符號會列出表單支援的方法 08/23 23:32
18F:→ m13m13m:n...我試一下 好像有點小問題 不過我找到閃電了 08/23 23:36
19F:→ m13m13m:是指property window 下面的那個嗎? 08/23 23:36
20F:→ SnowyFox:是 08/23 23:37
21F:→ m13m13m:所以那個函式不能被呼叫嗎? T - T 08/23 23:40
22F:→ m13m13m:另外我的form上面還有load: 把圖load進picturebox 08/23 23:41
23F:→ m13m13m:和一個exit. 一把paint那邊點選後 就連一開始的載圖都不行 08/23 23:42
24F:→ SnowyFox:他是將方法掛在Form的事件上 在事件發生時會執行該段程式 08/23 23:42
25F:→ m13m13m:想必程式是一開始就跑paint那段程式碼八xd... 08/23 23:43
26F:→ m13m13m:所以form一出來就開始畫畫了阿! 08/23 23:43
27F:→ m13m13m:可是我想要把圖載入後再到上面畫畫 不想到form上面畫畫xd. 08/23 23:44
28F:→ SnowyFox:是的 在你看到視窗跑出來的時候 圖就畫完了 08/23 23:48
29F:→ m13m13m:那怎麼互動阿?xd....我按button 它畫圖在form上的美夢... 08/23 23:52
30F:→ m13m13m:先跟您說一百聲謝謝! SnowyFox 08/23 23:56
31F:→ SnowyFox:自己建立方法 不使用事件 原程式 Form1_Paint中的程式碼 08/24 00:01
32F:→ SnowyFox:複製到自訂的方法中 最後的 e.graphics.xxx 替換為 08/24 00:02
33F:→ SnowyFox:Graphics g = this.CreateGraphics(); 08/24 00:03
34F:→ SnowyFox:g.DrawPath(Pens.Black, gp); g.Dispose(); 08/24 00:04
35F:→ SnowyFox:然後你再從按鈕的 Click 事件去呼叫這個方法 08/24 00:05
36F:→ SnowyFox:我也是菜鳥 也有很多不會 當做學習吧 呵呵 08/24 00:05
37F:→ m13m13m:我想一下下喔 ... 08/24 00:07
38F:→ m13m13m:ok 其實您說的方法我一開始是類似那樣的 但是因為g 是 08/24 00:13
39F:→ m13m13m:Graphics 所以少了一個很重要的method 就是.CloseFigure() 08/24 00:15
40F:→ m13m13m:所以我畫的curve和直線 VS非常之雞婆難以形容 居然給老子 08/24 00:15
41F:→ m13m13m:把他們的尾端連起來....... 08/24 00:16
42F:→ SnowyFox:你可以去MSDN查一下CloseFigure這個方法 根據說明 08/24 00:19
43F:→ SnowyFox:他會將目前畫的圖形封閉沒錯 如果不要的話 你可以不呼叫 08/24 00:20
44F:→ SnowyFox:這個方法 08/24 00:20
45F:→ m13m13m:不...是他自己會把我的曲線圖s 的尾巴連起來,根據書上指示 08/24 00:24
46F:→ m13m13m:要用這個method 但無奈要用 picturebox.creategraph(); 08/24 00:24
47F:→ m13m13m:就是Graphics paint = plate.CreateGraphics(); 沒有 08/24 00:25
48F:→ m13m13m: .closeFigure()... 好謝謝你 我去msdn看看closeFigure. 08/24 00:25
49F:→ SnowyFox:CloseFigure 是 GraphicsPath 的方法 08/24 00:28
50F:→ SnowyFox:Graphics 上面是沒有這個方法的 要不要檢查一下用的物件 08/24 00:29
51F:→ m13m13m:對阿 沒有這個方法所以無法阻止尾巴互連的麻煩事 08/24 00:38
52F:→ SnowyFox:另外 你遇到的問題 我猜可以用把不想要封閉的圖形集中到 08/24 00:38
53F:→ SnowyFox:最後 然後最後不要呼叫 CloseFigure 08/24 00:40
54F:→ SnowyFox:呃 你不是有使用 GraphicsPath就是上面程式的 gp 物件嗎? 08/24 00:41
55F:→ m13m13m:我不能用graphicspath 只能用Graphics因為那樣才能 08/24 00:46
56F:→ m13m13m:GraphicsPath paint= picturebox.CreateGraphics(); 08/24 00:47
57F:→ m13m13m:才能只針對picturebox去做圖 所以書上有跟我說甚麼 08/24 00:48
58F:→ m13m13m:先封閉再打開 那是在GraphicsPath的東西 我第一步就無法 08/24 00:48
59F:→ m13m13m:寫GraphicsPath paint = plate.CreateGraphics();了 08/24 00:49
60F:→ m13m13m:00:47那行修正為: Graphics paint= picturebox.Create(); 08/24 00:50
61F:→ SnowyFox:基本上Graphics和GraphicsPath應該是沒有什麼衝突 就像上 08/24 01:12
62F:→ SnowyFox:面範例的自己new一個就可以使用了 08/24 01:13
63F:→ SnowyFox:只有你在繪製上去的時候需要取得控制項的Graphics物件 08/24 01:14
64F:→ SnowyFox:這個部份以你的需要應該是picturebox.CreateGraphics() 08/24 01:15
65F:→ SnowyFox:來畫在你指定的控制項上 08/24 01:16
66F:→ SnowyFox:或是可以考慮使用Graphics物件的DrawXXX方法 08/24 01:24
67F:→ SnowyFox:另外 我不確定你在00:49的語句是否只是誤打 08/24 01:25
68F:→ SnowyFox:Graphics和GraphicsPath是不同的物件 08/24 01:26
69F:→ SnowyFox:picturebox.CreateGraphics取回的是Graphics物件 08/24 01:27
70F:→ SnowyFox:所以無法指定給GraphicsPath物件,要使用的話,要new一個 08/24 01:28
71F:→ SnowyFox:GraphicsPath物件來使用 08/24 01:28
72F:→ m13m13m:你說的沒錯,你好認真 先在謝謝你 我再想想看解決方法xd... 08/24 01:36
73F:→ m13m13m:解決了 唉...結果跟這些都沒關係 是我忘記把變數重新clear 08/24 02:35
74F:→ m13m13m:明明是犯過n次的錯誤 但卻又浪費了3/4h 真是tmd T - T 08/24 02:36
75F:→ m13m13m:不過要十分感謝SnowyFox 我又學到了一些新東西 謝謝你! 08/24 02:36