Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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# 背景图像显示,但钢笔线不&ාx27;T_C#_Winforms_Picturebox - Fatal编程技术网

C# 背景图像显示,但钢笔线不&ාx27;T

C# 背景图像显示,但钢笔线不&ාx27;T,c#,winforms,picturebox,C#,Winforms,Picturebox,我将picturebox的背景设置为图像,这很好。 我尝试在背景图像上画钢笔线,但这些线不会出现在图像的顶部 这应该会发生:(我更改了代码,不知道我更改了什么来实现这一点,但这没有重置picturebox) picturebox每2000毫秒更新一次,以显示旗帜信号,但我一辈子都无法显示这些线条 以下是代码位: lblSelectedChar.Text = inputchar.ToString(); picSemaphore.BackgroundImage = semaphore.Prope

我将picturebox的背景设置为图像,这很好。 我尝试在背景图像上画钢笔线,但这些线不会出现在图像的顶部

这应该会发生:(我更改了代码,不知道我更改了什么来实现这一点,但这没有重置picturebox)

picturebox每2000毫秒更新一次,以显示旗帜信号,但我一辈子都无法显示这些线条

以下是代码位:

lblSelectedChar.Text = inputchar.ToString();
picSemaphore.BackgroundImage = semaphore.Properties.Resources.human;
leftHandDown();
rightHandLow();
leftHandDown()和rightHandLow()方法画了线,但我认为它们是在图像后面画的。我想把它们画在前面。你知道我该怎么做吗

private void leftHandDown()
{
    lblLeftHand.Hide();
    display.DrawLine(penLeftArm, centXCoord, centYCoord, LHDownXCoord, LHDownYCoord);
    lblLeftHand.Top = LHDownYCoord + 74;
    lblLeftHand.Left = LHDownXCoord + 13;
    lblLeftHand.Show();
    lblLeftHand.Update();
}

此外,当移动标签时,它会在上次所在的位置留下一个空白。知道如何阻止这种情况发生吗?

正如LarsTech所建议的,使用PictureBox的Paint()事件通过
e.Graphics
值用提供的图形绘制线条。您可以调用
picSemaphore.Refresh()使行更新

下面是一个简单的示例,让您了解基本概念:

public partial class Form1 : Form
{

    private bool displayLeftArmLine = false;
    private bool displayRightArmLine = false;

    public Form1()
    {
        InitializeComponent();
        picSemaphore.Paint += new PaintEventHandler(picSemaphore_Paint);
    }

    void picSemaphore_Paint(object sender, PaintEventArgs e)
    {
        if (displayLeftArmLine)
        {
            e.Graphics.DrawLine(penLeftArm, centXCoord, centYCoord, LHDownXCoord, LHDownYCoord);
        }
        if (displayRightArmLine)
        {
            e.Graphics.DrawLine(penRightArm, centXCoord, centYCoord, RHDownXCoord, RHDownYCoord);
        }
    }

    private void leftHandDown()
    {
        lblLeftHand.Hide();
        lblLeftHand.Top = LHDownYCoord + 74;
        lblLeftHand.Left = LHDownXCoord + 13;
        lblLeftHand.Show();
        lblLeftHand.Update();

        displayLeftArmLine = true;
        picSemaphore.Refresh(); // force Paint() event for "picSemaphore" to fire
    }

}

什么是
显示
?如何获得它?
display=picSemaphore.CreateGraphics()在加载表单时初始化。不要这样做。使用绘画事件或图像中的图形。您能解释一下吗?对不起,我不太清楚你的意思。CreateGraphics是表面上的临时图形。通过最小化窗体或让另一个窗体在其上移动,它将被擦除。基本上,永远不要使用CreateGraphics…永远不要。此外,切勿将图形存储在长期变量中。使用paint事件可以在
e.Graphics
属性中为您提供图形对象。我将试一试。唯一的问题是,对于
picSemaphore\u-Paint
方法,有6条不同的左臂线和6条不同的右臂线,它们都具有不同的X和Y坐标。我会假设,我会有12个if语句?目前,诸如
lefthandown()
之类的方法是从开关盒块调用的,尽管我认为使用上面的代码,我可以只设置bool标志。嗯……它不必那么复杂。难道你不能只声明一组“CurrentX”、“CurrentY”变量,然后将它们设置到各种方法中需要的任何位置吗?然后,Paint()事件可以只使用一个布尔值来指示是否应该绘制线,并且它可以获取由这些方法设置的类级别x、y值。