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

Windows Discussion :

Affectation d'une imagelist à une listview


Sujet :

Windows

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut Affectation d'une imagelist à une listview
    Bonjour!
    J'essaye de créer une imagelist pour l'envoyer à une listview mais avant l'envoi, loadbitmap me renvoie NULL.

    Voilà le code que j'ai fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HIMAGELIST hImageListSmall = ImageList_Create(16,16,ILC_COLORDDB|ILC_MASK,14,1);
    HBITMAP hBitmap = LoadBitmap(NULL,MAKEINTRESOURCE(IDR_LGICONS));
    if(!hBitmap)
    MessageBox(NULL,TEXT("LoadBitmap failed"),TEXT(""),MB_OK);
    ImageList_AddMasked(hImageListSmall,hBitmapS,RGB(0,255,255));
    ListView_SetImageList(hwnd, hImageListSmall, LVSIL_SMALL);
    Sinon comment on peut initialiser une HNSTANCE?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le HINSTANCE, tu le reçois en paramètre de WinMain().
    Mais tu peux aussi utiliser ceci pour récupérer le HINSTANCE de l'EXE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    HINSTANCE hInst = GetModuleHandle(NULL);
    HBITMAP hBitmap = LoadBitmap(NULL,MAKEINTRESOURCE(IDR_LGICONS));
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Merci Médinoc.
    En faite comme tu le sais je veux modifier une îcone dans la listview, avec ton aide hier, j'ai pu le faire pour changer le texte mais pas encore pour l'îcone.

    Voici ce que je fais, si tu peux vérifier et me corriger en cas d'erreur
    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    g_hinstt = GetModuleHandle(NULL);
    if(!g_hinstt)
    MessageBox(NULL,TEXT("g_hinstt failed"),TEXT(""),MB_OK);
    
    HIMAGELIST hImageListSmall = ImageList_Create(16,16,ILC_COLORDDB|ILC_MASK,14,1);
       
    HBITMAP hBitmapS = LoadBitmap(g_hinstt,MAKEINTRESOURCE(IDR_LGICONS));
    
    if(!hBitmapS)
    MessageBox(NULL,TEXT("LoadBitmap failed"),TEXT(""),MB_OK);
    
    // Add images to image list
    ImageList_AddMasked(hImageListSmall,hBitmapS,RGB(0,255,255));
    
    
    DeleteObject(hBitmapS);
    
    int nimage=1; 
    
    //Pointeurs distants
    LPVOID pFarLvItem = NULL;
    LPVOID pFarText = NULL;
    LPVOID pFarImage = NULL;
    
    hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessId);
    if(hProcess==NULL)
    	MessageBox(NULL,TEXT("Process not open"),TEXT(""),MB_OK);
    
    //Allocation
    pFarLvItem = VirtualAllocEx(hProcess, 0, sizeof(LVITEM)+256, MEM_COMMIT, PAGE_READWRITE);
    if(pFarLvItem == NULL)
    	_tprintf(_T("Erreur  VirtualAllocEx\n"));
    
    pFarText = ((LPLVITEM)pFarLvItem) + 1;
    
    LPVOID pFarLvIMG = VirtualAllocEx(hProcess, 0, sizeof(LV_VIEW_SMALLICON)+256, MEM_COMMIT, PAGE_READWRITE);
    if(pFarLvIMG == NULL)
    	_tprintf(_T("Erreur  VirtualAllocExIMG\n"));
    pFarImage=((LPLVITEM)pFarLvIMG) + 1;
    
    //Initialisation des pointeurs
    LvItem.pszText = (LPTSTR)pFarText;
    LvItem.iImage = (int)pFarImage;
    
    //Ecriture
    WriteProcessMemory(hProcess, pFarLvItem, &LvItem, sizeof(LVITEM), &dwret);
    
    WriteProcessMemory(hProcess, pFarText, sczText, _tcslen(sczText)*sizeof(TCHAR), &dwret);
    
    WriteProcessMemory(hProcess, pFarLvIMG, &hImageListSmall, sizeof(LV_VIEW_SMALLICON), &dwret);
    
    WriteProcessMemory(hProcess, pFarImage,(LPVOID) nimage, sizeof(int), &dwret);
    
    SendMessage(hwnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL, (LPARAM)hImageListSmall);
    SendMessage(hwnd,LVM_SETITEM,0,(LPARAM)pFarLvItem);
    Ce code modifie le texte mais l'îcone n'est plus affiché pour l'item que j'ai modifié

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Les icônes et les bitmaps, comme toutes les ressources GDI, ne sont pas partagées d'un process à l'autre, et ne sont pas partageables.
    Là, je ne sais absolument pas comment tu pourras transmettre ça alors que tu n'as aucun moyen de piloter la MMC pour qu'elle désérialise ça...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    On peut oublier que c'est une mmc et pensant que c'est une listview, si elle a une imagelist on peut la remplacer d'après ce que j'ai compris dans la doc de msdn. Moi je crois qu'il y a certainement une faute quelque part dans le code.

    http://msdn.microsoft.com/library/de...timagelist.asp

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    En faite il y a quelques erreurs dans le code que j'ai corrigé mais le problème n'est pas encore résolu.

    Voici le code

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    //LVITEM local
    LVITEM LvItem = {0};
    LvItem.cchTextMax=256;
    LvItem.mask=LVIF_TEXT|LVIF_IMAGE;
    LvItem.iItem=0;           // choose item  
    LvItem.iSubItem=0;        // Put in first coluom
    LvItem.pszText=NULL;
    LvItem.iImage=NULL;
    LPTSTR sczText = TEXT("Item 1");  // Text to display 
    
    g_hinstt = GetModuleHandle(NULL);
    
    if(!g_hinstt)
    MessageBox(NULL,TEXT("g_hinstt failed"),TEXT(""),MB_OK);
    
    HIMAGELIST hImageListSmall = ImageList_Create(16,16,ILC_COLORDDB|ILC_MASK,14,1);
    HBITMAP hBitmapS = LoadBitmap(g_hinstt,MAKEINTRESOURCE(IDR_LGICONS));
    if(!hBitmapS)
    MessageBox(NULL,TEXT("LoadBitmap failed"),TEXT(""),MB_OK);
    // Add images to image list
    ImageList_AddMasked(hImageListSmall,hBitmapS,RGB(0,255,255));
    
    DeleteObject(hBitmapS);
    
    int nimage=1; 
    
    //Pointeurs distants
    LPVOID pFarLvItem = NULL;
    LPVOID pFarText = NULL;
    LPVOID pFarImage = NULL;
    
    LONG LRet=0;
    LPVOID lpData, lplvItem;
    
    //Ouverture processus
    HANDLE hProcess = NULL;
    DWORD dwProcessId = 0;
    
    DWORD dwThreadId = GetWindowThreadProcessId(hwnd, &dwProcessId);
    //Debug
    {
    	DWORD dwThisProcessId = GetCurrentProcessId();
    	DWORD dwThisThreadId = GetCurrentThreadId();
    	//_tprintf(TEXT("MMC process: %lu - This process: %lu\n"), dwProcessId, dwThisProcessId);
    	//_tprintf(TEXT("MMC UI thread: %lu - This thread: %lu\n"), dwThreadId, dwThisThreadId);
    }
    
    hProcess = OpenProcess(PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE, 0, dwProcessId);
    if(hProcess==NULL)
    	MessageBox(NULL,TEXT("Process not open"),TEXT(""),MB_OK);
    
    //Allocation de LvItem
    pFarLvItem = VirtualAllocEx(hProcess, 0, sizeof(LVITEM)+256, MEM_COMMIT, PAGE_READWRITE);
    if(pFarLvItem == NULL)
    	_tprintf(_T("Erreur  VirtualAllocEx\n"));
    pFarText = ((LPLVITEM)pFarLvItem) + 1;
    pFarImage=((LPLVITEM)pFarLvItem) + 2;
    
    //Initialisation des pointeurs
    LvItem.pszText = (LPTSTR)pFarText;
    LvItem.iImage = (int)pFarImage;
    
    //Ecriture
    WriteProcessMemory(hProcess, pFarLvItem, &LvItem, sizeof(LVITEM), &dwret);
    
    WriteProcessMemory(hProcess, pFarText, sczText, _tcslen(sczText)*sizeof(TCHAR), &dwret);
    
    WriteProcessMemory(hProcess, pFarImage,(LPVOID) nimage, sizeof(int), &dwret);
    
    SendMessage(hwnd,LVM_SETIMAGELIST,(WPARAM)LVSIL_SMALL, (LPARAM)hImageListSmall);
    
    LRet=GetLastError();
    _tprintf(_T("LRet=%d\n"),LRet);
    
    _tprintf(_T("pFarImage=%d  , nimage=%d"),pFarText,nimage);
    
    //Update item on listview
    SendMessage(hwnd,LVM_SETITEM,0,(LPARAM)pFarLvItem);

  7. #7
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    voilà je comprend pourquoi ça ne marche pas mais je trouve pas ou est la faute.

    l'attribut iimage reçu par la listview normalement c'est 1 alors que c'est pas le cas, il reçoit un gros nombre celui de pFarImage (qui l'adresse);

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    iItem est supposé être l'index de l'image dans l'ImageList déjà présente dans la ListView, pas un pointeur vers image...

    Le problème ici n'est pas de changer l'imagelist d'une listview, c'est de changer l'imagelist d'une listview dans un autre processus.
    Il y aurait peut-être une maigre possibilité si la MMC possédait la bonne bitmap en ressource (et encore, on n'aurait rien pour la convertir à distance en ImageList), mais comme ce n'est même pas le cas...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Hum.. L'aide ne dit absolument pas si les ImageLists sont locales ou partagées, ni rien sur le fait d'utiliser le message LVM_SETIMAGELIST d'un processus à l'autre.

    Tu peux toujours faire deux programmes de test pour voir si c'est possible d'en passer une d'un processus à l'autre...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Pour le changement de l'îcone ça se fait maintenant, on a pu directement mettre LvItem.iImage = valeur sans passer par writeprocessmemory de nimage, mais ce que j'obtient c'est les images déjà défini avec la listview de la snap-in mmc. Je vais essayer comment modifier cette imagelist, normalement c'est faisable parceque en écoutant les message de la fenêtre ListView il y a LVM_SETIMAGELIST. Il faut voir, comment l'utiliser peut être qu'il faut la même chose qu'on a fait avec LVITEM(VirtualAllocEx+WriteProcessMemory puis sendmessage(hwnd,LVM_SETIMAGELIST,...)

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    J'ai testé ce truc et ça marche mais lorsque je fais pas le GETIMAGELIST et renvoiyez à la place mon imagelist ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iml2=(HIMAGELIST) ::SendMessage(hwnd, LVM_GETIMAGELIST, LVSIL_NORMAL, (LPARAM)iml);
    
    iml2=(HIMAGELIST) ::SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)iml2);
    Ce que je peus déduire que mon imagelist la charge vide sans les images

    moi ce que je fais c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HIMAGELIST iml=ImageList_LoadBitmap(g_hinstt, MAKEINTRESOURCE(IDR_LGICONS), 16, 2, 0xFFFFFF);
    
    iml=(HIMAGELIST) ::SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)iml);
    quelqu'un peut me corriger?
    Merci

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par foued_scorpion
    J'ai testé ce truc et ça marche mais lorsque je fais pas le GETIMAGELIST et renvoiyez à la place mon imagelist ça ne marche pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    iml2=(HIMAGELIST) ::SendMessage(hwnd, LVM_GETIMAGELIST, LVSIL_NORMAL, (LPARAM)iml);
    
    iml2=(HIMAGELIST) ::SendMessage(hwnd, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)iml2);
    Qu'est-ce que tu cherches à faire exactement, là ?
    LVM_GETIMAGELIST ne prend pas de WPARAM, et toi tu lui passes iml...

    PS: Il ne suffit pas de récupérer le handle, il faut aussi qu'il soit valide dans le processus de destination...
    Tu peux vérifier que si tu peux ou non faire des opérations sur iml2 après l'avoir récupéré...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    Points : 40
    Points
    40
    Par défaut
    Dans la listview il y a apparremment des îcones déjà intialisé de l'index 0 jusqu'à 8 puis à partir les index de l'application. Au début quand j'envoi mon imagelist j'obtient même rien pour les 8 premiers mais mainteant si. Mais les îcones que j'ajoute ne s'affiche pas malgrès que dans les événement la listview a reçu "SETIMAGELIST" et il n'y a aucune erreur lors des chargement de icones, je me demande ou se trouve l'erreur dans mon code ou faut il utiliser une autre méthode.
    Lorsque je fais le GETIMAGELIST et je met cette imagelist à NULL et je la renvoi, rien ne s'affiche, ce qui montre qu'on peut échanger l'imagelist de la listview.

    Voici le code
    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
    16
    17
    18
    int tabSmallIcon[4];
    HICON    hicon1,hicon2;
    HIMAGELIST hImageListNormal1 =NULL;
    hImageListNormal1=ImageList_Create(
                                      GetSystemMetrics(SM_CXSMICON), 
                                      GetSystemMetrics(SM_CYSMICON),
                                      FALSE,
                                      4,
                                      1) ;
    
    hicon1 = LoadIcon (g_hinstt, MAKEINTRESOURCE(IDI_ICON1));
    tabSmallIcon[0] = ImageList_AddIcon(hImageListNormal1,hicon1);
    
     hicon2 =LoadIcon (g_hinstt, MAKEINTRESOURCE(IDI_ICON2));
     tabSmallIcon[1] = ImageList_AddIcon(hImageListNormal1,hicon2);
    
    ListView_SetImageList(hwnd,LVSIL_SMALL,hImageListNormal1);
    ListView_SetImageList(hwnd,LVSIL_NORMAL,hImageListNormal1);

Discussions similaires

  1. Affecter le résultat d'une requête à une variable
    Par PSYcoZZ dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 10/02/2007, 13h27
  2. affecter le résultat d'une requete à une comboBox
    Par freestyler dans le forum Delphi
    Réponses: 5
    Dernier message: 25/10/2006, 15h37
  3. Réponses: 2
    Dernier message: 17/05/2006, 21h35
  4. affecter le résultat d'une requête à une variable
    Par zut94 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/10/2005, 17h21
  5. Affecter résultat SQL d'une requête à une variable
    Par bozolozo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 02/01/2005, 17h37

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