2017-08-06 124 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

相關問題