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

Ваш аккаунт

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

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

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

ListCtrl

9.2K
28 ноября 2005 года
llllDeadMan
32 / / 28.11.2005
Использую ListCtrl как Report, отрисовываю итемы вручную. Хотелось бы добавить вертикальную сетку. В прорисовке итемов я все сделал, а вот как отрисовать линии просто на фоне? И реально ли это вообще сделать без перерисовки всего контрола?
Кто-нить знает?

Заранее спасибо за помощь!
2.2K
30 ноября 2005 года
REFOT
181 / / 08.04.2005
Конечно, реально, и нет ничего проще:

ListView_SetExtendedListViewStyle(m_hWnd/*ListCtrl*/,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);
9.2K
30 ноября 2005 года
llllDeadMan
32 / / 28.11.2005
Цитата:
Originally posted by REFOT
Конечно, реально, и нет ничего проще:

ListView_SetExtendedListViewStyle(m_hWnd/*ListCtrl*/,LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES);


А ты мой пост внимательно читал? Если было бы все так просто, я бы не спрашивал...

Цитата:
Использую ListCtrl как Report, отрисовываю итемы вручную.


Отрисовываю вручную на мысли не наводит? Я практически весь контрол вручную реализовал, а ты мне про стили пишешь... :devil:

2.2K
01 декабря 2005 года
REFOT
181 / / 08.04.2005
Хоть отрисовывай в DrawItem(…); итемы вручную, хоть не вручную, если укажешь этот стиль, сетка будет выводиться.

И кто сказал, что будет перерисовка всего контрола? Будет перерисовка только тех итемов, которым пришло сообщение на перерисовку.

И если не хочешь пользоваться стилями, то придётся сетку рисовать самому в DrawItem(…);. Линии в этом случае на фон выводятся, как и всё остальное.

Или можно просто получить контекст устройства на окно этого контрола, а потом при сообщении на перерисовку самому сетку врисовывать.
9.2K
01 декабря 2005 года
llllDeadMan
32 / / 28.11.2005
Цитата:
Originally posted by REFOT
Хоть отрисовывай в DrawItem(…); итемы вручную, хоть не вручную, если укажешь этот стиль, сетка будет выводиться.


Все верно, просто я даже не проверял, потому что мне нужна только вертикальная сетка...

Цитата:
И если не хочешь пользоваться стилями, то придётся сетку рисовать самому в DrawItem(…);. Линии в этом случае на фон выводятся, как и всё остальное.


Ты сам себе ответил:
"Будет перерисовка только тех итемов, которым пришло сообщение на перерисовку." А если перерисовывается фон, линий не будет...

Цитата:
Или можно просто получить контекст устройства на окно этого контрола, а потом при сообщении на перерисовку самому сетку врисовывать.

Получить то контекст без проблем, но если перегружать функцию перерисовки, то весь контрол придется отрисовывать ручками...

430
01 декабря 2005 года
craftyfox
157 / / 20.02.2000
Цитата:
Originally posted by llllDeadMan

Получить то контекст без проблем, но если перегружать функцию перерисовки, то весь контрол придется отрисовывать ручками...


Ну а если сначала вызвать windows procedure List View Control'а , потом нарисовать линии?

9.2K
02 декабря 2005 года
llllDeadMan
32 / / 28.11.2005
Цитата:
Originally posted by craftyfox
Ну а если сначала вызвать windows procedure List View Control'а , потом нарисовать линии?


Когда перегружаешь функцию OnPaint в коментах
//Do not call CListCtrl::OnPaint() for painting messages. Вставлял CListCtrl::OnPaint() - ничего не отрисовывает... :(

2.2K
02 декабря 2005 года
REFOT
181 / / 08.04.2005
Цитата:
Получить то контекст без проблем, но если перегружать функцию перерисовки, то весь контрол придется отрисовывать ручками...



void CMyList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
//Что-то рисуем
}

LRESULT CMyList::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
switch ( message )
{

case WM_PAINT:
{
LV_COLUMN Column;

Column.mask = LVCF_WIDTH;

LONG cPos = 0;
LONG lPos = 0;

CListCtrl::WindowProc(message, wParam, lParam);

while ( GetColumn(cPos,&Column) )
{
HDC hDC = ::GetDC(m_hWnd);

RECT RectWnd;

GetClientRect(&RectWnd);

lPos += Column.cx;

::MoveToEx(hDC,lPos,20,NULL);

::LineTo (hDC,lPos,RectWnd.bottom);

::ReleaseDC(m_hWnd,hDC);

cPos++;
}

return 0;
}

};

return CListCtrl::WindowProc(message, wParam, lParam);
}

Я говорил вот про такую реализацию...
При этом будут перерисовываться только те итемы которым придёт сообщение на перерисовку, а не весь контрол.

Вот тебе и вертикальные полосы.

9.2K
02 декабря 2005 года
llllDeadMan
32 / / 28.11.2005
Оооо! :o Большое спасибо!!! Че-то я сам до этого не дошел... :P
430
03 декабря 2005 года
craftyfox
157 / / 20.02.2000
Цитата:
Originally posted by llllDeadMan
Когда перегружаешь функцию OnPaint в коментах
//Do not call CListCtrl::OnPaint() for painting messages. Вставлял CListCtrl::OnPaint() - ничего не отрисовывает... :(


Эт потому, что нужно еще убрать CPaintDC dc(this);
(далее как у REFOT'а )

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог