2013-07-02 5 views
1

Я установил фон изображения как изображение, что хорошо. Я стараюсь рисовать перо линию над фоновым изображением, но линии не появляются на верхней части изображений enter image description hereФоновое изображение показывает, но линии пера не

Это должно произойти: (я изменил код и не догадывается, что я изменил, чтобы это произошло , но это без сброса изображения) enter image description here

Картинка обновляется каждые 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(); 
} 

Также, когда этикетка перемещена, она оставляет пустое пространство, где оно было последним. Любая идея, как остановить это?

+0

Что такое 'display'? Как вы это поняли? –

+0

'display = picSemaphore.CreateGraphics();' Инициализировано при загрузке формы. –

+0

Не делайте этого. Используйте событие Paint или графику с изображения. – LarsTech

ответ

0

Как предлагалось LarsTech, используйте событие Paint() вашего PictureBox, чтобы нарисовать линии с прилагаемой графикой с помощью значения 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 
    } 

} 
+0

Я отдам это. Единственное, для метода 'picSemaphore_Paint', есть 6 различных линий левого рукава и 6 различных линий правого рукава, все с разными координатами X и Y. Итак, я собираюсь предположить, что у меня было бы 12 утверждений? В настоящий момент методы, такие как 'leftHandDown()' вызывают из блока case-switch, хотя я думаю, что с вашим кодом выше, я могу просто установить флаги bool. –

+0

Ну ... это не должно быть так сложно. Не могли бы вы просто объявить ОДИН набор переменных «CurrentX», «CurrentY», а затем установить их в любую позицию, в которой они нуждаются, в ваших различных методах? Тогда событие Paint() может просто использовать ONE boolean, чтобы указать, должны ли линии вообще рисоваться, и он может захватывать значения уровня x, y класса, установленные этими методами. –

+0

Это сработало блестяще !! Спасибо!! –

Смежные вопросы