Всем добрый день! Начал осваивать ListView но остановился на 3-х моментах: 1. Как установить курсор в ListView на нужной строке? 2. Как порасить строки в одном ListView разных цветов? 3. Как производить сортировку строк (например по алфавиту)? Если кто поскажет, или даст ссылочку на сэмплы - буду благодарен!
Установить выделение на определенном итеме можно так: Код (Text): LOCAL lvi :LVITEM invoke SetFocus, hList mov lvi.state,0FFFFFFFFh mov lvi.stateMask, LVIS_FOCUSED or LVIS_SELECTED ;выделить пятый итем invoke SendMessage, hList, LVM_SETITEMSTATE, 5, addr lvi invoke SendMessage, hList, LVM_ENSUREVISIBLE, iItem, 0 Как сортировать зависит от того, установлен у листвью стиль LVS_OWNERDATA или нет. Если стиль установлен (virtual listview), то данные храняться не в листвью, а в обычном массиве, и при необходимости листвью запрашивает эти данные (когда нужно отобразить содержимое листвью). При этом передаешь из массива запрошенные строки в листвью. Virtual listview не имеет встроенного механизма сортировки. В этом случае сортировка сводится к обычной сортировке массива и после сортировки массива нужно принудительно заставить листвью обновиться, чтобы он отобразил заново отсортированный массив. Если LVS_OWNERDATA не установлен (листвью постоянно хранит данные), то при клике на заголовке колонки можно послать сообщение для листвью LVM_SORTITEMS, и при этом будет вызываться написаный тобой callback, в котором будешь сравнивать передаваемые в callback строки и возвращать -1, 0 или 1 в зависимости от результата сравнения строк. Соответственно возвращаемому результату будут мемяться (или не меняться) местами итемы листвью. Пример сортировки с callback есть в пакете masm32 в папке examples. Если итемов (строк) мало, то можно использовать листвью без LVS_OWNERDATA, если много ( порядка нескольких десятков тысяч и более), то нужен virtual listview. Соответственно определяешься с возможным количеством итемов и выбираешь нужный стиль и соответственно способ сортировки.
Чтобы сделать листвью полосатым, надо обрабатывать WM_NOTIFY, присылаемый родителю листа таким образом: Код (Text): .elseif eax==WM_NOTIFY mov ebx,lParam mov eax,[ebx.NMHDR].hwndFrom .if eax==hList mov eax,[ebx.NMHDR].code .if eax==NM_CUSTOMDRAW mov ebx,lParam assume ebx: ptr NMLVCUSTOMDRAW .if ([ebx].nmcd.dwDrawStage==CDDS_PREPAINT) mov eax,CDRF_NOTIFYITEMDRAW jmp _ret .elseif ([ebx].nmcd.dwDrawStage==CDDS_ITEMPREPAINT) mov eax,[ebx].nmcd.dwItemSpec and eax,1 .if (eax) mov [ebx].clrTextBk, 00FFFDE6h mov esi, hVerdana .else mov [ebx].clrTextBk, 00DBFFF7h mov esi, hArial .endif invoke SelectObject, [ebx].nmcd.hdc, esi mov [ebx].clrText, 0A00000h mov eax,CDRF_NEWFONT jmp _ret .endif assume ebx:nothing .endif .endif заодно и шрифт и цвет текста можно установить для каждого итема отдельно
если используется SelectObject, то похоже надо делать CreateFont либо GetStockObject (DEFAULT_GUI_FONT). Но вообще, если шрифт не нужен, то достаточно только цвета указать