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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2019, 10:02   #1
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию Текст в клетках таблицы не отображается по центру

Я разрабатываю проект в среде MS Visual Studio 2012, в юникодовской кодировке.

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

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

Код:

Код:
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();
}
erslgoeirjh вне форума Ответить с цитированием
Старый 07.03.2019, 10:19   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
Как сделать так, чтобы текст в клетках выводился посередине,
Рисовать в нужном месте.
Размер текста можно получить с помощью GetTextExtentPoint32()

Цитата:
Сообщение от erslgoeirjh Посмотреть сообщение
без всяких посторонних символов
Убрать посторонние символы из строки.
waleri вне форума Ответить с цитированием
Старый 07.03.2019, 11:05   #3
erslgoeirjh
Форумчанин
 
Регистрация: 19.05.2009
Сообщений: 153
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Рисовать в нужном месте.
Размер текста можно получить с помощью GetTextExtentPoint32()
То есть нужно изменить координаты в textRect?
erslgoeirjh вне форума Ответить с цитированием
Старый 07.03.2019, 12:48   #4
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Надо изменить первые два аргументa у ExtTextOut
waleri вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать текст в консоли по центру C# Vavavava Помощь студентам 1 01.07.2018 21:51
как в мемо выровнять текст по центру Fahman Компоненты Delphi 2 11.01.2017 16:55
combobox текст по центру tarakan1983 Компоненты Delphi 11 18.10.2014 10:10
Тег SELECT - выровнять текст по центру (IE) Linel HTML и CSS 0 17.02.2011 13:35
Не могу сделать текст по центру pahanzona Общие вопросы Delphi 3 05.02.2011 12:37