GDI+如何实现动态画线?

我想要达到的效果是,首先固定线的一个端点,然后当鼠标滑动时,线是动态画的,就是线的另一个端点随鼠标移动,当鼠标点击时画线,然后将线的起点改成鼠标点击的那个点,然后重复上述... 我想要达到的效果是,首先固定线的一个端点,然后当鼠标滑动时,线是动态画的,就是线的另一个端点随鼠标移动,当鼠标点击时画线,然后将线的起点改成鼠标点击的那个点,然后重复上述步骤。我的想法是使用双缓存技术,但是我鼠标点击时不松开鼠标是可以划线的,但松开以后就没有那条线了,主要代码如下:

其中bgForm的Load函数里进行了初始化
bg = current.Allocate(this.panel1.CreateGraphics(), this.DisplayRectangle);
展开
 我来答
百度网友ccfe1c6
推荐于2016-05-17 · TA获得超过113个赞
知道答主
回答量:44
采纳率:0%
帮助的人:44.8万
展开全部
你的双缓冲的代码不对。给你个例子参考一下:

        Bitmap   bmMem = null;
        Graphics gMem  = null;
        Graphics gPanel = null;
        Point    ptBefore;
        bool     bIsMouseDown = false;
        
        void MainFormLoad(object sender, EventArgs e)
        {
            bmMem = new Bitmap(this.panel1.Width, this.panel1.Height);
            gMem  = Graphics.FromImage(bmMem);
            gPanel= this.panel1.CreateGraphics();
            ptBefore = new Point(0, 0);
        }
        
        
        void Panel1MouseDown(object sender, MouseEventArgs e)
        {
            bIsMouseDown = true;
            ptBefore = e.Location;
        }
        
        void Panel1MouseUp(object sender, MouseEventArgs e)
        {
            bIsMouseDown = false;
        }
        
        void Panel1MouseMove(object sender, MouseEventArgs e)
        {
            if (bIsMouseDown)
            {
                gMem.DrawLine(Pens.Red, ptBefore, e.Location);
                gPanel.DrawImage(bmMem, 0, 0);
                ptBefore = e.Location;
            }
        }
        
        void Panel1Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(bmMem, 0, 0);
        }

更多追问追答
追问
大神,你好,首先谢谢您帮我解答,但是可惜的是,这个效果不是我想要的那种,我是想固定线的起始节点,然后鼠标移动时的鼠标的坐标作为线的另一个节点,然后鼠标点击时,线的起始节点改变,您可以帮我解决这个问题吗?
追答

好滴,试试这样看:

        Bitmap   bmMem = null;
        Graphics gMem  = null;
        Graphics gPanel = null;
        Point    ptStart;
        
        void MainFormLoad(object sender, EventArgs e)
        {
            bmMem = new Bitmap(this.panel1.Width, this.panel1.Height);
            gMem  = Graphics.FromImage(bmMem);
            gPanel= this.panel1.CreateGraphics();
            ptStart = new Point(0, 0);
        }
        
        
        void Panel1MouseDown(object sender, MouseEventArgs e)
        {
            ptStart = e.Location;
        }
        
        void Panel1MouseMove(object sender, MouseEventArgs e)
        {
            gMem.Clear(BackColor);
            gMem.DrawLine(Pens.Red, ptStart, e.Location);
            gPanel.DrawImage(bmMem, 0, 0);
        }
        
        void Panel1Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawImage(bmMem, 0, 0);
        }
ZESTRON
2024-09-04 广告
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸... 点击进入详情页
本回答由ZESTRON提供
匿名用户
2013-12-25
展开全部
加油还有一步只要啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式