Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вставить рисунок в клетку таблицы (CListCtrl)? 
:(
    Опции темы
erslgoeirjh
Дата 10.9.2020, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Есть некоторая таблица m_IDC_LIST1 типа CListCtrl. Как вставить рисунок в клетку этой таблицы?
Я понимаю, что надо создать класс-потомок от CListCtrl, но как это сделать?

PM MAIL   Вверх
vol4ek
Дата 13.9.2020, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


конь в пальто
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 1.5.2011
Где: Минск

Репутация: -1
Всего: 0



Код

CImageList imgl;
imgl.Create(16,16,ILC_COLOR32,0,1);
imgl.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME));
m_list.SetImageList(&imgl,LVSIL_SMALL);


посмотрите класс CImageList
PM MAIL ICQ   Вверх
erslgoeirjh
Дата 6.10.2020, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 145
Регистрация: 16.12.2005

Репутация: нет
Всего: нет



Я использовал сообщение 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;
    }
}



Строки с закрашиваемыми зонами и с текстом отображаются.
Но есть одна проблема: при прокрутке вертикального скроллбара таблицы вниз, а потом вверх не отображается содержимое (текстовое) самого первого (т.е. нулевого) столбца таблицы у первых строк таблицы, которые отображались нормально перед первоначальной прокруткой таблицы вниз. В чём причина этого? Как сделать так, чтобы при возвращения вертикального скроллбара таблицы к её первым строкам содержимое этих первых строк, в том числе текстовое содержимое их нулевого столбца нормально отображалось?
 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.1149 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.