List View Sens D'ajout [Résolu]

Signaler
Messages postés
48
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
27 juillet 2008
-
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
-
Bonjour,
J'ai un petit probleme dans ma listview, c'est pas vraiment un probleme, plutot un détail.
Voici le code de ma ListView :

##############################################
/*Creation de la fenetre*/
HWND liste_mess = CreateWindowEx(WS_EX_CLIENTEDGE, "SysListView32", NULL,
LVS_REPORT|WS_CHILD|WS_VSCROLL|LVS_SINGLESEL|WS_VISIBLE,
-5, -20, taillex+10, tailley-30, hwnd, (HMENU)00001, hinst, NULL);
ListView_SetExtendedListViewStyleEx(liste_mess, 0, LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP);

/*Ajout des collone*/
LVCOLUMN lvc;
lvc.mask = LVCF_TEXT | LVCF_WIDTH;
lvc.cx = 10;
ListView_InsertColumn(liste_mess, 0, &lvc);
lvc.cx = 100;
lvc.pszText = "Pseudo";
ListView_InsertColumn(liste_mess, 1, &lvc);
lvc.cx = taillex-150;
lvc.pszText = "Message";
ListView_InsertColumn(liste_mess, 2, &lvc);

/*Ajout test*/
LVITEM lvItem = {0};

lvItem.mask = LVIF_TEXT;
lvItem.iItem = 0;
lvItem.iSubItem = 0;
lvItem.iImage = 0;

int itemPos = ListView_InsertItem(liste_mess,(LPARAM)&lvItem);
ListView_SetItemText(liste_mess,itemPos,0,"");
ListView_SetItemText(liste_mess,itemPos,1,"Pseudo");
ListView_SetItemText(liste_mess,itemPos,2,"Mess1");

itemPos = ListView_InsertItem(liste_mess,(LPARAM)&lvItem);
ListView_SetItemText(liste_mess,itemPos,0,"");
ListView_SetItemText(liste_mess,itemPos,1,"Pseudo");
ListView_SetItemText(liste_mess,itemPos,2,"Mess2");

itemPos = ListView_InsertItem(liste_mess,(LPARAM)&lvItem);
ListView_SetItemText(liste_mess,itemPos,0,"");
ListView_SetItemText(liste_mess,itemPos,1,"Pseudo");
ListView_SetItemText(liste_mess,itemPos,2,"Mess3");

itemPos = ListView_InsertItem(liste_mess,(LPARAM)&lvItem);
ListView_SetItemText(liste_mess,itemPos,0,"");
ListView_SetItemText(liste_mess,itemPos,1,"Pseudo");
ListView_SetItemText(liste_mess,itemPos,2,"Mess4");
##################################################

Ce code marche parfaitement, le seul probleme c'est l'ordre d'affichage des message qui est comme sa :
Mess4
Mess3
Mess2
Mess1

