Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽绳不出现_C#_.net_Winforms - Fatal编程技术网

C# 抽绳不出现

C# 抽绳不出现,c#,.net,winforms,C#,.net,Winforms,当鼠标在面板上移动时,我试图画一条垂直线: private void panel1_MouseMove(object sender, MouseEventArgs e) { Panel panel = sender as Panel; if (panel != null) { using (Graphics g = panel.CreateGraphics()) { using (Pen pen = new Pen(

当鼠标在面板上移动时,我试图画一条垂直线:

private void panel1_MouseMove(object sender, MouseEventArgs e)
{
    Panel panel = sender as Panel;
    if (panel != null)
    {
        using (Graphics g = panel.CreateGraphics())
        {
            using (Pen pen = new Pen(Color.Red))
            {
                g.DrawLine(pen, e.X, 0, e.X, panel.Height);
            }
        }
        panel.Invalidate(true);
    }
}
但是什么也没有画出来


我做错了什么?

所有GDI绘图都必须在.Paint事件中使用PaintEventArgs参数中提供的图形对象进行。使用.MouseMove存储鼠标值,并触发绘制事件

试试这个:

public partial class Form1 : Form
{
    Point mouse;
    MouseButtons buttons;

    public Form1()
    {
        InitializeComponent();
    }

    private void panel1_Paint(object sender, PaintEventArgs e)
    {
        if (sender is Panel panel)
        {
            var g = e.Graphics;
            g.DrawLine(Pens.Red, mouse.X, 0, mouse.X, panel.Height);
        }
    }

    private void panel1_MouseMove(object sender, MouseEventArgs e)
    {
        mouse=e.Location;
        buttons=e.Button;

        panel1.Refresh();
    }
}
结果如下:


调用Invalidate是否会强制重新绘制,从而删除绘制的图形?最好在Paint事件处理程序中进行绘制。control.CreateGraphics将导致非持久性绘制。这意味着一旦系统或代码触发重画,它将被清除。您可以使用Invalidate命令执行此操作。删除该行,该行将可见,但不会保留。把它从屏幕上移开,它就会消失。。通常,正如其他人所指出的,您只希望在绘制事件中进行ot绘制。-control.CreateGraphics可用于实时绘制橡皮筋线条或其他移动内容。或者进行一些测量还要注意的是,面板应该是透明的,以避免闪烁!您可以通过将笔存储在一个实例变量中来对此进行改进,这样就不需要经常创建和处理笔了。创建笔非常便宜。实际推荐的方法是使用钢笔。红色但事实上,这个问题不应该被回答,而是作为数百篇其他帖子的副本关闭并删除。@TaW-现在这个问题没有被标记为重复,所以我很乐意为OP提供一个简单的答案。你可以随意挑剔答案,但事实是,我的答案指导OP如何进行GDI绘图,我想这正是他想要的。@alex-注意,在面板上绘图可能会导致闪烁。试着改用PictureBox。