Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Прошу помощи с ListView

9.1K
11 июня 2010 года
motorw
134 / / 15.12.2009
WINAPI, C++, без отстойного MFC. Искал информацию вразумительную очень долго насчет создания топика(ListView) на c++ и НЕ MFC, вследствие чего не на все вопросы нашел ответы. Так, например, как правильно вставлять колонки? Верен ли для этого следующий код?:
Код:
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);
}

//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));
}

Объясните вразумительно, что означают параметры iSubItem и iItem? И здесь(LVITEM) и в LVCOLUMN. Я вот не догоняю. Ссылку на мсдн не давать. Четко, и по-русски, ответьте мне :)

И еще вопрос: как добавить наименование строчки в ListView? Т.е., имена столбцов - InsertColumn, а нужно то же самое, только слева и построчно(пронумеровать).
9.0K
11 июня 2010 года
grag63
71 / / 23.01.2006
Напрасно не любите мсдн, там все описано, но попробую объяснить "по-русски".
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); // значение в соотв. колонке
}
}
9.1K
13 июня 2010 года
motorw
134 / / 15.12.2009
Большое спасибо! Но осталось еще несколько вопросов:
1. Как изменять размер ListView только по вертикали(для изменения размеров вообще пытаюсь использовать WS_SIZEBOX)?
2. Допустим, я кликнул на строчку в ListView. Как взять из нее данные?

p.s. Может сразу мануал напишете, всем поможете, и вопросов задавать не будут больше..
9.1K
14 июня 2010 года
motorw
134 / / 15.12.2009
Как перехватить сообщения для ListView ?
9.0K
15 июня 2010 года
grag63
71 / / 23.01.2006
Размер строки зависит от размера иконки и рамера шрифта + доп. опции стиля. Все данные обрабатываются по событиям LVN_... и NM_ родительским окном по сообщению WM_NOTIFY, пример:
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, а также (если проблема с английским) есть его вольные переводы. Стоит только немного приложить усилий... и поискать в сети.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог