Выравнивание элементов в ListView

Тема в разделе "WASM.WIN32", создана пользователем zortich, 29 апр 2008.

  1. zortich

    zortich New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2007
    Сообщения:
    27
    Есть ListView созданный таким образом.
    GetClientRect(hWnd,&rc);
    hwndList = CreateWindowEx(0L, WC_LISTVIEW, TEXT(""),
    WS_VISIBLE|WS_CHILD|WS_BORDER|LVS_ALIGNLEFT|LVS_ICON,
    0, 0, rc.right - rc.left, rc.bottom - rc.top,
    hWnd, (HMENU)IDC_LISTVIEW, hInst, NULL);
    ListView_SetImageList(hwndList,hImageList,LVSIL_NORMAL);

    В него добавлены только иконки.

    LV_ITEM lvi;
    for (int i=0; i<ImageList_GetImageCount(hImageList);i++)
    {
    ZeroMemory(&lvi,sizeof(LV_ITEM));
    lvi.mask = LVIF_IMAGE|LVIF_PARAM;
    lvi.iItem = i;
    lvi.lParam =10;
    lvi.iImage = i;
    ListView_InsertItem(hwndList, &lvi);
    }

    Иконки добавляются все нормально. Но растояние между иконками слишком большое (сверху и с низу).
    Как заставить ListView выровнять иконки чтобы они стояли к друг другу в плотную.?
     
  2. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Код (Text):
    1. ListView_SetIconSpacing(hListView, IconWidth, IconHeight);
    Взамен скажи мне, почему не работает следующее
    Код (Text):
    1. HIMAGELIST hImageList = ImageList_Create(48, 48, ILC_COLORDDB, 16, 16);
    2. ImageList_ReplaceIcon(hImageList, 0, LoadIcon(NULL, IDI_QUESTION));
    LoadIcon отрабатывает нормально, GetLastError говорит: "Неверный дескриптор указателя".
     
  3. zortich

    zortich New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2007
    Сообщения:
    27
    ImageList_ReplaceIcon(hImageList, 0, LoadIcon(NULL, MAKEINTRESOURCE(IDI_QUESTION)));
    В первом параметре можно еще указать HINSTANCE.
     
  4. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Иконка взята из постоянно загруженных - наверное Windows не позволяет добавлять такие иконки в ImageList.
     
  5. GMax

    GMax Member

    Публикаций:
    0
    Регистрация:
    3 июл 2006
    Сообщения:
    218
    А зачем ILC_COLORDDB (device-dependent bitmap)?
    Вот так работает:
    Код (Text):
    1. invoke  ImageList_Create, 16, 16, ILC_COLOR32, nProc, 0
    2. mov     hImageList, eax
    3. invoke  LoadIcon,0,IDI_QUESTION
    4. invoke  ImageList_ReplaceIcon,hImageList,-1,eax
     
  6. zortich

    zortich New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2007
    Сообщения:
    27
    Приключения с ListView продолжаются.
    Код (Text):
    1. hImageList=ImageList_Create(24,24,ILC_COLOR32,0,0);
    2. .............
    3.     RECT rc;
    4.     GetClientRect(hWnd,&rc);   
    5.     hwndList = CreateWindowEx(0L, WC_LISTVIEW, TEXT(""),
    6.                   WS_VISIBLE|WS_CHILD|LVS_NOSCROLL|LVS_ICON|LVS_SINGLESEL,
    7.                   0, 0, rc.right - rc.left, rc.bottom - rc.top,
    8.                   hWnd, (HMENU)IDC_LISTVIEW, hInst, NULL);
    9.     ListView_SetImageList(hwndList,hImageList,LVSIL_NORMAL);
    10.     LV_ITEM lvi;   
    11.     ListView_SetIconSpacing(hwndList,22,22);
    12.     for (int i=0; i<ImageList_GetImageCount(hImageList);i++)
    13.     {
    14.         ZeroMemory(&lvi,sizeof(LV_ITEM));
    15.         lvi.mask = LVIF_IMAGE|LVIF_PARAM;      
    16.         lvi.iItem = i;
    17.         lvi.lParam =i;         
    18.         lvi.iImage = i;
    19.         ListView_InsertItem(hwndList, &lvi);
    20. }
    Проблема в следующем. Когда щелкаю по одному из элиментов выделяется почему то элемент который находится строкой выше. Как это исправить?
     
  7. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    Ага, спасибо. Это я в отчаянии начал все флаги пробовать)

    Хотя, на самом деле, необходимо было просто использовать -1:
    invoke ImageList_ReplaceIcon,hImageList,-1, eax

    Просто было решено, что раз имаджлист создаётся уже с иконками,
    HIMAGELIST hImageList = ImageList_Create(48, 48, ILC_COLORDDB, 16, 16);
    то он действительно создаётся с иконками (ан нет, оказывается).


    zortich
    Это из-за текста под иконками (даже если текста нет). В Vista можно использовать расширенный стиль для ListView - LVS_EX_HIDELABELS. В XP sp3 тоже наверняка поддерживается.