clique sur CLIstCtrl [MFC ] [Resolu] - C++ - Programmation
Marsh Posté le 11-04-2003 à 12:04:42
Faut passer par les methodes HitTest et le mieu a mettre ds un OnMousDown (sur le left button) car tu recup le CPoint avec les coordonnees de la souris au moment du click et tu as plsu qu'a faire
Code :
|
Edit: attention a verifier quand mm que le curseur de la souris se trouve ds CtrlList avant quand mm.
Marsh Posté le 11-04-2003 à 12:10:51
merci pour ta reponse mais bon, c'est encore et toujours pour Pocket PC donc ecran tactile sur l'engin avec un stylet et j'ai du mal a visualiser le clique gauche . Enfin je suppose mais je vais voir si il n'y a pas un truc prevu pour ca.
Sinon y a pas un autre moyen?
Marsh Posté le 11-04-2003 à 12:12:09
Ben tu recuperera quand mm un mousedown (donc tu t en fou du droit ou gauche)
Et non tt les methode pour tester un clique ds un clistview tourne autour du HitTest
Edit : enfin a ma connaissance
Marsh Posté le 11-04-2003 à 12:36:59
j'ai pas tout compris ce ke tu voulais...
tu clik sur une ligne ou une colonne ? (et tu veux savoir koi exactement) (précise aussi si c'est une listview a multi-selection)
si c'est les lignes ke tu veux savoir, y a ca ki devrait marcher :
Code :
|
en gros (si ca marche, je l'ai repris d'un vieux code), i indique tous les index des lignes seléctionnées.
Marsh Posté le 11-04-2003 à 12:39:18
polo021 a écrit : merci pour ta reponse mais bon, c'est encore et toujours pour Pocket PC donc ecran tactile sur l'engin avec un stylet et j'ai du mal a visualiser le clique gauche . Enfin je suppose mais je vais voir si il n'y a pas un truc prevu pour ca. |
Oui : la bonne méthode est de choisir les options de créations de la CListCtrl : il y a un flag qui permet de choisir que la selection se fasse sur toute la ligne. Par contre, je m'en rappelle plus sur le moment. Faudrait que j'aille voir dans mes projets.
Marsh Posté le 11-04-2003 à 12:41:32
Tetragrammaton IHVH a écrit : |
LVS_EX_FULLROWSELECT
Marsh Posté le 11-04-2003 à 12:45:41
Sauf que cette methode requiere des DLL version 4.7 (jsais plus lesquels donc depend de la platefrome sur laqeulle ca tournera, car les ExtendedInfo ne sont pas dispo sur les controls suivant les versions.
Marsh Posté le 11-04-2003 à 12:48:26
VisualC++ a écrit : Sauf que cette methode requiere des DLL version 4.7 (jsais plus lesquels donc depend de la platefrome sur laqeulle ca tournera, car les ExtendedInfo ne sont pas dispo sur les controls suivant les versions. |
exact...
LVS_EX_FULLROWSELECT
Version 4.70. When an item is selected, the item and all its subitems are highlighted. This style is available only in conjunction with the LVS_REPORT style.
Version DLL Distribution Platform
4.70 All Microsoft® Internet Explorer 3.x.
ca devrait qd meme marcher sur pocketPC...
Marsh Posté le 11-04-2003 à 12:50:04
Jsais pas jamais fait sur pocket
Par contre j ai un doute sur le IE 3.0, car sur le 5.0 de base y a des pb avec les Extended
Marsh Posté le 11-04-2003 à 12:50:42
Konar a écrit : |
Merci
Marsh Posté le 11-04-2003 à 12:54:52
VisualC++ a écrit : Jsais pas jamais fait sur pocket |
ca doit dependre des styles, par exemple y en a 1 ki demande direct XP, me souviens plus lequel, mais la plupart des extended demandent IE 5.0 c vrai.
(faut aussi savoir si c'est la vérité, faudra demander aux gens ki codent sur pocketPC si ca marche a l'arrivée...)
http://msdn.microsoft.com/library/ [...] styles.asp
http://msdn.microsoft.com/library/ [...] rsions.asp
Marsh Posté le 11-04-2003 à 14:29:43
Konar a écrit : j'ai pas tout compris ce ke tu voulais... |
ben en fait :
x 10000
y 20000
z 30000
pour selectionner la deuxieme ligne, ca ne fonctionne que si on clique sur "y" car c'est la colonne qui a l'index 0. et j;'aurais voulu pouvoir selectionner la deuxieme ligne en cliquant soit sur y soit sur 20000
Je viens d'essayer avec ta methode mais je n'y arrive pas et pour le LVS_EX_FULLROWSELECT je trouve pas non plus.
Marsh Posté le 11-04-2003 à 14:36:44
Code :
|
et il faut aussi ke ta listview soit créée avec le style LVS_REPORT.
ca serait quand meme chelou si ca marchait pas...
Marsh Posté le 11-04-2003 à 14:45:48
Konar a écrit :
|
C'est pas une listview c'est une listctrl, je sais pas si c'est la meme chose ou pas, je suppose que oui.
pour le LVS_report c'est bien comme ca qu'elle est.
hWndListView => c'est quoi ca?
Marsh Posté le 11-04-2003 à 14:49:18
Code :
|
Marsh Posté le 11-04-2003 à 14:51:54
polo021 a écrit : |
C'est quasiment pareil. Seule l'encapsulation change (l'un est un contrôle, l'autre une vue pour SDI)
Marsh Posté le 11-04-2003 à 15:08:36
int i = -1;
while ((i = SendMessage(hWndLV, LVM_GETNEXTITEM, i, MAKELPARAM(LVNI_ALL | LVNI_SELECTED, 0))) != -1)
{
// ton traitement
}
ca fonctionne pas, quand j'affiche i :
- si j'ai clique dans la premiere colonne, ca me donne bien le numero de la ligne
- si j'ai clique dans la deuxieme colonne, ca me retourne -1 donc c'est pas bon ou alors j'ai pas su le faire fonctionne.
Mais bon c'est pas bien grave on va pas s'eterniser sur un ptit probleme comme ca. merci quand meme pour votre aide.
Marsh Posté le 11-04-2003 à 15:16:58
Mais tu as fait ds ton init lors des contructions
Code :
|
Marsh Posté le 11-04-2003 à 15:18:35
c'est normal ke ca marche pas, cette reponse c'est juste pour trouver les index des éléments sélectionnés (j'avais pas encore vraiment compris ce ke tu voulais a cet instant).
si le truc du LVS_EX_FULLROWSELECT marche pas, y a peu de chance pour ke ca fonctionne un jour, a part faire une methode débile a la bourrin (genre chopper les coordonnées de la souris, calculer a la main si t'as cliqué sur telle ligne telle colonne puis sélectionner la bonne ligne encore a la main en envoyant le bon msg, mais faut serieusement eviter ce genre de choses, en plus t'y passera bien 20h...)
Marsh Posté le 11-04-2003 à 15:21:58
VisualC++ a écrit : Euh la methode de detection souris ca prend 2 min |
non 20h pour moi c'etait une bonne appreciation
Marsh Posté le 11-04-2003 à 15:24:14
VisualC++ a écrit : Mais tu as fait ds ton init lors des contructions
|
ca ne force en rien la selection de la ligne par clique dans n'importe quelle colonne, je viens d'essayer
Marsh Posté le 11-04-2003 à 15:35:40
polo021 a écrit : |
chelou...
essayes ces autres styles, comme ils sont visuels, si ca marche pas ca se verra de suite :
LVS_EX_GRIDLINES (rajoute des grilles ds ta listview, du plus bel effet)
LVS_EX_HEADERDRAGDROP (permet de bouger les colonnes)
si aucun des 2 ne marche, bah oublie ca.
Marsh Posté le 11-04-2003 à 15:36:38
ReplyMarsh Posté le 11-04-2003 à 15:40:43
Tiens, à propos de CListCtrl, il va falloir prochainement que je me replonge dedans pour faire des tris avec les colonnes. Qqn a déjà expérimenté ça ?
Y a un callback, non ?
Marsh Posté le 11-04-2003 à 15:44:01
Polo021 > euh j ai marque une connerie en plus , c est pas 1 mais le mm const qu il faut
Code :
|
Tetra > oui y a callback
Marsh Posté le 11-04-2003 à 15:46:16
CListCtrl * plist = (CListCtrl *) GetDlgItem(IDC_LIST1);
plist->SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_GRIDLINES , 1);
oui, le rajouteage de grille dans la liste fonctionne (quand je clique dessus)
Mais pour le fullrowselect je comprends pas.
Marsh Posté le 11-04-2003 à 15:47:55
polo021 a écrit : |
Bon je vais voir dans un de mes projets, parce qu'il y a visiblement un stress, là.
Marsh Posté le 11-04-2003 à 15:47:57
Ben ca prend 2 min a faire la detection a la souris, y a les fonction HitTest et CWnd::GetWindowRect / CRect::PtInRect qui facilite la vie.
Marsh Posté le 11-04-2003 à 15:47:59
CListCtrl * plist = (CListCtrl *) GetDlgItem(IDC_LIST1);
plist->SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE,LVS_EX_GRIDLINES , 1);
oui, le rajouteage de grille dans la liste fonctionne (quand je clique dessus)
Mais pour le fullrowselect je comprends pas.
Marsh Posté le 11-04-2003 à 15:50:08
Fait comme marque audessus, le (... , 1) marche pas
Edit:
Le gridline marche avec (...., 1) car
Code :
|
Marsh Posté le 11-04-2003 à 15:50:31
Tetragrammaton IHVH a écrit : Tiens, à propos de CListCtrl, il va falloir prochainement que je me replonge dedans pour faire des tris avec les colonnes. Qqn a déjà expérimenté ça ? |
la fonction de comparaison
Code :
|
Code :
|
l'appel
Code :
|
Marsh Posté le 11-04-2003 à 15:55:10
VisualC++ a écrit : Polo021 > euh j ai marque une connerie en plus , c est pas 1 mais le mm const qu il faut
|
youpi ca fonctionne
Marsh Posté le 11-04-2003 à 15:57:28
Bon, voila le code que j'utilise pour créer une CListCtrl
Code :
|
C'est bien LVS_EX_FULLROWSELECT. Les autres options n'ont pas d'influence sur ça.
Marsh Posté le 11-04-2003 à 15:58:38
polo021 a écrit : |
OK Cool.
Et merci pour le code des tris
Marsh Posté le 11-04-2003 à 16:31:51
polo021 a écrit : |
dommage, j'aurais bien kiffé voir la solution "2 min" de Visual C++
tiens ca me rappelle un code ke je corrigeais (sous win), dedans y avais un gars qu'avait codé une fct pour copier un fichier d'un emplacement a un autre, a base de open/read avec un buffer de 1 Mo, et le fichier de sortie etait multiple de 1 Mo qqsoit le fichier d'entrée. c'etait bo.
Marsh Posté le 11-04-2003 à 17:52:49
La version ds une dialog avec recuperation du Click (reflect event de la liste)
Code :
|
Ca a pas besoin de l'extended style. Par contre bon 5 min le temsp de trouver une fonction HitTestEx qq part ds mes sources.
Edit: par contre si on utilise un CListCtrl a nous, on doit pourvoir utilsier les infos contenues ds le NMHDR* qui est passe sur le click, mais bon jsais pas si info remontee qqsoit la version des DLL utilisees.
Marsh Posté le 11-04-2003 à 11:52:46
Pour savoir sur quelle ligne de ma CListCtrl je viens de cliquer, je prend la methode OnClick
puis
mais ceci ne fonctionne que si je clique sur la colonne qui a l'index 0 dans ma liste.
Comment faire pour prendre la ligne peut importe dans quelle colonne je clique?
Message édité par polo021 le 11-04-2003 à 16:16:13