2015-09-30 29 views
-1

我使用方法在我的面板上畫一些東西,當我通過一個按鈕繪製按鈕時調用此方法,但是當我在上調用此方法時,它不繪製任何內容。當我調試它時,它實際上是通過代碼沒有任何問題,但它仍然不會畫任何東西。在Form_Load上繪圖C++/CLI

下面你可以看到和Button_Click事件:

private: System::Void SelectElementForm_Load(System::Object^ sender, System::EventArgs^ e) 
{ 
    if (ElementList->Count > 0) 
    { 
     Index = 0; 
     DrawLinesInLayout(); 
    } 
} 

和按鈕

private: System::Void btnLeft_Click(System::Object^ sender, System::EventArgs^ e) 
{ 
    if (ElementList->Count > 0) 
    { 
     if (Index + 1 > 1) 
     { 
      Index--; 
      DrawLinesInLayout(); 
     } 
     else 
     { 
      Index = ElementList->Count - 1; 
      DrawLinesInLayout(); 
     } 
    } 
} 

當我使用它工作時,我的形式彈出Paint-event。但後來我在我的程序中得到了兩次代碼,這有點沒用。

所以我的問題是:

  • 爲什麼沒有被正確使用我的方法我和Form_load中我的按鈕是什麼?
  • 我可以通過單擊按鈕來調用Paint事件嗎?
+0

是的,保留原始代碼是毫無意義的。將像素噴濺到尚不可見的窗口是浪費時間。刪除它。當需要再次運行Paint事件時調用Invalidate()。 –

+0

@Hans調用Invalidate()不適用於我,它只是重繪我的第一個'Paint'事件。我在我的'Paint'事件中有一些變量,當我按下按鈕時會發生變化。 – Bart

+0

使用'Shown'事件來解決它,而不是'Load'事件 – Bart

回答

0

正如Hans Passant所說,你不能借鑑那些還沒有的東西。解決方案:創建後繪製。

Invalidate();不起作用,因爲繪圖方法中有變化(這就是爲什麼每個呼叫事件都有Index更改)。

而不是使用Load事件,請使用Shown事件。這將畫出表格上的線條:

private: System::Void SelectElementForm_Shown(System::Object^ sender, System::EventArgs^ e) 
{ 
    if (ElementList->Count > 0) 
    { 
     Index = 0; 
     DrawLinesInLayout(); 
    } 
}