【问题标题】:Background image shows, but pen lines don't背景图像显示,但笔线不显示
【发布时间】:2013-07-03 03:07:46
【问题描述】:

我将图片框的背景设置为图像,这很好。 我尝试在背景图像上画笔线,但这些线条没有出现在图像顶部

这应该会发生:(我更改了代码,但不知道我更改了什么来实现这一点,但这是在没有重置图片框的情况下)

图片框每 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();
}

另外,当标签被移动时,它会在最后的位置留下一个空白区域。知道如何阻止这种情况发生吗?

【问题讨论】:

  • 什么是display?你是怎么得到它的?
  • display = picSemaphore.CreateGraphics(); 在表单加载时初始化。
  • 不要那样做。使用 Paint 事件或图像中的 Graphics。
  • 您能解释一下吗?我不太清楚你的意思,抱歉。
  • CreateGraphics 是表面上的临时绘图。通过最小化表单或让另一个表单在其上移动,它将被删除。基本上,永远不要使用 CreateGraphics...永远。此外,切勿将图形存储在长期变量中。使用paint 事件为您提供e.Graphics 属性中的图形对象。

标签: c# winforms picturebox


【解决方案1】:

正如 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
    }

}

【讨论】:

  • 我会试一试的。唯一的问题是,对于picSemaphore_Paint 方法,有 6 条不同的左臂线和 6 条不同的右臂线,它们都具有不同的 X 和 Y 坐标。那么,我将假设我将有 12 个 if 语句?目前,leftHandDown() 等方法是从 switch-case 块调用的,尽管我认为使用上面的代码,我可以设置 bool 标志。
  • 嗯...不必那么复杂。难道你不能只声明一组“CurrentX”、“CurrentY”变量,然后将它们设置到它们在各种方法中需要的任何位置吗?然后 Paint() 事件可以只使用一个布尔值来指示是否应该绘制线条,并且它可以获取方法设置的类级别 x、y 值。
猜你喜欢
  • 2010-12-19
  • 2023-03-05
  • 2015-07-26
  • 1970-01-01
  • 2013-04-30
  • 2012-12-11
  • 2016-08-19
  • 2016-06-11
  • 2015-12-10
相关资源
最近更新 更多