IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Visual C++ Discussion :

Problème d'actualisation d'un listview avec WM_NEXTDLGCTL


Sujet :

Visual C++

  1. #1
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut Problème d'actualisation d'un listview avec WM_NEXTDLGCTL
    Bonjour à tous,

    Avant d'expliquer le problème, voici je que j'essaye de faire. J'ai un tabControl avec 2 onglets (entre autres). Le premier contient une listbox avec la liste des fenêtres ouvertes, et le deuxième contenant un listview avec la liste des processus. Cette partie de mon application est très similaire au gestionnaire des tâches de Windows. Je veux que lorsque l'utilisateur sélectionne une fenêtre (via la listbox) et qu'il clique sur un bouton, le programme bascule vers le deuxième onglet et sélectionne le processus correspondant à la fenêtre dans la liste.

    Dans mon code, je commence donc par trouver la bonne ligne dans le listview (après avoir basculé dans le 2ème onglet), puis je la sélectionne en utilisant le message LVM_SETITEMSTATE. Enfin je donne le focus au listview avec le message WM_NEXTDLGCTL pour que la sélection soit bien visible. C'est là que ça coince... En effet lorsque je réduit puis que je restaure la fenêtre de mon application, la listview apparaît comme un grand rectangle blanc. Je suis obliger de changer d'onglet manuellement pour que sont contenu soit de nouveau visible.

    Voici le code qui me permet de sélectionner la ligne dans le listview:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    // On donne le focus au listview
    SendMessage(hWndMain, WM_NEXTDLGCTL, (WPARAM)hProcessList, TRUE); // J'ai exactement le même problème avec SetFocus(hProcessList)
    HWND hTabCtl = GetDlgItem(hWndMain, IDC_TAB1);
    // On bascule sur l'autre onglet
    SendMessage(hTabCtl, TCM_SETCURSEL, 4, 0);
    UpdateTab(hWndMain);
    LVITEM lvItem;
    ZeroMemory(&lvItem, sizeof(LVITEM));
    int index=2; // index de la ligne à sélectionner, j'ai supprimer la partie concernant la recherche de la ligne pour alléger le code
    lvItem.state = LVIS_SELECTED;
    lvItem.stateMask = LVIS_SELECTED;
    // On sélectionne la 2ème ligne
    SendMessage(hProcessList, LVM_SETITEMSTATE, index, (LONG)&lvItem);
    SendMessage(hProcessList, LVM_ENSUREVISIBLE, index, 0);
    Voici un petit aperçu du problème: (le rectangle blanc est l'emplacement du listview)



    Est-ce que quelqu'un à déjà rencontrer ce type de problème ? Ou bien est ce que j'ai oublié quelques chose ?

    Merci d'avance pour toute suggestion, idée...

    Benoît

    PS: Je n'ai pas ce problème d'actualisation si je ne donne pas le focus au listview. Malheureusement dans ce cas la sélection est très peu visible...

  2. #2
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut
    Comme j'ai l'impression d'avoir assez mal expliqué mon problème, j'ai recréé un projet dans lequel j'ai mis le strict minimum et qui reproduit parfaitement le problème. Au passage j'ai noté que lorsque mon listview ne se trouve pas dans un tabcontrol, il n'y a aucun problème d'affichage...

    Voici le lien (je ne l'ai pas mis en pièce jointe à cause de la taille):
    http://hotfile.com/dl/89235958/f7b38...tview.rar.html

    PS: Je m'excuse d'avance auprès de ceux qui vont être horrifié par mon code, mais j'ai du mal à être propre... ^^

  3. #3
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut
    Je viens de tester mon application sur Windows 7 x64, et là bizarrement il n'y a aucun problème d'affichage... Mon problème surviens donc uniquement sur Windows XP x32... Cela fais maintenant plus de trois jours que je cherche une solution à mon problème, sans résultat, et je commence à sécher.

    Quelqu'un aurait-il une idée, une suggestion, la moindre petite piste ???

    Merci d'avance

  4. #4
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut
    Toujours aucune réponse, je commence à désespérer.

    Je viens en fait de me rendre compte que le problème ne vient absolument pas du message WM_NEXTDLGCTL. Le problème d'affichage se produit en fait simplement quand je sélectionne un item de la listview, autrement dit que je donne le focus au contrôle manuellement ou par le code (puis que la fenêtre principale est réduite puis restaurée). Ce qui est encore plus gênant que ce que je pensait. Il y a donc peu de chance que cela vienne de Windows, bien que cela ne pose problème que sous XP, car un tel problème ne serait certainement pas passé inaperçu... Je doute aussi que cela vienne de Visual Studio (en tout cas j'ai strictement le même problème en compilant sous VS 2008 Pro et VS 2010 Ultimate...).
    Il ne reste donc plus que mon code qui pourrais poser problème. Mais je ne vois pas du tout ou ça cloche...

    Je reste en attente de toute suggestion, s'il y en a un jour...

    Benoît

  5. #5
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut
    Je viens enfin de trouver la solution, et je dois avouer que c'est assez rageant de s'être cassé la tête la dessus pendant près d'une semaine...
    Pour ceux que le problème pourrait éventuellement intéresser, il suffit d'intercepter le message WM_PAINT de la fenêtre fille contenant le listview, et de forcer le rafraîchissement de la fenêtre avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InvalidateRect(hWnd, 0, 1);
    Par contre, bien qu'ayant trouvé la solution, je ne comprends toujours pas pourquoi cela est nécessaire... Si quelqu'un a une idée sur la question, merci de bien vouloir me la faire partager.

    En attendant une éventuelle réponse (je garde toujours espoir), je met le sujet comme étant résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème d'actualisation avec les frameset
    Par intissar_g dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/08/2007, 15h18
  2. [VB.NET] Problème ListView avec checkbox
    Par elkidos dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/02/2007, 16h27
  3. Réponses: 7
    Dernier message: 07/09/2006, 16h17
  4. problème d'actualisation avec la pagination
    Par momov dans le forum ASP
    Réponses: 10
    Dernier message: 03/07/2006, 15h33
  5. Réponses: 4
    Dernier message: 11/04/2006, 10h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo