FAQ C++/CLI et VC++.Net

FAQ C++/CLI et VC++.NetConsultez toutes les FAQ
Nombre d'auteurs : 29, nombre de questions : 248, création le 22 février 2013
Sommaire→Intéraction du C++/CLI avec le framework .Net→WinForms→LabelIl n'est pas possible d'écrire le texte d'un label avec plusieurs couleurs par défaut, mais on peut y arriver en créant un nouveau contrôle qui dérive de Label et en surchargeant la méthode OnPaint.
Tout d'abord, créer une classe dérivée de Label et surcharger OnPaint :
ref class MonLabel : public System::Windows::Forms::Label
{
protected:
virtual void OnPaint(PaintEventArgs ^e) override
{
array<Drawing::Brush ^> ^mesCouleurs = { Brushes::Red, Brushes::Orange, Brushes::Green, Brushes::Blue};
int br = 0;
String ^chaine = Text;
List<String ^> ^listString = gcnew List<String ^>();
StringBuilder ^sb = gcnew StringBuilder();
for (int i = 0 ; i < chaine->Length ; i++)
{
if (chaine[i] == ' ' || chaine[i] == '\'')
{
if (chaine[i] == '\'')
sb->Append(chaine[i]);
listString->Add(sb->ToString());
sb = gcnew StringBuilder();
}
else
sb->Append(chaine[i]);
}
listString->Add(sb->ToString());
float startX = 0;
for each (String ^s in listString)
{
e->Graphics->DrawString(s, Font, mesCouleurs[br], startX, 0);
startX += e->Graphics->MeasureString(s, Font).Width;
br++;
if (br >= mesCouleurs->Length)
br = 0;
}
Width = (int)startX;
}
};
Ici, j'ai choisi de changer de couleur à chaque espace trouvé ou à chaque ' trouvée. J'utilise DrawString pour écrire la partie de mot avec la couleur choisie, et je n'oublie pas de mesurer sa taille pour écrire la partie de mot suivante.
Il faut également adapter la taille du contrôle à la nouvelle taille du texte.
Ensuite, il ne reste plus qu'à utiliser notre contrôle, par exemple dans le constructeur :
MonLabel ^ monLabel = gcnew MonLabel();
AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
monLabel->Font = (gcnew System::Drawing::Font(L"Microsoft Sans Serif", 8.0F, System::Drawing::FontStyle::Regular,
System::Drawing::GraphicsUnit::Point, static_cast<System::Byte>(0)));
monLabel->Text = "Je m'appelle Nico-pyright(c)";
this->Controls->Add(monLabel);


