Есть 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 выровнять иконки чтобы они стояли к друг другу в плотную.?
Код (Text): ListView_SetIconSpacing(hListView, IconWidth, IconHeight); Взамен скажи мне, почему не работает следующее Код (Text): HIMAGELIST hImageList = ImageList_Create(48, 48, ILC_COLORDDB, 16, 16); ImageList_ReplaceIcon(hImageList, 0, LoadIcon(NULL, IDI_QUESTION)); LoadIcon отрабатывает нормально, GetLastError говорит: "Неверный дескриптор указателя".
ImageList_ReplaceIcon(hImageList, 0, LoadIcon(NULL, MAKEINTRESOURCE(IDI_QUESTION))); В первом параметре можно еще указать HINSTANCE.
Иконка взята из постоянно загруженных - наверное Windows не позволяет добавлять такие иконки в ImageList.
А зачем ILC_COLORDDB (device-dependent bitmap)? Вот так работает: Код (Text): invoke ImageList_Create, 16, 16, ILC_COLOR32, nProc, 0 mov hImageList, eax invoke LoadIcon,0,IDI_QUESTION invoke ImageList_ReplaceIcon,hImageList,-1,eax
Приключения с ListView продолжаются. Код (Text): hImageList=ImageList_Create(24,24,ILC_COLOR32,0,0); ............. RECT rc; GetClientRect(hWnd,&rc); hwndList = CreateWindowEx(0L, WC_LISTVIEW, TEXT(""), WS_VISIBLE|WS_CHILD|LVS_NOSCROLL|LVS_ICON|LVS_SINGLESEL, 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; ListView_SetIconSpacing(hwndList,22,22); 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 =i; lvi.iImage = i; ListView_InsertItem(hwndList, &lvi); } Проблема в следующем. Когда щелкаю по одному из элиментов выделяется почему то элемент который находится строкой выше. Как это исправить?
Ага, спасибо. Это я в отчаянии начал все флаги пробовать) Хотя, на самом деле, необходимо было просто использовать -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 тоже наверняка поддерживается.