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