Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.106.100] |
|
Сообщ.
#1
,
|
|
|
Есть некоторая таблица m_IDC_LIST1 типа CListCtrl. Как вставить рисунок в клетку этой таблицы?
Я понимаю, что надо создать класс-потомок от CListCtrl, но как это сделать? |
Сообщ.
#2
,
|
|
|
class CMainList : public CMFCListCtrl
|
Сообщ.
#3
,
|
|
|
Как узнать номер текущей строки таблицы в методе CMyListCtrl::OnPaint?
|
Сообщ.
#4
,
|
|
|
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct); typedef struct tagDRAWITEMSTRUCT { UINT CtlType; UINT CtlID; UINT itemID; UINT itemAction; UINT itemState; HWND hwndItem; HDC hDC; RECT rcItem; ULONG_PTR itemData; } DRAWITEMSTRUCT, NEAR *PDRAWITEMSTRUCT, FAR *LPDRAWITEMSTRUCT; Цитата По умолчанию эта функция члена не выполняет никаких действий. Переопределите эту функцию-член, чтобы реализовать Рисование для объекта, рисуемого владельцем CListCtrl . https://docs.microsoft.com/ru-ru/cpp/mfc/re...s-2019#drawitem |
Сообщ.
#5
,
|
|
|
Я использовал сообщение WM_NOTIFY_REFLECT и функцию CListCtrl::OnCustomDraw .
Вот код: void CMyListCtrl::PreSubclassWindow() { pBrush = new CBrush(RGB(128,128,128)); LOGFONT lf; memset(&lf.0,sizeof(LOGFONT)); lf.lfHeight = 10; lf.lfWidth = 6; lf.lfWeight = FW_NORMAL; wcscpy(lf.lfFaceName,L"MS Sans Serif"); m_MyFont.CreateFontIndirect(&lf); CListCtrl::PreSubclassWindow(); } void CMyListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult) { int i, n; CRect rect, rect2, rect3; cellinfo mycellinfo; CString myString; NMLVCUSTOMDRAW* pLVCustomDraw = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR); NMCUSTOMDRAW pLV = (NMCUSTOMDRAW)pLVCustomDraw->nmcd; *pResult = CDRF_DODEFAULT; switch (pLVCustomDraw->nmcd.dwDrawStage) { case CDDS_PREPAINT: *pResult |= CDRF_NOTIFYITEMDRAW; break; case ITEMPREPAINT: SelectObject(pLVCustomDraw->nmcd.hdc,m_MyFont); if (typeofdraw==1) { n = pLVCustomDraw->nmcd.dwItemSpec; myStringm = GetItemText(n,0); if (myString!=L"") { GetSubItemRect(n,0,LVIR_LABEL,rect3); SetItemText(n,0,L""); GetDC()->TextOut(rect3.left+3,rect3.top+1,myString); } if (i=1;i<25;i++) { myString = GetItemText(n,i); if (myString!=L"") { GetSubItemRect(n,i,LVIR_LABEL,rect3); GetDC()->TextOut(rect3.left+3,rect3.top+1,myString); } GetSubItemRect(n,i,LVIR_BOUNDS,rect); mycellinfo = (cellinfo)(cellattributes.at(n*25+i)); if (mycellinfo.cellstate==1) { rect2.top = rect.top + 2; rect2.bottom = rect.bottom + 2; rect2.left = rect.left + mycellinfo.beginpos; rect2.right = rect.right; GetDC()->FillRect(&rect2,pBrush); } if (mycellinfo.cellstate==2) { rect2.top = rect.top + 2; rect2.left = rect.left; rect2.right = rect.right; rect2.bottom = rect.bottom + 2; GetDC()->FillRect(&rect2,pBrush); } if (mycellinfo.cellstate==3) { rect2.top = rect.top + 2; rect2.bottom = rect.bottom + 2; rect2.left = rect.left; rect2.right = rect.left + mycellinfo.endpos; GetDC()->FillRect(&rect2,pBrush); } if (mycellinfo.cellstate==4) { rect2.top = rect.top + 2; rect2.bottom = rect.bottom + 2; rect2.left = rect.left + mycellinfo.beginpos; rect2.right = rect.left + mycellinfo.endpos; GetDC()->FillRect(&rect2,pBrush); } } } break; } } Строки с закрашиваемыми зонами и с текстом отображаются. Но есть одена проблема: при прокрутке вертикального скроллбара таблицы вниз, а потом вверх не отображается содержимое (текстовое) самого первого (т.е. нулевого) столбца таблицы у первых строк таблицы, которые отображались нормально перед первоначальной прокруткой таблицы вниз. В чём причина этого? Как сделать так, чтобы при возвращения вертикального скроллбара таблицы к её первым строкам содержимое этих первых строк, в том числе текстовое содержимое их нулевого столбца нормально отображалось? |