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 :)
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? –
Dans le gestionnaire 'Paint', vous pouvez dessiner ce que vous voulez, et cela attirera le contrôle. – SLaks
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? –