На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania 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
  
> Текст в клетках таблицы не отображается по центру
    Я разрабатываю проект в среде MS Visual Studio 2012, в юникодовской кодировке.

    В моей таблице (потомок класса CListCtrl) в методе OnPaint я осуществляю прорисовку линий и вывод текста в её клетки. Вывод текста я пробую осуществить двумя вариантами--либо с помощью функции CDC::ExtTextOut, либо с помощью функции ::DrawText. В первом случае, при использовании функции CDC::ExtTextOut, у меня текст выводится нормально, без посторонних символов, но по левому краю клеток. Во втором случае, при использовании функции ::DrawText, текст выводится посередине клеток, но помимо моего текста выводятся также ещё какие-то непонятные символы.

    Как сделать так, чтобы текст в клетках выводился посередине, но нормально, без всяких посторонних символов?
    Может быть, мне следует изменить используемый шрифт MS Sans Serif на какой-то другой? Или же мне как-то по-другому надо использовать функцию SelectObject?

    Код:

    ExpandedWrap disabled
      void CListCtrlEx2::OnPaint()
      {
          int  i, j, n, m, nItem, topIndex, nTextLen;
          CString  myText;
          RECT  rect, textRect;
          UINT  nOptions = 0;
          LOGFONT  mylf;
          LPCWSTR  pzText;
       
          const MSG *msg = GetCurrentMessage();
          DefWindowProc(msg->message,msg->wParam,msg->lParam);
          if ((GetStyle() & LVS_TYPEMASK)==LVS_REPORT)
          {
              CClientDC  dc(this);
              dc.SetDCBrushColor(RGB(255,0,0));
              CBrush *pBrush = dc.GetCurrentBrush();
              CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
              int  nColumnCount = pHeader->GetItemCount();
              HDC  hDC = dc.m_hDC;
              nOptions |= ETO_OPAQUE;
              CFont *pFont = dc.GetCurrentFont();
              pFont->GetLogFont(&mylf);
              memset(&mylf,0.0,sizeof(mylf));
              mylf.lfHeight = 12;
              mylf.lfWidth = 6;
              mylf.lfWeight = FW_NORMAL;
              wcscpy(mylf.lfFaceName,L"MS Sans Serif");
              CFont *pFont2 = new CFont();
              pFont2->CreateFontIndirectW(&mylf);
              RECT  rect;
              pHeader->GetClientRect(&rect);
              int  top = rect.bottom;
              GetClientRect(&rect);
              int  borderx = 0 - GetScrollPos(SB_HORZ);
              for (int i=0; i<nColumnCount; i++)
              {
                  borderx += GetColumnWidth(i);
                  if (borderx>=rect.right)  break;
                  dc.MoveTo(borderx-1,top);
                  dc.LineTo(borderx-1,rect.bottom);
              }
              if (!GetItemRect(0,&rect,LVIR_BOUNDS))
                  return;
              int  height = rect.bottom - rect.top;
              GetClientRect(&rect);
              int  width = rect.right;
              m = flagsVector.size();
              if (m==0)
              {
                  for (int i=1; i<=GetCountPerPage();i++)
                  {
                      dc.MoveTo(0,top+height*i);
                      dc.LineTo(width,top+height*i);
                  }
              }
              else
              {
                  topIndex = GetTopIndex();
                  for (int i=1; i<=GetCountPerPage();i++)
                  {
                      if ((topIndex+i)<=m)
                      {
                          if ((int)(flagsVector.at(topIndex+i-1))==1)
                          {
                              dc.MoveTo(0,top+height*i);
                              dc.LineTo(width,top+height*i);
                          }
                          borderx = 0 - GetScrollPos(SB_HORZ);
                          dc.SelectObject(pFont2);
                          for (j=0; j<nColumnCount; j++)
                          {
                              myText = GetItemText(topIndex+i-1,j);
                              nTextLen = myText.GetLength();
                              pzText = myText.GetBuffer();
                              textRect.top = top + height*(i-1)+1;
                              textRect.left = borderx+1;
                              textRect.bottom = top + height*i-1;
                              textRect.right  = borderx + GetColumnWidth(j)-1;
                              CRect  tmpRect(textRect);
                              dc.ExtTextOut(textRect.left,textRect.top,nOptions,&textRect,myText,nTextLen,NULL); // текст выводится нормально, но не по центру
                              //::DrawTextW(hDC,myText,nTextLen,&textRect,DT_CENTER); // текст выводится по центру, но выводятся также посторонние символы
                              borderx += GetColumnWidth(j);
                          }
                          dc.SelectObject(pBrush);
                      }
                      else
                      {
                          dc.MoveTo(0,top+height*i);
                          dc.LineTo(width,top+height*i);
                      }
                  }
              }
          }
          //CListCtrl::OnPaint();
      }
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script Execution time: 0,0806 ]   [ 18 queries used ]   [ Generated: 22.07.19, 18:29 GMT ]