标题:要编程一个画板,但不知道怎样下手,请各位高手指点迷津。。
只看楼主
lelejiayou
Rank: 1
来 自:宁海
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-3-20
结帖率:73.68%
已结贴  问题点数:10 回复次数:9 
要编程一个画板,但不知道怎样下手,请各位高手指点迷津。。
就给我举个简单的例子就成,比如就画一条直线,首先在radiobutton的那个按钮上按一下,再把鼠标拖到画面上,点击并移动鼠标,就有一条直线画成,,请高手赐教。。
搜索更多相关主题的帖子: 鼠标 
2013-04-02 09:23
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
GTest.rar (35.93 KB)

vs2008写的,方法特意没有加注释,希望你能自己看懂。
2013-04-02 11:36
lelejiayou
Rank: 1
来 自:宁海
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-3-20
得分:0 
好的,,谢谢版主。。
2013-04-02 14:07
lelejiayou
Rank: 1
来 自:宁海
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-3-20
得分:0 
为什么我画出来的只能是一条直线,当第二条出现时,第一条马上消失了,,代码就和你上面的差不多。。就是我在label上画的,而不是在panel上,可是这应该没什么关系啊,,,
2013-04-02 15:59
哈1哈1呵1呵1
Rank: 1
等 级:新手上路
帖 子:10
专家分:4
注 册:2013-4-2
得分:0 
高手
2013-04-02 16:14
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:10 
以下是引用lelejiayou在2013-4-2 15:59:34的发言:

为什么我画出来的只能是一条直线,当第二条出现时,第一条马上消失了,,代码就和你上面的差不多。。就是我在label上画的,而不是在panel上,可是这应该没什么关系啊,,,

因为我们在画的时候,是要刷新的,如果不刷新,鼠标移动的时候,就会出现满屏的线条,但刷新就会把之前的线条也清除了
所以当我们每完成一条线之后,就需要将该线的首尾两个点保存起来,在刷新以后,把这些已完成的线再重新画上去,然后再画正在进行的线,效果就出来了
2013-04-02 21:09
lelejiayou
Rank: 1
来 自:宁海
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-3-20
得分:0 
版主,为什么里面要加一个foreach语句呢???不懂。。。还有,,,我这个已经写了保存上一个画的,可是效果没有,请求教
画图板.zip (42.67 KB)
。。
2013-04-05 11:44
lelejiayou
Rank: 1
来 自:宁海
等 级:新手上路
帖 子:73
专家分:0
注 册:2013-3-20
得分:0 
还有如何彻底的把radiobutton1改为radioline????????一次性的,,,
2013-04-05 12:04
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
使用foreach的原因就是,因为我们是用数组来保存的每一次画的线,我们需要循环数组,把之前画的所有线都画上去,所以用了foreach,当然你用for循环也是可以的
你的问题就正好出在foreach里面那句
foreach (Form1 line in lines)
{
    g.DrawLine(Pens.Black, line.epoint, line.spoint);    //要改成这样才行
}
因为从数组lines里面取出来的是Form1对象,对象的引用是line,而起始和结束的点,都是在每个Form1对象里面保存的,所以要从引用line里面取,你直接写变量,就相当于取当前这个对象的变量,当前对象的变量这时还没有赋值,在label5_MouseUp事件里面才赋值,所以直接取变量,就等于什么都没画。
如果把foreach改为for的话
for (int i = 0; i < lines.Count; i++)
{
    Form1 line = lines[i];
    g.DrawLine(Pens.Black, line.epoint, line.spoint);
}
这样写你就能明白了。

要改控件名,直接在设计界面选中控件,在属性窗口里面改Name就可以了,至于代码里面你可以用查找替换啊,虽然控件名改了,但事件还是关联的原radiobutton1的事件,也就是事件的那个方法名不需要改,如果要改,最好的方式就是在属性窗口的事件里面删掉重新创建
2013-04-05 15:03
yhlvht
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:贵宾
威 望:36
帖 子:707
专家分:4405
注 册:2011-9-30
得分:0 
另外,你为label5加一个Paint事件,方法代码如下
private void label5_Paint(object sender, PaintEventArgs e)
{
    foreach (Form1 line in lines)
    {
        e.Graphics.DrawLine(Pens.Black, line.epoint, line.spoint);
    }
}
这样可以保证窗体最小化后还原,或是移出屏幕再移回来的时候,线不会消失,并且这样做以后,画线的时候,屏幕还不会闪(用Lable不会闪,但我例子中用的panel,panel还是会闪)

[ 本帖最后由 yhlvht 于 2013-4-6 09:08 编辑 ]
2013-04-06 08:55



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-402794-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.148106 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved