Здравствуйте, omninamed, Вы писали:
O>Нужен CListCtrl для отображения довольно большого лога.
O>4 столбца. O>1 — время. O>2 — иконка. O>3 — текст (может быть в несколько строк и разного цвета) O>4 — текст (одна строка)
O>Собственно с рисованием у меня плохо CustomDraw
В общем можно и не рисовать ничего вручную, просто модифицировать стандартную отрисовку.
Но есть пару нюансов. Все ячейки списка прекрасно понимают когда нужно отображать иконку, а когда нет. Кроме первого столбца. Он либо рисует нулевое изображение из списка CImageList либо рисует пустой квадратик (ну это понятно, если по данному адресу нет изображения)
Как заставить список ничего не рисовать кроме текста в первом столбце?
И второй вопрос, как задать высоту строки списка?
Проблема с отрисовкой пустого квадратика в первом столбце решена способом для ленивых — сменой позиции столбцов.
Раз уж мелкомягкие считают, что первый столбец должен всегда содержать иконки, пусть так и будет)
Столбец "S" должен содержать только иконки и быть вторым.
Здравствуйте, omninamed, Вы писали:
O>В общем можно и не рисовать ничего вручную, просто модифицировать стандартную отрисовку. O>Но есть пару нюансов. Все ячейки списка прекрасно понимают когда нужно отображать иконку, а когда нет. Кроме первого столбца. Он либо рисует нулевое изображение из списка CImageList либо рисует пустой квадратик (ну это понятно, если по данному адресу нет изображения)
Вернуть в обработчике NM_CUSTOMDRAW флаг CDRF_SKIPDEFAULT — тогда ListView не будет рисовать данные сам. А уже на стадии CDDS_ITEMPOSTPAINT можно самому что нужно отрисовать или нет.
Здравствуйте, omninamed, Вы писали: O>И второй вопрос, как задать высоту строки списка?
По моему никак. Но можно увеличить высоту всех айтемов задав шрифт покрупнее, а в момент перед отрисовкой в NM_CUSTOMDRAW подсовывать контролу обратно в HDC более маленький шрифт, и возвращать флаг CDRF_NEWFONT чтобы использовал этот мелкий шрифт.
Вариант второй: попробовать в NM_CUSTOMDRAW на стадии CDDS_ITEMPREPAINT изменять высоту NMCUSTOMDRAW::rc. Но меня терзают смутные сомнения, что ListView учтет изменения. Нужно пробовать.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, omninamed, Вы писали:
O>>MeasureItem похоже не работает с виртуальным списком.
PD>Гм...
PD>Берем этот проект, ставим ListView LVS_OWNERDATA, комментируем в нем
PD>// for(j = 1; j<m_nColumns; j++) PD>// { PD>// SetItemText(i,j,_gszItem[i][j]); PD>// }
PD>(потому что нельзя такое делать в этом листвью)
PD>ставим брекпойнт на CListCtrlEx::MeasureItem и получаем его.
PD>Впрочем, может, я что-то не учел.
PD>См. также
PD>http://msdn.microsoft.com/en-us/library/ye4z8x58(v=vs.80).aspx
Да да, знаю) OnLvnGetdispinfo прекрасно работает, запрашивает у меня информацию о итемах, я ему передаю.
Соответствующие обработчики MeasureItem ( LPMEASUREITEMSTRUCT lpMeasureItemStruct ) и OnMeasureItem ( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct ) не вызываются.
Здравствуйте, omninamed, Вы писали:
O>Нужен CListCtrl для отображения довольно большого лога.
O>4 столбца. O>1 — время. O>2 — иконка. O>3 — текст (может быть в несколько строк и разного цвета) O>4 — текст (одна строка)
O>Собственно с рисованием у меня плохо
Сосдаешь ListView co сеилем LVS_OWNERDRAWFIXED и рисуешь польностью элементы списка в сообщении WM_DRAWITEM Пример кода можешь взять здесь
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>То есть то, что я написал выше, не работает ? Странно. У меня брекпойнт сработал.
У меня так и не получилось сделать список с разными высотами строк.
Народ в интернете бушевал по этому поводу. Возможно сейчас уже что-то изменилось.
Здравствуйте, omninamed, Вы писали:
O>Нужен CListCtrl для отображения довольно большого лога.
O>4 столбца. O>1 — время. O>2 — иконка. O>3 — текст (может быть в несколько строк и разного цвета) O>4 — текст (одна строка)
O>Собственно с рисованием у меня плохо
Здравствуйте, SkyKnight, Вы писали:
SK>Здравствуйте, Pavel Dvorkin, Вы писали:
PD>>То есть то, что я написал выше, не работает ? Странно. У меня брекпойнт сработал. SK>У меня так и не получилось сделать список с разными высотами строк. SK>Народ в интернете бушевал по этому поводу. Возможно сейчас уже что-то изменилось.
Неа.