void AddColumnToListView(char *p, int subitem)
{
LVCOLUMN lvc;
lvc.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
lvc.iSubItem = subitem;
lvc.pszText = p;
lvc.cx = 250;
lvc.fmt = LVCFMT_LEFT;
ListView_InsertColumn(queuewnd, subitem, &lvc);
}
Прошу помощи с ListView
Код:
//queuewnd - это сам листвью.
Во-первых, если код верен, тогда почему при ЛЮБОМ изменении subitem они создаются в одинаковом порядке?
Также, хотел бы услышать мнение про добавление элементов в листвью:
Код:
void AddItemToListView(char *p, int subitem)
{
LVITEM lvI;
lvI.mask = LVIF_TEXT|LVIF_STATE;
lvI.state = 0;
lvI.stateMask = 0;
lvI.iItem = 0;
lvI.iImage = 0;
lvI.iSubItem = 0;
SendMessage(queuewnd, LVM_INSERTITEM, 0, (LPARAM)(&lvI));
lvI.iSubItem=subitem;lvI.pszText=p;
SendMessage(queuewnd,LVM_SETITEM,0,(LPARAM)(&lvI));
}
{
LVITEM lvI;
lvI.mask = LVIF_TEXT|LVIF_STATE;
lvI.state = 0;
lvI.stateMask = 0;
lvI.iItem = 0;
lvI.iImage = 0;
lvI.iSubItem = 0;
SendMessage(queuewnd, LVM_INSERTITEM, 0, (LPARAM)(&lvI));
lvI.iSubItem=subitem;lvI.pszText=p;
SendMessage(queuewnd,LVM_SETITEM,0,(LPARAM)(&lvI));
}
Объясните вразумительно, что означают параметры iSubItem и iItem? И здесь(LVITEM) и в LVCOLUMN. Я вот не догоняю. Ссылку на мсдн не давать. Четко, и по-русски, ответьте мне :)
И еще вопрос: как добавить наименование строчки в ListView? Т.е., имена столбцов - InsertColumn, а нужно то же самое, только слева и построчно(пронумеровать).
ListView состоит из нескольких контролов (Edit - для редактировани и д. присутствовать стиль LVS_EDITLABELS, Header - заголовки (ListView_GetHeader - дает доступ для работы с заголовками в режиме LVS_REPORT) и д. отсутствовать стиль LVS_NOCOLUMNHEADER, 3-и ImageList для хранения картинок и самого главного окна) и может работать в разных режимах (LVS_LIST, LVS_REPORT, LVS_SMALLICON).
В режиме LVS_REPORT отображается маcсив Array(iItem, iSubItem), где iItem - строки, а iSubItem - столбцы.
Лучше всего сначало задать все столбцы, а далее добавлять строки (контролу не придется перелапачивать весь массив). Т.к. Header - дочерние окно, то с ним можно самостоятельно работать сообщениями HDM_...
Пример с колонками:
lvColumn.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
for (i=0; i<NeedColumn; i++) {
if (i==1 || i==2) lvColumn.fmt = LVCFMT_RIGHT;
else lvColumn.fmt = LVCFMT_LEFT;
lvColumn.iSubItem = i;
lvColumn.cx = szCol; // из массива ширин столбцов
lvColumn.pszText = (LPSTR) lpCap; // из массива наименований столбцов
lvColumn.cchTextMax = strlen(lvColumn.pszText); // необязательно
ListView_InsertColumn(hWndList, i, &lvColumn);
}
Пример строк:
for(i=0; i<NeedRow; i++){
lvItem.pszText = (LPSTR)MyText;
index = ListView_InsertItem(hWndList, &lvItem);
for(k = 1; k< NeedColumn; k++){
sprintf(buf, "Column %d", k);
ListView_SetItemText(hWndList, index, 1, buf); // значение в соотв. колонке
}
}
1. Как изменять размер ListView только по вертикали(для изменения размеров вообще пытаюсь использовать WS_SIZEBOX)?
2. Допустим, я кликнул на строчку в ListView. Как взять из нее данные?
p.s. Может сразу мануал напишете, всем поможете, и вопросов задавать не будут больше..
Как перехватить сообщения для ListView ?
LRESULT WinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg){
case WM_NOTIFY:
return OnListView((LPNMHDR)lParam);
.................
LRESULT OnListView(LPNMHDR lphdr)
{
switch(lphdr->code){
case NM_CUSTOMDRAW:
return OnCustomDraw((NMLVCUSTOMDRAW*)lphdr);
case LVN_ITEMACTIVATE:
{
LPNMITEMACTIVATE lpfv = (LPNMITEMACTIVATE)lphdr;
/* наша обработка */
}
break;
................
}
return 0;
}
''мануал'' уже написан и называется MSDN, а также (если проблема с английским) есть его вольные переводы. Стоит только немного приложить усилий... и поискать в сети.