малеькие иконки в treeview

Тема в разделе "LANGS.C", создана пользователем _qwe8013, 20 дек 2016.

  1. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Есть у моей программы в ресурсах иконка большая-пребольшая. Я хочу добавить элемент в treeview с этой иконкой, делаю так:
    Код (C):
    1. Icon=LoadIconW(hInst,L"FILEICON");
    2.     int RootIconIndex=ImageList_AddIcon(ImgList,Icon);
    3.  
    4.     SendDlgItemMessageW(hDlg,0,TVM_SETIMAGELIST,TVSIL_NORMAL,(LPARAM)ImgList);
    5.  
    6.     TVINSERTSTRUCTW tvi;
    7.     tvi.hParent=TVI_ROOT;
    8.     tvi.hInsertAfter=TVI_ROOT;
    9.     ZeroMemory(&tvi.item,sizeof(TVITEMW));
    10.     tvi.item.mask=TVIF_TEXT | TVIF_IMAGE;
    11.     tvi.item.pszText=(LPWSTR)L"Root";
    12.     tvi.item.cchTextMax=4;
    13.     tvi.item.iImage=RootIconIndex;
    14.     SendDlgItemMessageW(hDlg,0,TVM_INSERTITEMW,0,(LPARAM)&tvi);
    Но только иконка добавляется на весь treeview, как можно (если можно) добавить элемент с маленькой иконкой имея в ресурсах большую?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Правильным решением здесь будет добавить в ресурсы джве иконки: одну большую-пребольшую 256х256 для того, чтобы программа в проводнике выглядела модно молодежно и вторую маленькую 16х16, чтобы показывать ее в контролах.
     
  3. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Пробуй вместо LoadIcon - LoadImage, там можно указать желаемый размер.
     
  4. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Сделал, как советовали оба:
    Код (C):
    1. Icon=(HICON)LoadImage(hInst,MAKEINTRESOURCE(2),IMAGE_ICON,32,32,0);//LoadIcon(hInst,MAKEINTRESOURCE(2));
    2.     DirIconIndex=ImageList_AddIcon(ImgList,Icon);
    3.  
    4.     SendDlgItemMessageW(hDlg,0,TVM_SETIMAGELIST,TVSIL_NORMAL,(LPARAM)ImgList);
    5.  
    6.     TVINSERTSTRUCTW tvi;
    7.     tvi.hParent=TVI_ROOT;
    8.     tvi.hInsertAfter=TVI_ROOT;
    9.     ZeroMemory(&tvi.item,sizeof(TVITEMW));
    10.     tvi.item.mask=TVIF_TEXT | TVIF_IMAGE;
    11.     tvi.item.pszText=(LPWSTR)L"Root";
    12.     tvi.item.cchTextMax=4;
    13.     tvi.item.iImage=DirIconIndex;
    14.     SendDlgItemMessageW(hDlg,0,TVM_INSERTITEMW,0,(LPARAM)&tvi);
    Результат не слишком радует:
    facepalm.png
     
  5. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    "Маленькие" иконки - это 16х16.
    32х32 это большие, как раз в listview со стилем LVS_ICON.
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Ты бы скинул сюда проект где ошибка, так можно много гадать. К примеру как создавался ImageList? Там есть параметры cx и cy, мб ты их выставил неправильно?
     
  7. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Вот собственно вы и ответили на вопрос: нужно было правильный размер в ImageList_Create выставлять. Всем спасибо.
     
  8. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Телепатия...
     
  9. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Не буду создавать ещё одну тему, так что напишу здесь. После добавления элемента описанным способом:
    Код (C):
    1. ImgList=ImageList_Create(16,16,ILC_COLOR32,3,0);
    2.  
    3.     HICON Icon=LoadIcon(hInst,MAKEINTRESOURCE(0));
    4.     FileIconIndex=ImageList_AddIcon(ImgList,Icon);
    5.  
    6.     Icon=LoadIcon(hInst,MAKEINTRESOURCE(1));
    7.     GrowDirIconIndex=ImageList_AddIcon(ImgList,Icon);
    8.  
    9.     Icon=LoadIcon(hInst,MAKEINTRESOURCE(2));
    10.     DirIconIndex=ImageList_AddIcon(ImgList,Icon);
    11.  
    12.     SendDlgItemMessageW(hDlg,0,TVM_SETIMAGELIST,TVSIL_NORMAL,(LPARAM)ImgList);
    13.  
    14.     TVINSERTSTRUCTW tvi;
    15.     tvi.hParent=TVI_ROOT;
    16.     tvi.hInsertAfter=TVI_ROOT;
    17.     ZeroMemory(&tvi.item,sizeof(TVITEMW));
    18.     tvi.item.mask=TVIF_TEXT | TVIF_IMAGE;
    19.     tvi.item.pszText=(LPWSTR)L"Root";
    20.     tvi.item.cchTextMax=4;
    21.     tvi.item.iImage=DirIconIndex;
    22.     SendDlgItemMessageW(hDlg,0,TVM_INSERTITEMW,0,(LPARAM)&tvi);
    всё вроде-бы хорошо, но при щелчке по данному элементу его иконка меняется, как этого избежать?
     
  10. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    Код (C):
    1.  
    2. tvi.item.mask=TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE;
    3. tvi.item.iImage = tvi.item.iSelectedImage = DirIconIndex;
    4.  
    И cchTextMax используется только когда ты запрашиваешь у контрола текст. При сообщениях Add, Set, Insert, etc. это поле игнорируется.
     
  11. _qwe8013

    _qwe8013 Active Member

    Публикаций:
    2
    Регистрация:
    30 ноя 2016
    Сообщения:
    125
    Спасибо, всё заработало.