2011-04-29 3 views
0

Ainsi, je crée une application Windows Forms dans Visual C++ 2010 et je souhaite ajouter un événement à une zone de texte. Lorsque le programme se charge, une lettre A est imprimée sur l'écran. Lorsque vous entrez dans la zone de texte, la lettre est censée devenir rouge.Utilisation de PaintEventHandler - Application Windows Forms Visual C++ (Studio 2010)

Le nom de la zone de texte est Anglea, ce qui est le code que j'ai jusqu'à présent:

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); 
    } 

Le dessin original de la lettre se produit dans une fonction séparée, ici:

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); 

} 

Ainsi, le dessin de la lettre originale fonctionne très bien, mais chaque fois que j'essaie de construire le programme avec l'événement Enter, j'obtiens l'erreur suivante:

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 

Il me semble que l'objet form1 (nom par défaut pour la classe dans Windows Forms apps) n'acceptera qu'un paramètre EventHandler pour le "this-> AngleA-> Enter + = gcnew" et non PaintEventHandler, mais je ne comprends pas pourquoi. Est-il possible de créer une fonction d'événement Enter qui me permettra de peindre après que le programme a déjà été chargé, basé sur un événement?

Merci pour l'aide, je l'espère avoir été clair dans ma question :)

Répondre

0

Vous ne pouvez ajouter un PaintEventHandler à l'événement Paint; pas à l'événement Enter.

Vous souhaitez probablement ajouter un EventHandler normal à l'événement Enter et appeler le Invalidate() dans le gestionnaire.

+0

Ok, je vois. La chose est, je ne veux pas repeindre le contrôle lui-même, je veux peindre une lettre rouge A sur l'existant, dans une partie différente de la fenêtre. Comment définir la région de la chaîne "A" sur laquelle je veux peindre? –

+0

Dans le gestionnaire 'Paint', vous pouvez dessiner ce que vous voulez, et cela attirera le contrôle. – SLaks

+0

Je ne comprends pas vraiment le fonctionnement de Invalidate() je suppose; Heres ce Ive a obtenu: 'code'public: System :: Void Form1 :: AngleA_Enter (System :: Object^expéditeur, EventArgs^e) \t \t { \t \t \t rectangle rectangle; \t \t \t rectangle.X = 250; \t \t \t rectangle.Y = 120; \t \t \t rectangle.Largeur = 30; \t \t \t rectangle.Hauteur = 30; \t \t \t Invalider (rectangle); \t \t} Évidemment, c'est loin d'être ce que je veux. Comment puis-je utiliser la fonction invalidate() de la façon dont vous vous référez? –

Questions connexes