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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    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 averti
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    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
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    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 averti
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    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 averti
    Inscrit en
    Septembre 2006
    Messages
    62
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 62
    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);

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