在pictureBox1上画出的直线,被pic给覆盖了,大家看下还有救吗?

LvBao_117 2019-07-17 12:44:38
小弟在网上找了资料,自己改编的,想实现类似”Windows画图“的功能,如画直线,结果画出的线,被pic给覆盖了,见下图



代码是完整的,请大家帮测试,小弟提前谢谢了
winForm,放上pictureBox1控件

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

PictureBox pic;
Point beginPoint;
Point endPoint;

private void button1_Click(object sender, EventArgs e)
{

}

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
pic = new PictureBox();
beginPoint = new Point(e.X, e.Y);
pic.Location = beginPoint;
pic.BackColor = Color.Red;
pictureBox1.Controls.Add(pic);
//pic.BringToFront();

}

private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
//先删除动态添加的pic,然后在picturebox1上画直线
pictureBox1.Controls.Remove(pic);

using (Graphics g = pictureBox1.CreateGraphics())
{
g.DrawLine(new Pen(Color.Black, 2), beginPoint, new Point(e.X, e.Y));
}

}

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left && pic != null)
{
pic.Width = e.X - beginPoint.X - 10;
pic.Height = e.Y - beginPoint.Y - 10;

using (Graphics g = pic.CreateGraphics())
{
if (endPoint != null)
{
//用背景色画线,覆盖掉上次画的线
g.DrawLine(new Pen(pic.BackColor, 2), new Point(0, 0), new Point(endPoint.X - beginPoint.X - 10, endPoint.Y - beginPoint.Y - 10));
}

g.DrawLine(new Pen(Color.Black, 2), new Point(0, 0), new Point(e.X - beginPoint.X - 10, e.Y - beginPoint.Y - 10));

}

endPoint = new Point(e.X, e.Y);

}

}
}



...全文
3515 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
ZyLL_123 2019-07-29
  • 打赏
  • 举报
回复
在form里,设置图置于放在底层就行了
在路上_2019 2019-07-26
  • 打赏
  • 举报
回复
OnPaint什么方法的原理是什么?时候回调这个方法,没有注册事,件或者用 Invatil ()l
weixin_45431286 2019-07-20
  • 打赏
  • 举报
回复
好评!!!
luj_1768 2019-07-20
  • 打赏
  • 举报
回复
好像正确的做法是使用view类,先获得view类的客户区(clientArea),然后使用绘图类进行绘图操作。绘图板的所有操作好像绘图类里都有对应的函数,传递参数给相关函数,绘图操作就完成了。这种软件的核心难题是,如何记录数据。此外,还需要设计一个好用的人机交互界面。
李春阳 2019-07-19
  • 打赏
  • 举报
回复
回复测试手机版本
jungleman_xo 2019-07-19
  • 打赏
  • 举报
回复
回复测试手机版本大点啊啊
Mr_Young123 2019-07-19
  • 打赏
  • 举报
回复
牛逼!!!!!!!!!!
LvBao_117 2019-07-19
  • 打赏
  • 举报
回复
winForm里,OnPaint方法的原理是什么?
z1031683050 2019-07-19
  • 打赏
  • 举报
回复
空间会不会半个月刚刚韩国的然后还有然后好人发给
assky124 2019-07-19
  • 打赏
  • 举报
回复
PaintEventArgs e F12 转到定义,F1 查看帮助,MSDN有说明的
KK_MM1083 2019-07-19
  • 打赏
  • 举报
回复
e是当前的对象123
qq_42995340 2019-07-19
  • 打赏
  • 举报
回复
好评!感谢发表
houzp 2019-07-19
  • 打赏
  • 举报
回复
厉害了,真优秀啊!!!
LvBao_117 2019-07-18
  • 打赏
  • 举报
回复
引用 12 楼 assky124 的回复:
直接绘制Line不行么?

对,就是画直线!
我那想法太复杂,没把问题说清楚

不过有的地方看不懂,还劳烦解释下,讲下原理,我是小白
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
foreach(var obj in lines)
{
e.Graphics.DrawLine(Pens.Black, obj.Start, obj.End);
}
if (isMouseDown)
{
e.Graphics.DrawLine(Pens.Black, ptDown, ptCurrent);
}
}

这个函数是做什么用的?
为什么是e.Graphics.DrawLine(),e是什么?

其他几位也提供了有价值的东西,我要好好学习下,不懂还要问,谢谢! 现在追加50分
LvBao_117 2019-07-18
  • 打赏
  • 举报
回复
感谢大家,小弟正在尝试
XBodhi. 2019-07-18
  • 打赏
  • 举报
回复
因为你移动的时候没有重新绘制。所以导致原来的线停留在原来的位置上。如果你需要通过层的方式画,那就要保证所哟对象的 位置一致。
浮夸吧。 2019-07-18
  • 打赏
  • 举报
回复
发的 厉害 6666
desperaso 2019-07-18
  • 打赏
  • 举报
回复
可以画很多个线段,点按钮添加就可以了
https://pan.baidu.com/s/1CFP5-YQy0-bggzebHHAKjA
提取: 1ylh

就200多行,边界范围的筛选自行修改一下

assky124 2019-07-18
  • 打赏
  • 举报
回复
直接绘制Line不行么?


    public partial class Form1 : Form
    {
        private Point ptDown = Point.Empty;
        private Point ptCurrent = Point.Empty;
        private bool isMouseDown = false;
        private List<LineObj> lines = new List<LineObj>();

        public Form1()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
        }

        protected override void OnMouseDown(MouseEventArgs e)
        {
            base.OnMouseDown(e);
            ptDown = e.Location;
            isMouseDown = true;
            this.Focus();
        }

        protected override void OnMouseUp(MouseEventArgs e)
        {
            base.OnMouseUp(e);
            if (isMouseDown)
            {
                var obj = new LineObj() { Start = ptDown, End = e.Location };
                lines.Add(obj);
                isMouseDown = false;
            }
        }

        protected override void OnMouseMove(MouseEventArgs e)
        {
            base.OnMouseMove(e);
            if (isMouseDown)
            {
                ptCurrent = e.Location;
                this.Invalidate();
            }
        }

        //取消添加
        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);
            if(e.KeyCode == Keys.Escape)
            {
                isMouseDown = false;
                this.Invalidate();
            }
        }


        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
            foreach(var obj in lines)
            {
                e.Graphics.DrawLine(Pens.Black, obj.Start, obj.End);
            }
            if (isMouseDown)
            {
                e.Graphics.DrawLine(Pens.Black, ptDown, ptCurrent);
            }
        }
    }

    internal class LineObj
    {
        public Point Start { get; set; }

        public Point End { get; set; }
    }
summer followers 2019-07-18
  • 打赏
  • 举报
回复
大概是没救了
加载更多回复(7)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