CListCtrl ownerdraw и ownerdata
От: omninamed Украина  
Дата: 08.02.13 08:50
Оценка:
Нужен CListCtrl для отображения довольно большого лога.

4 столбца.
1 — время.
2 — иконка.
3 — текст (может быть в несколько строк и разного цвета)
4 — текст (одна строка)

Собственно с рисованием у меня плохо
Re: CListCtrl ownerdraw и ownerdata
От: Carc Россия http://www.amlpages.com/home.php
Дата: 08.02.13 14:08
Оценка:
Здравствуйте, omninamed, Вы писали:

O>Нужен CListCtrl для отображения довольно большого лога.


O>4 столбца.

O>1 — время.
O>2 — иконка.
O>3 — текст (может быть в несколько строк и разного цвета)
O>4 — текст (одна строка)

O>Собственно с рисованием у меня плохо

CustomDraw
Aml Pages Home
Re[2]: CListCtrl ownerdraw и ownerdata
От: omninamed Украина  
Дата: 10.02.13 20:22
Оценка:
Здравствуйте, Carc, Вы писали:

C>CustomDraw


Эх, думал меня примером порадуют, а меня заставляют рисовать)
Re[2]: CListCtrl ownerdraw и ownerdata
От: omninamed Украина  
Дата: 11.02.13 07:11
Оценка:
В общем можно и не рисовать ничего вручную, просто модифицировать стандартную отрисовку.
Но есть пару нюансов. Все ячейки списка прекрасно понимают когда нужно отображать иконку, а когда нет. Кроме первого столбца. Он либо рисует нулевое изображение из списка CImageList либо рисует пустой квадратик (ну это понятно, если по данному адресу нет изображения)
Как заставить список ничего не рисовать кроме текста в первом столбце?
И второй вопрос, как задать высоту строки списка?
Re[3]: CListCtrl ownerdraw и ownerdata
От: omninamed Украина  
Дата: 11.02.13 08:36
Оценка:
Проблема с отрисовкой пустого квадратика в первом столбце решена способом для ленивых — сменой позиции столбцов.
Раз уж мелкомягкие считают, что первый столбец должен всегда содержать иконки, пусть так и будет)

Столбец "S" должен содержать только иконки и быть вторым.

InsertColumn ( 0, L"S", HDF_LEFT, 18, 1 );
InsertColumn ( 1, L"Время", HDF_LEFT, 75, 0 );
InsertColumn ( 2, L"Информация", HDF_LEFT, 252, 2 );
InsertColumn ( 3, L"Результат", HDF_LEFT, 60, 3 );

CHeaderCtrl* pHeader = GetHeaderCtrl ( );
int nCount = pHeader->GetItemCount ( );
LPINT pnOrder = ( LPINT ) malloc ( nCount * sizeof ( int ) );
ASSERT ( pnOrder != NULL );
if ( NULL != pnOrder )
{
    pHeader->GetOrderArray ( pnOrder, nCount );
    int nSwap = pnOrder [ 0 ];
    pnOrder [ 1 ] = 0;
    pnOrder [ 0 ] = nSwap;
    pHeader->SetOrderArray ( nCount, pnOrder );
    free ( pnOrder );
};


Теперь другой вопрос, как изменить высоту строк? Строки могут быть разной высоты.
Re[3]: CListCtrl ownerdraw и ownerdata
От: Carc Россия http://www.amlpages.com/home.php
Дата: 11.02.13 09:06
Оценка:
Здравствуйте, omninamed, Вы писали:

O>В общем можно и не рисовать ничего вручную, просто модифицировать стандартную отрисовку.

O>Но есть пару нюансов. Все ячейки списка прекрасно понимают когда нужно отображать иконку, а когда нет. Кроме первого столбца. Он либо рисует нулевое изображение из списка CImageList либо рисует пустой квадратик (ну это понятно, если по данному адресу нет изображения)

Вернуть в обработчике NM_CUSTOMDRAW флаг CDRF_SKIPDEFAULT — тогда ListView не будет рисовать данные сам. А уже на стадии CDDS_ITEMPOSTPAINT можно самому что нужно отрисовать или нет.
Aml Pages Home
Re[3]: CListCtrl ownerdraw и ownerdata
От: Carc Россия http://www.amlpages.com/home.php
Дата: 11.02.13 09:16
Оценка:
Здравствуйте, omninamed, Вы писали:
O>И второй вопрос, как задать высоту строки списка?
По моему никак. Но можно увеличить высоту всех айтемов задав шрифт покрупнее, а в момент перед отрисовкой в NM_CUSTOMDRAW подсовывать контролу обратно в HDC более маленький шрифт, и возвращать флаг CDRF_NEWFONT чтобы использовал этот мелкий шрифт.

Вариант второй: попробовать в NM_CUSTOMDRAW на стадии CDDS_ITEMPREPAINT изменять высоту NMCUSTOMDRAW::rc. Но меня терзают смутные сомнения, что ListView учтет изменения. Нужно пробовать.
Aml Pages Home
Re[3]: CListCtrl ownerdraw и ownerdata
От: Pavel Dvorkin Россия  
Дата: 11.02.13 13:57
Оценка:
Здравствуйте, omninamed, Вы писали:

O>И второй вопрос, как задать высоту строки списка?


http://www.codeproject.com/Articles/1401/Changing-Row-Height-in-an-owner-drawn-Control
With best regards
Pavel Dvorkin
Re[4]: CListCtrl ownerdraw и ownerdata
От: omninamed Украина  
Дата: 12.02.13 05:57
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, omninamed, Вы писали:


O>>И второй вопрос, как задать высоту строки списка?


PD>http://www.codeproject.com/Articles/1401/Changing-Row-Height-in-an-owner-drawn-Control


MeasureItem похоже не работает с виртуальным списком.
Re[5]: CListCtrl ownerdraw и ownerdata
От: Pavel Dvorkin Россия  
Дата: 12.02.13 06:32
Оценка:
Здравствуйте, omninamed, Вы писали:


O>MeasureItem похоже не работает с виртуальным списком.


Гм...

Берем этот проект, ставим ListView LVS_OWNERDATA, комментируем в нем

// for(j = 1; j<m_nColumns; j++)
// {
// SetItemText(i,j,_gszItem[i][j]);
// }

(потому что нельзя такое делать в этом листвью)

ставим брекпойнт на CListCtrlEx::MeasureItem и получаем его.

Впрочем, может, я что-то не учел.

См. также

http://msdn.microsoft.com/en-us/library/ye4z8x58(v=vs.80).aspx
With best regards
Pavel Dvorkin
Re[6]: CListCtrl ownerdraw и ownerdata
От: omninamed Украина  
Дата: 12.02.13 06:56
Оценка:
Здравствуйте, 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 прекрасно работает, запрашивает у меня информацию о итемах, я ему передаю.

ON_WM_MEASUREITEM_REFLECT ( )
ON_WM_MEASUREITEM ( )

Соответствующие обработчики MeasureItem ( LPMEASUREITEMSTRUCT lpMeasureItemStruct ) и OnMeasureItem ( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct ) не вызываются.
Re[7]: CListCtrl ownerdraw и ownerdata
От: Pavel Dvorkin Россия  
Дата: 12.02.13 08:15
Оценка:
Здравствуйте, omninamed, Вы писали:

O>Соответствующие обработчики MeasureItem ( LPMEASUREITEMSTRUCT lpMeasureItemStruct ) и OnMeasureItem ( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct ) не вызываются.


То есть то, что я написал выше, не работает ? Странно. У меня брекпойнт сработал.
With best regards
Pavel Dvorkin
Re: CListCtrl ownerdraw и ownerdata
От: Melamed Россия  
Дата: 12.02.13 10:11
Оценка:
Здравствуйте, omninamed, Вы писали:

O>Нужен CListCtrl для отображения довольно большого лога.


O>4 столбца.

O>1 — время.
O>2 — иконка.
O>3 — текст (может быть в несколько строк и разного цвета)
O>4 — текст (одна строка)

O>Собственно с рисованием у меня плохо


Сосдаешь ListView co сеилем LVS_OWNERDRAWFIXED и рисуешь польностью элементы списка в сообщении WM_DRAWITEM Пример кода можешь взять здесь
Re[8]: CListCtrl ownerdraw и ownerdata
От: SkyKnight Швейцария https://github.com/dmitrigrigoriev/
Дата: 07.05.13 14:00
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>То есть то, что я написал выше, не работает ? Странно. У меня брекпойнт сработал.

У меня так и не получилось сделать список с разными высотами строк.
Народ в интернете бушевал по этому поводу. Возможно сейчас уже что-то изменилось.
github.com/dmitrigrigoriev/
Re: CListCtrl ownerdraw и ownerdata
От: BerAn  
Дата: 13.05.13 03:49
Оценка:
Здравствуйте, omninamed, Вы писали:

O>Нужен CListCtrl для отображения довольно большого лога.


O>4 столбца.

O>1 — время.
O>2 — иконка.
O>3 — текст (может быть в несколько строк и разного цвета)
O>4 — текст (одна строка)

O>Собственно с рисованием у меня плохо


Бери любой:
http://www.codeproject.com/Articles/8112/CQuickList?msg=1833366#xx1833366xx
Re[9]: CListCtrl ownerdraw и ownerdata
От: Аноним  
Дата: 17.12.13 10:27
Оценка:
Здравствуйте, SkyKnight, Вы писали:

SK>Здравствуйте, Pavel Dvorkin, Вы писали:


PD>>То есть то, что я написал выше, не работает ? Странно. У меня брекпойнт сработал.

SK>У меня так и не получилось сделать список с разными высотами строк.
SK>Народ в интернете бушевал по этому поводу. Возможно сейчас уже что-то изменилось.
Неа.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.