2017-08-06 85 views
1

我尝试在onPaint()方法中使用DrawString()方法显示字符串,具体取决于另一个方法中的标志。 我没有正确显示它,因为它看起来很快就消失了!如何在C#中使用DrawString()方法或MessageBox()而不使用DrawString()方法或MessageBox()在Form或PictureBox上显示字符串

是否有任何其他的方式,即在不使用DrawString()MessageBox(),为了显示或绘制这样的消息。

请注意,我用Thread.Sleep()

onPaint()

if(auvSend == true) { 

       base.OnPaint(e); 



       g.DrawString("Received Aggrigated Data from AUV # " + auv[auvSenderID].auvID, font,auvSendMsg, 500, 36); // Display that the sink receive data from the AUV 

       MessageBox.Show("Received Aggrigated Data from AUV # " + auv[auvSenderID].auvID); 

       player.Play(); 

       Thread.Sleep(3000);    

       g.DrawImage(new Bitmap("C:/temp/temp.png"), 500, 36, 196, 16);// clear 

       player.Stop(); 

       auv[auvSenderID].queue1.Clear(); 

       auvSend = false; 



      } 

我检查数组列表,如果它包含了特定数量的改变背景的标志的值做的工作方法:

if (moveBtnIsClicked == false && movebtnGeneticIsClicked == false) 
        { 

         if (auv[0].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[0].queue1) 
          { 
           auv[0].SendToSink(packet); 
          } 


          auvSenderID = 0; 

          auvSend = true; 

          topology.Invalidate();       


         } 



         if (auv[1].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[1].queue1) 
          { 
           auv[1].SendToSink(packet); 
          } 

          auvSenderID = 1; 


          auvSend = true; 

          topology.Invalidate(); 


         } 


         if (auv[2].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[2].queue1) 
          { 
           auv[2].SendToSink(packet); 
          } 


          auvSenderID = 2; 

          auvSend = true; 

          topology.Invalidate(); 


         } 


         if (auv[3].queue1.Count == 10) 
         { 


          foreach (Packet packet in auv[3].queue1) 
          { 
           auv[3].SendToSink(packet); 
          } 


          auvSenderID = 3; 

          auvSend = true; 

          topology.Invalidate(); 




         } 


        } 
+0

_Is有任何其他方式即__without__使用的DrawString()_为什么呢?因为你第一次尝试失败了?为什么不使用定时器? – TaW

+0

我用Thread.Sleep(3000)! – Rose

+0

我知道。但是我不知道你的Draw代码的外观。你所做的是哪个线程等待。 UI线程?一个坏主意,冻结程序.. – TaW

回答

1

有没有足够的上下文在你的问题中提供一个适合你的具体需求的答案。不过,我相信你使用的基本方法是根本错误的。即似乎没有理由将代码放在OnPaint()方法中,并且这样做会阻塞UI线程,并且在重绘的过程中(因此,双重错误)。

假设你有一个按钮,启动一个动作(称为例如,button1),并且要显示的文本窗体上的标签(称为例如,label1)像这样的工作:

private async void button1_Click(object sender, EventArgs e) 
{ 
    label1.Text = "Received Aggregated Data from AUV # " + auv[auvSenderID].auvID 
    label1.Visible = true; 
    player.Play(); 
    await Task.Delay(3000);    
    label1.Visible = false; 
    player.Stop(); 
    auv[auvSenderID].queue1.Clear(); 
    auvSend = false; 
} 

缺乏情况下,我不知道是什么player是,也不是是否Play()和/或Stop()方法快速完成与否。不过,假设这些被立即返回方法,上面会设置文本,显示标签,调用Play()方法,然后等待三秒钟不会阻塞UI线程,然后隐藏标签,调用Stop()法等一旦等待完成。

如果您正在处理所有这些以响应除用户单击按钮之外的其他内容,则可以执行相同的基本操作,但只是采用不同的方法(即不是使用Click事件处理程序)。只要打电话时要启动的文本显示该方法等

+0

但我需要的标签的变化取决于如果声明不按钮点击! – Rose

+0

_“我需要的标签中的变化取决于if语句不是按钮单击”_ - 就像我已经在我的答案中写过的一样:_“如果您正在做的所有这些以响应除用户单击按钮之外的其他内容,你可以做同样的基本事情“_。你没有打算提供一个好的[mcve],所以我不能告诉你 - 你会怎么做;但总体思路是,在你的'if'语句的地方,你可以调用一个方法,就像我上面显示的'Click'事件处理程序一样工作。在另一种方法中,最明显的区别是您可以放弃'sender'和'e'参数。 –

+0

我更新了我的问题... – Rose

相关问题