Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.45.92] |
|
Сообщ.
#1
,
|
|
|
Как поменять цвет grid lines в лист контроле имеющем стиль LVS_EX_GRIDLINES?
|
Сообщ.
#2
,
|
|
|
1. Переопределяешь класс CListCtrl.
2. Добавляешь в него метод afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult); 3. добавляешь в карту сообщений ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw) 4. описываешь сам метод void CExtListCtrl ::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR; if (lplvcd->nmcd.dwDrawStage == CDDS_PREPAINT) { *pResult = CDRF_NOTIFYITEMDRAW; } else if (lplvcd->nmcd.dwDrawStage == CDDS_ITEMPREPAINT) { *pResult = CDRF_NOTIFYSUBITEMDRAW; } else if (lplvcd->nmcd.dwDrawStage == (CDDS_ITEMPREPAINT | CDDS_SUBITEM)) { COLORREF crText, crBkgnd; if ( 0 == lplvcd->iSubItem ) { crText = RGB(255,0,0); crBkgnd = RGB(128,128,255); } else if ( 1 == lplvcd->iSubItem ) { crText = RGB(0,255,0); crBkgnd = RGB(255,0,0); } else { crText = RGB(128,128,255); crBkgnd = RGB(0,0,0); } lplvcd->clrText = crText; lplvcd->clrTextBk = crBkgnd; *pResult = CDRF_DODEFAULT; } } Вот и все! з.ы. навсякий случай набросал тебе махонький проектик по этому поводу, смотри аттач. Прикреплённый файлCustomList.rar (9.27 Кбайт, скачиваний: 164) |
Сообщ.
#3
,
|
|
|
Для смены цвета фона используешь метод:
Цитата CListCtrl::SetBkColor BOOL SetBkColor( COLORREF cr ); Parameters cr Background color to set, or the CLR_NONE value for no background color. List view controls with background colors redraw themselves significantly faster than those without background colors. For information, see COLORREF in the Platform SDK. Return Value Nonzero if successful; otherwise zero. Example // The pointer to my list view control. extern CListCtrl* pmyListCtrl; // Use the 3D button face color for the background. COLORREF crBkColor = ::GetSysColor(COLOR_3DFACE); pmyListCtrl->SetBkColor(crBkColor); ASSERT(pmyListCtrl->GetBkColor() == crBkColor); Для смены цвета фона под текстом используешь метод: Цитата CListCtrl::SetTextBkColor BOOL SetTextBkColor( COLORREF cr ); Parameters cr A COLORREF specifying the new text background color. For information, see COLORREF in the Platform SDK. Return Value Nonzero if successful; otherwise zero. Example // The pointer to my list view control. extern CListCtrl* pmyListCtrl; // Use the 3D button face color for the text background. COLORREF crBkColor = ::GetSysColor(COLOR_3DFACE); pmyListCtrl->SetTextBkColor(crBkColor); ASSERT(pmyListCtrl->GetTextBkColor() == crBkColor); Для смены цвета текста используешь метод: Цитата CListCtrl::SetTextColor BOOL SetTextColor( COLORREF cr ); Parameters cr A COLORREF specifying the new text color. For information, see COLORREF in the Platform SDK. Return Value Nonzero if successful; otherwise zero. Example // The pointer to my list view control. extern CListCtrl* pmyListCtrl; // Use the window text color for // the item text of the list view control. COLORREF crTextColor = ::GetSysColor(COLOR_WINDOWTEXT); pmyListCtrl->SetTextColor(crTextColor); ASSERT(pmyListCtrl->GetTextColor() == crTextColor); Если, что-то другое то как предлагает ViGOur, |
Сообщ.
#4
,
|
|
|
IEZ, ты забыл сказать, что это для VC 7!
|
Сообщ.
#5
,
|
|
|
ViGOur, Конечно может ты и прав. Но меня все же терзают смутные сомнения о правильности твоих утверждений.
Но в крайнем случае Explorer, может воспользоваться аналогичными макросами, которые уж точно были в VC 6. А именно: Цитата ListView_SetBkColor Macro -------------------------------------------------------------------------------- Sets the background color of a list-view control. You can use this macro or send the LVM_SETBKCOLOR message explicitly. Syntax BOOL ListView_SetBkColor( HWND hwnd, COLORREF clrBk ); Parameters hwnd Handle to the list-view control. clrBk Background color to set or the CLR_NONE value for no background color. List-view controls with background colors redraw themselves significantly faster than those without background colors. Return Value Returns TRUE if successful, or FALSE otherwise. Цитата ListView_SetTextBkColor Macro -------------------------------------------------------------------------------- Sets the background color of text in a list-view control. You can use this macro or send the LVM_SETTEXTBKCOLOR message explicitly. Syntax BOOL ListView_SetTextBkColor( HWND hwnd, COLORREF clrText ); Parameters hwnd Handle to the list-view control. clrText New text background color. This can be CLR_NONE for no background color. Return Value Returns TRUE if successful, or FALSE otherwise. Цитата ListView_SetTextColor Macro -------------------------------------------------------------------------------- Sets the text color of a list-view control. You can use this macro or send the LVM_SETTEXTCOLOR message explicitly. Syntax BOOL ListView_SetTextColor( HWND hwnd, COLORREF clrText ); Parameters hwnd Handle to the list-view control. clrText New text color. Return Value Returns TRUE if successful, or FALSE otherwise. P.S. Хотя методы указанные в посте №3, по моему были в VS 6. |
Сообщ.
#6
,
|
|
|
Я уже как-то проверял эти методы!
Пытался перенести на VC 6 макросы и тд., все отрабатывало замечательно, но цветов не было. Вполне вероятно что дело конечно в кривых руках . Но помнится я в конце концов плюнул на эти методы и стал использовать NM_CUSTOMDRAW. p.s. Цитата Microsoft Windows CE 3.0 ListView_SetTextColor |
Сообщ.
#7
,
|
|
|
ViGOur, Я их так пользовал и все работало:
void CМойКласс::OnTextColor() { CColorDialog clrDlg; static COLORREF rgbResult; static COLORREF rgbCust; INT iReturn=0; memset(&rgbResult, '\0', sizeof(COLORREF)); rgbResult=RGB(0, 128, 192); memset(&rgbCust, '\0', sizeof(COLORREF)); clrDlg.m_cc.lStructSize=sizeof(clrDlg.m_cc); clrDlg.m_cc.rgbResult=rgbResult; clrDlg.m_cc.lpCustColors=&rgbCust; clrDlg.m_cc.Flags=CC_ENABLEHOOK | CC_FULLOPEN | CC_RGBINIT; if(clrDlg.DoModal()==IDOK) { memset(&rgbCust, '\0', sizeof(COLORREF)); rgbCust=clrDlg.GetColor(); m_wndListCtrl.SetTextColor(rgbCust); m_wndListCtrl.RedrawWindow(); } } void CМойКласс::OnBkColor() { CColorDialog clrDlg; static COLORREF rgbResult; static COLORREF rgbCust; INT iReturn=0; memset(&rgbResult, '\0', sizeof(COLORREF)); rgbResult=RGB(0, 128, 192); memset(&rgbCust, '\0', sizeof(COLORREF)); clrDlg.m_cc.lStructSize=sizeof(clrDlg.m_cc); clrDlg.m_cc.rgbResult=rgbResult; clrDlg.m_cc.lpCustColors=&rgbCust; clrDlg.m_cc.Flags=CC_ENABLEHOOK | CC_FULLOPEN | CC_RGBINIT; if(clrDlg.DoModal()==IDOK) { memset(&rgbCust, '\0', sizeof(COLORREF)); rgbCust=clrDlg.GetColor(); m_wndListCtrl.SetBkColor(rgbCust); m_wndListCtrl.SetTextBkColor(rgbCust); m_wndListCtrl.RedrawWindow(); } } Эти изменения выполняются из меню, вызывается цветовой диалог и там пользователь выбирает цвет текста и фона в зависимости от выбора пользователя. |
Сообщ.
#8
,
|
|
|
Вот держи контрол, который я сабклассил, там все ясно и понятно, есть метоод SetStripesColor, чтоб задать звет полосок фона листа...
Прикреплённый файлCtrls.rar (5.07 Кбайт, скачиваний: 168) |
Сообщ.
#9
,
|
|
|
ViGOur, IEZ, Metatron, спасибо за обсуждение и примеры, но вопрос был именно о цвете линий, которые рисуются стилем LVS_EX_GRIDLINES. С цветами бэкграунда и текста айтемов у меня проблем не было
|
Сообщ.
#10
,
|
|
|
Тогда OwnerDraw нужно делать для твоего CListXtrl...
|
Сообщ.
#11
,
|
|
|
С OWNERDRAW понятно: отменяем стиль LVS_EX_GRIDLINES и добросовестно обводим каждый subitem прямоугольником нужного цвета
|
Сообщ.
#12
,
|
|
|
Зачем же отменять стиль LVS_EX_GRIDLINES!?
Он тебе понадобится, а именно в методе перерисовки думаю должно быть что-то типа: DWORD dwStyle = GetExtendedStyle(); if(dwStyle & LVS_EX_GRIDLINES) { // Добросовестно обводим каждый item и(или) subitem прямоугольником нужного цвета } Да и как ты наверное заметил, сос стилем LVS_EX_GRIDLINES, сетка рисуется и для тех итемов, которых еще нет. А именно для всей видимой области... |
Сообщ.
#13
,
|
|
|
Всем привет! Так что получилось поменять именно цвет линий? У меня они по умолчанию рисуются белым. Менять цвет фона на другой (не белый) цвет выглядит убого. Пишут переопределить CUSTOMDRAW, но я не знаю что именно там надо написать (
|