Comment faire pour que avec ce code (qui est senser être un t'chat dynamique) affiche le dernier message reçus en dernier ?

Donc dans notre exemple :
Mess1
Mess2
Mess3
Mess4

Merci de votre aide.

7 réponses

Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Salut,
C'est normal car le membre iItem de ta structure LVITEM est toujours à 0. C'est à cette position (1ère) que seront ajoutés tous les éléments. Pour qu'ils soient ajoutés à la fin il faut que ce membre soit égal ou supérieur au nombre total des éléments contenus dans la listview. Pour obtenir le nombre des éléments tu peux utiliser la macro ListView_GetItemCount(). La valeur retournée sera donnée au membre iItem.
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Utilise la macro  ListView_EnsureVisible():

ListView_EnsureVisible(hListView, item, 0);<link href="../../../css/ie4.css" type="text/css" rel="stylesheet" /><!-- @ --><link href="../../../css/inetsdk.css" type="text/css" rel="stylesheet" /><!-- @ --><style type="text/css"><![CDATA[
PRE.clsCode { font-size:110%; }
PRE.clsSyntax { font-size:100%; }
TD DIV.clsBeta { display:none;}

A:link { color:#0000ff; text-decoration:underline;}
A:visited { color:#0000ff; text-decoration:underline;}
A:hover { color:#3366ff; text-decoration:underline;}
MSHelp\:link {
color:#0000ff;
text-decoration:underline;
cursor:hand;
hoverColor:#3366ff;
filterString: ;}
]]></style><link href="ms-help://Hx/HxRuntime/HxLink.css" type="text/css" rel="stylesheet" />

<xml id="_topicdata" pagetype="macro" proj="platsdk" name="ListView_EnsureVisible" pubpath="/platform/commctls/listview/macros/listview_ensurevisible.htm"><!-- topic data --><root></root></xml>

<xml xmlns=""><mshelp:keyword index="A" term="_win32_ListView_EnsureVisible"></mshelp:keyword><mshelp:keyword index="A" term="_win32_ListView_EnsureVisible_cpp"></mshelp:keyword><mshelp:toctitle title="ListView_EnsureVisible Macro"></mshelp:toctitle><mshelp:rltitle title="ListView_EnsureVisible Macro ()"></mshelp:rltitle><mshelp:keyword index="F" term="ListView_EnsureVisible"></mshelp:keyword><mshelp:keyword index="K" term="ListView_EnsureVisible"></mshelp:keyword><mshelp:attr name="TopicType" value="kbRef"></mshelp:attr><mshelp:attr name="Locale" value="kbEnglish"></mshelp:attr><mshelp:attr name="DevLang" value="C++"></mshelp:attr><mshelp:attr name="Technology" value="Controls"></mshelp:attr><mshelp:attr name="TechnologyVers" value="kbControls"></mshelp:attr><mshelp:attr name="DocSet" value="WCSDK"></mshelp:attr><mshelp:attr name="DocSet" value="LHSDK"></mshelp:attr><mshelp:attr name="DocSet" value="PSDK"></mshelp:attr><mshelp:attr name="TargetOS" value="Windows"></mshelp:attr><mshelp:attr name="TopicType" value="apiref"></mshelp:attr><mshelp:attr name="APIName" value="ListView_EnsureVisible"></mshelp:attr><mshelp:attr name="APIType" value="HeaderDef"></mshelp:attr><mshelp:attr name="APILocation" value="commctrl.h"></mshelp:attr><mshelp:attr name="TopicType" value="macro"></mshelp:attr></xml>
Messages postés
48
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
27 juillet 2008

Merci beaucoup, tout fonctionne correctement maintenant.

J'aurai une autre question :
Comment on fait pour que le dernier message soit toujour visible, je m'explique : Si on a beaucoup de message, les nouveau message aparaitron tout en bas et donc ne seront pas visible car il faudra que l'utilisateur utilise la scrollbar.
Ma question est donc comment mettre l'utilisateur au niveau le plus bas (sans qu'il utilise la scrollbar) ?

Merci de votre aide.
Messages postés
48
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
27 juillet 2008

Genial, merci infiniment !
++
Messages postés
48
Date d'inscription
jeudi 10 juillet 2003
Statut
Membre
Dernière intervention
27 juillet 2008

Tient au passage (question hors sujet), comment on fait pour qu'un control edit renvoi un WM_COMMAND quend on appui sur la touche entrée ?
Pour envoyer le message sans appyuer sur le bouton envoyer.

####
HWND reponse = CreateWindowEx(0, "edit", "", WS_CHILD|WS_VISIBLE, 0, tailley-50, taillex, 50, hwnd, NULL, hinst, NULL);
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
Si tu crées ton Edit dans un DialogBox (en SingleLine), le fait d'appuyer sur Entrée simule automatiquement un click sur le bouton par défaut (par ex. Envoyer).
Messages postés
1910
Date d'inscription
vendredi 18 juin 2004
Statut
Modérateur
Dernière intervention
14 novembre 2014
13
Ton bouton doit avoir le style BS_DEFPUSHBUTTON et l'identificateur IDOK:
hEnvoyer=CreateWindowEx(0,"BUTTON","Envoyer", WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,100,100,60,20,hDlg,(HMENU)IDOK,0,0);
hEnvoyer est le HWND du bouton et hDlg le HWND de la boite de dialogue mère. Si c'est une fenêtre la boucle des messages doit ressembler à ceci:
MSG Msg;
while (GetMessage(&Msg, 0, 0, 0))
{
    if (!IsDialogMessage(hwnd, &Msg))
    {
        TranslateMessage(&Msg);
        DispatchMessage(&Msg);
    }
}

Ainsi, tout appui sur la touche Entrée engendre un WM_COMMAND correspondant au bouton Envoyer.