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→TreeViewUtilisons un TreeView appelé ici "TreeView1" possédant nécessairement dans ce cas de figure une ImageList pour sa collection de TreeNode.
La capture de l'événement Click se fait ici par la méthode TreeView->MouseDown afin de récupérer les coordonnées du pointeur de la souris.
La méthode ci-dessous GetNodeIconeRectangle permet de calculer le Rectangle de l'icone du TreeNode sélectionné. Il ne reste plus alors qu'à vérifier si le Point localisé du pointeur de la souris appartient à l'icone du TreeNode sélectionné.
private: System::Void treeView1_MouseDown(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
Point p(e->X, e->Y);
TreeNode ^selectedTreeNode = this->treeView1->GetNodeAt(p);
Rectangle ^imgRectangle;
if (selectedTreeNode !=nullptr)
{
imgRectangle = GetNodeIconeRectangle(selectedTreeNode);
if (imgRectangle->Contains(p))
{
//traitement
}
}
}
private : Rectangle ^GetNodeIconeRectangle(TreeNode ^node)
{
System::Drawing::Size^ s = node->TreeView->ImageList->ImageSize;
int h = node->TreeView->ItemHeight;
Rectangle ^r = node->Bounds;
int x = r->X - s->Width;
int y = r->Y + ((h - s->Height)/2);
Point p(x,y);
return gcnew Rectangle(p, *s);
}Ce code permet de charger l'arborescence du disque dur C:\ dans un TreeView de la même façon que l'Explorateur Windows.
Ce code nécessite un contrôle TreeView nommé TV et un Button nommé BTN.
private: System::Void BTN_Click(System::Object^ sender, System::EventArgs^ e)
{
TV->Nodes->Add("C:\\");
this->Explorer(TV->Nodes[0]);
}
private: void Explorer(TreeNode^ node)
{
try
{
node->Nodes->Clear();
for each(String^ s in Directory::GetDirectories(node->FullPath))
{
node->Nodes->Add(Path::GetFileName(s));
}
}
catch(Exception ^) {}
}
private: System::Void TV_AfterExpand(System::Object^ sender, System::Windows::Forms::TreeViewEventArgs^ e)
{
for each(TreeNode^ tn in e->Node->Nodes)
this->Explorer(tn);
}
Il faut pour cela traiter l'évènement MouseMove du TreeView :
/// <summary>
/// Evènement MouseMove du treeView1
/// </summary>
private: System::Void treeView1_MouseMove(System::Object^ sender, System::Windows::Forms::MouseEventArgs^ e)
{
// Récupération du TreeNode survolé
TreeNode ^currentNode = treeView1->GetNodeAt(e->X, e->Y);
// Vérification que la souris survole bien un TreeNode
if (currentNode != nullptr)
textBox1->Text = "Le node survolé est " + currentNode->Name;
}


