Drag Drop

Signaler
Messages postés
8
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
24 avril 2006
-
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
-
Bonjour,

Au momoent d'un drag&Drop depuis l'explorateur windows vers ma treeview, je souhaite détéctcter le présence de la souris sur la treeView juste avant que l'utilisateur ne relache le bouton gauche .

Autrement dit l'événement juste avant le WM_DROPFILES.

Détail:

je travaille avec VC++ 6 sous xp pro, et j'ai une appli qui fait fonction d'explorateur windows(fonctionnalité basic avec 1 treectrl et 1 listctrl), je reussi bien mon drag drop sous WM_DROPFILES.

mon probleme est que mon mousemove detecte tous les mouvements de ma souris sur la treeview sauf en cas d'un drag&drop depuis l'explorateur. C'est à ce niveau là que je m'interesse au Drag (sans jeu de mot bien sûr)

j'ai fait le tour du net, il me semble que pour le dot net : C# entre autre l'evénement soit :
systeme.windows.forms.Dragevent
mais pour VC++ je me demande s'il existe 1 événement, 1 astuce ou 1 api qui me.

une idée svp ?

5 réponses

Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
Bj

récupère les evts et la position de la souris

je l ai fais dans une ListBox et ça donne qqch comme ça:
(fait avec VC6)


void BListBox::OnLButtonDown(UINT nFlags, CPoint point)
{
//précond: liste à sélection unique
CListBox::OnLButtonDown(nFlags, point);
if(!m_bWithDrag || m_bCaptured)
return;
UpdateData(true);
int iSel=GetCurSel(); //IndexFromPoint(point);
//err possible : si liste à sélection multiple
if(iSel == LB_ERR)
return;
m_bCaptured=TRUE;
m_ptMouseDown=point;
}





void BListBox::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bWithDrop/*&& m_bCaptured*/)
{
m_bCaptured=false;
/// algo : SI la fenetre mère si elle accepte le drag-and-drop.
if(GetParent()->SendMessage(msgBListBoxQueryDrop , (WPARAM) GetDlgCtrlID(), (LPARAM) this))
/// algo : dire de faire le drag-n-drop (en attendant la fin de cette opération
if(GetParent()->SendMessage(msgBListBoxDoDrop , (WPARAM) GetDlgCtrlID(), (LPARAM) this))
m_bCaptured=false;
else
BVisuel::alerte("problème lors du déposé de l'élément traîné.");
}
CListBox::OnLButtonUp(nFlags, point);
}





void BListBox::OnMouseMove(UINT nFlags, CPoint point)
{
if(m_bCaptured)
/// algo : si le déplacement est suffisant pour etre considéré pour un drag
if((abs(point.x - m_ptMouseDown.x) > 3) || (abs(point.y - m_ptMouseDown.y) > 3))
{
ReleaseCapture();
m_bCaptured=FALSE;
GetParent()->PostMessage(msgBListBoxBeginDragDrop , (WPARAM) GetDlgCtrlID(), (LPARAM) this);
}
CListBox::OnMouseMove(nFlags, point);
}

Magicalement
Nono.
Messages postés
8
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
24 avril 2006

salut,

Désolé je suis parti sur autre chose mais revoilou....

En fait je crains ne pas m'être bien expliqué :

Dans ta réponse, tu indique les événements OnLButtonDown et OnLButtonUp
or ds mon probleme ces 2 événements ont eu lieu au niveau de l'explorer Windob.

En bref, c'est le moment où la fameuse fléche arrive sur la TreeCtrl de ma
Dlg que je veux intercepter et donc là ma question devient plus précise :
est-ce que je peux implémenter pour ma TreeCtrl les événements suivants :
OnDragEnter, OnDragOver, OnDragLeave, OnDrop.

Je sais par ailleurs que pour une CView c'est possible comme car il y'a l'exemple
[javascript:alink_1.Click() OCLIENT] de la MSDN.

Il y'a certainement quelque chose qui m'échappe mais laquelle :
thats the QUESTION?!!!
@+
NB. Et encore merci pour ton aide.
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
ben tu te met dans OnMouseMove

regarde l'état du bouton et check la position : pt



SI Appuyé et SI pt.InRect(rect de ta treeView)



je vois pas pkoi tu ne récupèrerai pas ça...





++
Messages postés
8
Date d'inscription
mercredi 15 décembre 2004
Statut
Membre
Dernière intervention
24 avril 2006

Justement c'est ce que je ne comprends pas non plus...
tous mes OnMouseMove je les recupere sans pb sauf au moment d'1 D&Drop depuis
l'explorateur

en fait si tu as VS c++ 6 sous la main, ça prend 2 mn pour t'en rendre compte !?
avec appwizard je genere une appli DialogBox , ds la template je mets 1 treectrl
et enfin je crée le OnMouseMove où je mets 1 point d'arrêt,

j'execute mon appli et ensuite je lance l'explorateur que je reduis à mi hauteur de ma dialogBox
et là alors même que ma fenêtre est inactive, si je déplace ma souris sur la treectrl sans appuyer
sur le bouton gauche : mon OnMouseMove fonctionne sans probleme
par contre si je "drag" un fichier ou 1 rep depuis l'explorateur et je pointe ma treectrl,
il ne se passe rien et voilà....

Si tu as du nouveau je serai vraiment heureux de l'apprendre.

Dans toue les cas merci pour tes réponses. @+
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
j'ai pas fait le test mais à tous les coup, c'est ton treeControle qui récupere l'évt de survol.



donc à priori, tu devrai résoudre ça en surclassant ton CTreeControle

et en transmettant l'evt onmousemove au pere.



Je ferai le test ce we

++