Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 10.09.20 08:47
Оценка:
Есть некоторая таблица m_IDC_LIST1 типа CListCtrl. Как вставить рисунок в клетку этой таблицы?
Я понимаю, что надо создать класс-потомок от CListCtrl, но как это сделать?
1613 г. = 2024 г.
Re: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: Homunculus Россия  
Дата: 10.09.20 08:58
Оценка:
Здравствуйте, RussianFellow, Вы писали:












Не стыдно, а? Один контрол четыре года изучать.
Re: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RonWilson Россия  
Дата: 10.09.20 09:04
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Есть некоторая таблица m_IDC_LIST1 типа CListCtrl. Как вставить рисунок в клетку этой таблицы?

ответ от 1999г
RF>Я понимаю, что надо создать класс-потомок от CListCtrl, но как это сделать?
нет.
Re[2]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RonWilson Россия  
Дата: 10.09.20 09:41
Оценка: :)
но всё же самый лучший вариант — это эмбедить Internet Explorer в нужные ячиейки и в нем открывать страничку с картинкой типа <html><body><img src="file:///c:/Мои документы/Мои картинки/Картинко.jpeg" alt="Нет картинко"/></body></html>

Пользователи оценят
Re[3]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 14.09.20 13:23
Оценка:
А можно ли задать для m_IDC_LIST1 стиль LVS_OWNERDRAWFIXED и обработать сообщение WM_DRAWITEM? Особенно в случае, когда изображение не загружается из файла, а рисуется в процессе выполнения программы?
1613 г. = 2024 г.
Re: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: The Minister Земля  
Дата: 14.09.20 13:28
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Есть некоторая таблица m_IDC_LIST1 типа CListCtrl. Как вставить рисунок в клетку этой таблицы?

RF>Я понимаю, что надо создать класс-потомок от CListCtrl, но как это сделать?

На codeproject.com и codeguru.com полно таких примеров.

Сам активно смотрел там исходники по MFC. Лет 15-20 назад.
Re[4]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RonWilson Россия  
Дата: 14.09.20 13:29
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>А можно ли задать для m_IDC_LIST1 стиль LVS_OWNERDRAWFIXED и обработать сообщение WM_DRAWITEM? Особенно в случае, когда изображение не загружается из файла, а рисуется в процессе выполнения программы?


лучше перехватывать WM_PAINT и с помощью GetPixel() искать границы ячейки и там рисовать
Re[5]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 14.09.20 13:51
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>Здравствуйте, RussianFellow, Вы писали:


RF>>А можно ли задать для m_IDC_LIST1 стиль LVS_OWNERDRAWFIXED и обработать сообщение WM_DRAWITEM? Особенно в случае, когда изображение не загружается из файла, а рисуется в процессе выполнения программы?


RW>лучше перехватывать WM_PAINT и с помощью GetPixel() искать границы ячейки и там рисовать


А WM_PAINT для какого компонента--для CListCtrl или для его родителя (то есть диалога или компонента, на котором помещён CListCtrl)?
1613 г. = 2024 г.
Re[6]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RonWilson Россия  
Дата: 14.09.20 13:57
Оценка: :)
Здравствуйте, RussianFellow, Вы писали:

RF>>>А можно ли задать для m_IDC_LIST1 стиль LVS_OWNERDRAWFIXED и обработать сообщение WM_DRAWITEM? Особенно в случае, когда изображение не загружается из файла, а рисуется в процессе выполнения программы?


RW>>лучше перехватывать WM_PAINT и с помощью GetPixel() искать границы ячейки и там рисовать


RF>А WM_PAINT для какого компонента--для CListCtrl или для его родителя (то есть диалога или компонента, на котором помещён CListCtrl)?


лучше для родителя IE, который вставлен в ячейку
Re[7]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 14.09.20 14:09
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>>>лучше перехватывать WM_PAINT и с помощью GetPixel() искать границы ячейки и там рисовать


RF>>А WM_PAINT для какого компонента--для CListCtrl или для его родителя (то есть диалога или компонента, на котором помещён CListCtrl)?


RW>лучше для родителя IE, который вставлен в ячейку


Ясно, понял.
1613 г. = 2024 г.
Re[5]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 29.09.20 08:42
Оценка:
Здравствуйте, RonWilson, Вы писали:

RW>лучше перехватывать WM_PAINT и с помощью GetPixel() искать границы ячейки и там рисовать


А как определить текущую строку таблицы в методе OnPaint ?
1613 г. = 2024 г.
Re[6]: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RonWilson Россия  
Дата: 29.09.20 08:49
Оценка: :)))
Здравствуйте, RussianFellow, Вы писали:

RF>Здравствуйте, RonWilson, Вы писали:


RW>>лучше перехватывать WM_PAINT и с помощью GetPixel() искать границы ячейки и там рисовать


RF>А как определить текущую строку таблицы в методе OnPaint ?


точно также: GetPixel-ом выбираем наиболее темный прямоугольник
Re: Как вставить рисунок в клетку таблицы (CListCtrl)?
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 05.10.20 14:04
Оценка:
Я использовал сообщение 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;
    }
}


Строки с закрашиваемыми зонами и с текстом отображаются.
Но есть одена проблема: при прокрутке вертикального скроллбара таблицы вниз, а потом вверх не отображается содержимое (текстовое) самого первого (т.е. нулевого) столбца таблицы у первых строк таблицы, которые отображались нормально перед первоначальной прокруткой таблицы вниз. В чём причина этого? Как сделать так, чтобы при возвращения вертикального скроллбара таблицы к её первым строкам содержимое этих первых строк, в том числе текстовое содержимое их нулевого столбца нормально отображалось?
1613 г. = 2024 г.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.