На главную Наши проекты:
Журнал   ·   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
  
> Как изменить шрифт при рисовании в клетках таблицы?
    Есть таблица IDC_LIST1, которой соответствует переменная m_IDC_LIST1 типа CMyListCtrl5 (который является потомком класса CListCtrl). В этой таблице я вывожу текст и рисую графику в клетках таблицы.
    Вот код:

    ExpandedWrap disabled
      class CMyListCtrl5 : public CListCtrlEx2
      {
      protected:
          void  OnPaint();
          void  PreSubclassWindow();
          CBrush *pBrush;
          CFont  m_MyFont;
          afx_msg void  OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);
          DECLARE_MESSAGE_MAP()
      public:
          CMyListCtrl5();
          int typeofdraw;
          int  cellwidth;
          std::vector<cellinfo>  cellattributes;
          std::vector<CString>  firstcolumntexts;
          void  setVisibilityZone(int countstr, long jtdate1, long double tjdate1, long jtdate2, long double tjdate2);
          void  insertRowOfCellInfo();
      };
       
      void  CMyListCtrl5::PreSubclassWindow()
      {
          CListCtrl::PreSubclassWindow();
          pBrush = new CBrush(RGB(128,128,128));
          LOGFONT  lf;
          memset(&lf,0,sizeof(LOGFONT));
          lf.lfHeight = 8;
          lf.lfWidth = 4;                                            
          lf.lfWeight = FW_NORMAL;
          wcscpy(lf.lfFaceName,L"MS Sans Serif");
          m_MyFont.CreateFontIndirect(&lf);
          SetFont(&m_MyFont);
      }
       
      void  CMyListCtrl5::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
      {
          int  i, n;
          CRect  rect, rect2, rect3, rect4;
          cellinfo  mycellinfo;
          LPCTSTR  pzText;
          CString  myString;
          CBrush *pBrush2;
       
          pBrush2 = new CBrush(RGB(255,255,255));
          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 CDDS_ITEMPREPAINT:
              {
              if (typeofdraw==1)
                  {
                  n = pLVCustomDraw->nmcd.dwItemSpec;
                  myString = (CString)(firstcolumntexts.at(n));
                  if (myString!=L"")
                  {
                  GetSubItemRect(n,0,LVIR_BOUNDS,rect);
                  GetSubItemRect(n,0,LVIR_LABEL,rect3);
                  GetDC()->TextOut(rect3.left+3,rect3.top-1,myString);
                  }
                  for (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-1;
                        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-1;
                        GetDC()->FillRect(&rect2,pBrush);
                  }
                  if (mycellinfo.cellstate==3)
                  // если конец зоны видимости
                  {
                        rect2.top = rect.top+2;
                        rect2.bottom = rect.bottom-1;
                        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-1;
                        rect2.left = rect.left + mycellinfo.beginpos;
                        rect2.right = rect.left + mycellinfo.endpos;
                        GetDC()->FillRect(&rect2,pBrush);
                  }
                  }
              }
              }
              break;
          }
      }


    В этом коде я создаю шрифт m_MyFont с определенными параметрами. Вся текстовая информация выводится в таблицу, вся графика рисуется в таблице, но шрифт для текста какой был по умолчанию, такой и остается. Как сделать так, чтобы текст в таблице выводился нужным мне шрифтом?
      MFC
      ExpandedWrap disabled
        BEGIN_MESSAGE_MAP(CMainList, CMFCListCtrl)
        ON_NOTIFY_REFLECT_EX(NM_CUSTOMDRAW, &CMainList::OnNMCustomdraw)
        END_MESSAGE_MAP()
         
        afx_msg BOOL CMainList::OnNMCustomdraw(NMHDR *pNMHDR, LRESULT *pResult)
        {
            LPNMLVCUSTOMDRAW lplvcd = reinterpret_cast<LPNMLVCUSTOMDRAW>(pNMHDR);
            int iRow = lplvcd->nmcd.dwItemSpec;
            int iCol = lplvcd->iSubItem;
         
         
                        if (fnt != nullptr)
                        {
                            SelectObject(lplvcd->nmcd.hdc, fnt->operator HANDLE());
                            *pResult = CDRF_NEWFONT;
                        } // if
         
         
        }
        Black Dragon, в приведённом Вами примере класс CMainList является потомком класса CMFCListCtrl.
        А нельзя ли сделать так, чтобы этот класс CMainList являлся бы потомком класса CListCtrl, а не CMFCListCtrl? (А то у меня вся программа "заточена" под класс CListCtrl).
          class CMFCListCtrl : public CListCtrl

          Добавляет управление заголовком...
          Сообщение отредактировано: Black_Dragon -
            Black Dragon, и еще вопрос: что означает переменная fnt в приведенном Вами коде? Это указатель на тип CFont ?
              erslgoeirjh
              да
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0271 ]   [ 16 queries used ]   [ Generated: 16.04.24, 18:21 GMT ]