2011-04-29 140 views
0

因此,我在Visual C++ 2010中創建了Windows窗體應用程序,並且我想將一個事件添加到文本框中。當程序加載時,字母A被打印到屏幕上。當你輸入文本框時,該字母應該變成紅色。使用PaintEventHandler - Visual C++(Studio 2010)Windows窗體應用程序

文本框中的名稱是AngleA,這是我的代碼至今:

this->AngleA->Enter += gcnew System::Windows::Forms::PaintEventHandler(this, &Form1::AngleA_Enter); 
//many lines later 
this->Controls->Add(this->AngleA); 
//many lines later 
public: System::Void Form1::AngleA_Enter(System::Object^ sender, PaintEventArgs^ e) 
    { 
     System::Drawing::Font^ textFontA = gcnew System::Drawing::Font("Arial", 16); 
     System::Drawing::SolidBrush^ textBrushA = gcnew System::Drawing::SolidBrush(Color::Red); 
     e->Graphics->DrawString("A", textFontA, textBrushA, 300, 120); 
    } 

信的原始繪圖發生在一個單獨的功能,在這裏:

public: virtual Void Form1::OnPaint(PaintEventArgs^ pe) override 
{ 
    Graphics^ g = pe->Graphics; 

    System::Drawing::Font^ textFont = gcnew System::Drawing::Font("Times New Roman", 16); 

    SolidBrush^ textBrushA = gcnew SolidBrush(Color::Black); 

    g->DrawString("A", textFont, textBrushA, 300, 120); 

} 

因此,原始信件的繪製效果很好,但每次嘗試使用Enter事件構建程序時,出現以下錯誤:

error C2664: 'System::Windows::Forms::Control::Enter::add' : cannot convert parameter 1 from 'System::Windows::Forms::PaintEventHandler ^' to 'System::EventHandler ^' 
1>   No user-defined-conversion operator available, or 
1>   Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

在我看來,form1對象(Windows窗體應用程序中的類的默認名稱)只接受「this-> AngleA-> Enter + = gcnew」的EventHandler參數,而不是PaintEventHandler,但我不明白爲什麼。有什麼方法可以創建一個Enter事件函數,它允許我在程序加載後根據事件進行繪製?

感謝您的幫助,我希望我在我的問題:)

回答

0

明確只能添加一個PaintEventHandlerPaint事件;而不是Enter事件。

您可能希望將EventHandler添加到Enter事件中,並在處理程序中調用Invalidate()

+0

好吧,我明白了。事情是,我不想重新繪製控制本身,我想在窗口的不同部分繪製一個現有的紅色字母A.如何定義我想要繪製的字符串「A」的區域? – 2011-04-29 17:59:12

+0

在'Paint'處理程序中,您可以繪製任何您想要的內容,並且會繪製控件。 – SLaks 2011-04-29 18:05:22

+0

我真的不知道Invalidate()是如何工作的;下面有什麼Ive得到: 'code'public:系統:虛空Form1中:: AngleA_Enter(系統:對象^發件人,EventArgs^E) \t \t { \t \t \t長方形矩形; \t \t \t rectangle.X = 250; \t \t \t rectangle.Y = 120; \t \t \t rectangle.Width = 30; \t \t \t rectangle.Height = 30; \t \t \t Invalidate(rectangle); \t \t} 很顯然,這是遠不及我想要的。我如何使用invalidate()函數的方式來引用? – 2011-04-29 18:18:38

相關問題