На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> Как вставить рисунок в клетку таблицы (CListCtrl)?
    Есть некоторая таблица m_IDC_LIST1 типа CListCtrl. Как вставить рисунок в клетку этой таблицы?
    Я понимаю, что надо создать класс-потомок от CListCtrl, но как это сделать?
      class CMainList : public CMFCListCtrl
        Как узнать номер текущей строки таблицы в методе CMyListCtrl::OnPaint?
          ExpandedWrap disabled
            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
            Я использовал сообщение WM_NOTIFY_REFLECT и функцию CListCtrl::OnCustomDraw .
            Вот код:

            ExpandedWrap disabled
              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;
                  }
              }


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


            Рейтинг@Mail.ru
            [ Script execution time: 0,0254 ]   [ 16 queries used ]   [ Generated: 18.04.24, 07:39 GMT ]