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