作者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