Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.09.2020, 12:05   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Как вставить рисунок в клетку таблицы (CListCtrl)?

Есть некоторая таблица m_IDC_LIST1 типа CListCtrl. Как вставить рисунок в клетку этой таблицы?
Я понимаю, что надо создать класс-потомок от CListCtrl, но как это сделать?
erslgoeirjh вне форума Ответить с цитированием
Старый 21.09.2020, 11:01   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Нужно каждую клетку таблицы вручную отрисовывать, наверное.
BLACK_RAIN вне форума Ответить с цитированием
Старый 29.09.2020, 11:58   #3
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Как узнать номер текущей строки таблицы в методу CMyListCtrl::OnPaint?
erslgoeirjh вне форума Ответить с цитированием
Старый 29.09.2020, 12:33   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
Как узнать номер текущей строки таблицы в методу CMyListCtrl::OnPaint?
Никак.
Вам нужен CListCtrl::DrawItem
waleri вне форума Ответить с цитированием
Старый 29.09.2020, 16:12   #5
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

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

Есть же функция CListCtrl::GetSubItemRect, с помощью которой получается прямоугольник, соответствующий нужному субайтему (т.е. нужной клетки) в таблице. Неужели нельзя использовать функцию GetSubItemRect в функции CListCtrl::OnPaint ?
erslgoeirjh вне форума Ответить с цитированием
Старый 29.09.2020, 19:34   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
А через WM_PAINT разве нельзя это сделать
Можно, но надо будет рисовать все от и до самому.

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
Неужели нельзя использовать функцию GetSubItemRect в функции CListCtrl::OnPaint ?
Конечно можно. Ваш вопрос же не про это был.
waleri вне форума Ответить с цитированием
Старый 30.09.2020, 16:13   #7
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Никак.
Вам нужен CListCtrl::DrawItem
Я написал функцию DrawItem.
Как теперь её правильно прописать в карту сообщений (BEGIN_MESSAGE_MAP ... END_MESSAGE_MAP)?

Среда разработки у меня--Visual Studio 2012.
erslgoeirjh вне форума Ответить с цитированием
Старый 30.09.2020, 19:38   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

https://forums.codeguru.com/showthre...)-of-CListCtrl
waleri вне форума Ответить с цитированием
Старый 05.10.2020, 17:11   #9
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Я использовал сообщение 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;
    }
}
Строки с закрашиваемыми зонами и с текстом отображаются.
Но есть одена проблема: при прокрутке вертикального скроллбара таблицы вниз, а потом вверх не отображается содержимое (текстовое) самого первого (т.е. нулевого) столбца таблицы у первых строк таблицы, которые отображались нормально перед первоначальной прокруткой таблицы вниз. В чём причина этого? Как сделать так, чтобы при возвращения вертикального скроллбара таблицы к её первым строкам содержимое этих первых строк, в том числе текстовое содержимое их нулевого столбца нормально отображалось?
erslgoeirjh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вопрос про скроллирование таблицы (CListCtrl) по горизонтали erslgoeirjh Visual C++ 2 06.03.2020 13:42
Вставить рисунок из формы в приложение Виндовс Iskin Microsoft Office Access 5 17.02.2014 15:44
Как в Builder C++ вставить рисунок на форму C-Jay C++ Builder 3 03.05.2012 21:08
вставить рисунок в таблицу в зависимости от условия fateev_max Microsoft Office Excel 8 17.03.2010 20:30