Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вписать вертикальный текст в прямоугольник? "промахиваюсь" мимо границ 
:(
    Опции темы
Dreamer_0x01
Дата 4.6.2009, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Здравствуйте.

Пытаюсь вписать текст в прямоугольник.
Горизонтальный текст вписывается.
А вот вертикальный - не хочет. 
Причем. что интересно, если выравнивание по горизонтали ставлю DT_CENTER, то и по горизонтали не попадает.
Если ставлю DT_LEFT, то по горизонтали попадаю, а по вертикали - промахиваюсь на полпрямоугольника.

вот код:
Код

void CRecTextTestDlg::OnPaint()
{
        CPaintDC dc(this); // device context for painting
        char mytext[] = "Test text";
        dc.SetBkMode(TRANSPARENT);

        RECT rct;
        RECT r1,r2,r3;
        r1.left=0;
        r1.top=50;
        r1.bottom=75;
        r1.right=150;

        r2.left=200;
        r2.top=50;
        r2.bottom=200;
        r2.right=225;

        r3.left = r2.left + 50;
        r3.right = r2.right + 50;
        r3.top = r2.top;
        r3.bottom = r2.bottom;

        dc.Rectangle(&r1);
        dc.Rectangle(&r2);
        dc.Rectangle(&r3);

        CFont fnt,* oldfont;
        UINT mes_sz;

        //вписываем горизонтальный текст - тут проблем нет
        mes_sz = (r1.bottom-r1.top);
        fnt.CreateFont(mes_sz, 0, 0, 0, 0, 0, 0, 0, 
                                DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
                                CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
                                DEFAULT_PITCH | FF_DONTCARE, "Arial");
        oldfont = dc.SelectObject(&fnt);
        dc.DrawText(mytext,&r1,DT_CENTER|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
        dc.SelectObject(oldfont);
        fnt.DeleteObject();

        //а вот с вписыванием вертикального текста - проблемы с попаданием в прямоугольник
        //с такими параметрами вообще не попадаем
        mes_sz = (r2.right-r2.left);
        fnt.CreateFont(mes_sz, 0, 900, 0, 0, 0, 0, 0, 
                                DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
                                CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
                                DEFAULT_PITCH | FF_DONTCARE, "Arial");
        oldfont = dc.SelectObject(&fnt);
        dc.DrawText(mytext,&r2,DT_CENTER|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
        dc.SelectObject(oldfont);
        fnt.DeleteObject();

        //а с такими попадаем по горизонтали, но не попадаем по вертикали.
        mes_sz = (r3.right-r3.left);
        fnt.CreateFont(mes_sz, 0, 900, 0, 0, 0, 0, 0, 
                                DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
                                CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
                                DEFAULT_PITCH | FF_DONTCARE, "Arial");
        oldfont = dc.SelectObject(&fnt);
        dc.DrawText(mytext,&r3,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_VCENTER);
        dc.SelectObject(oldfont);
        fnt.DeleteObject();
        //когда выравнивание по горизонтали вместо CENTER сделали LEFT, то по горизонтали попадаем.
        //а по вертикали все равно не попадаем.
}


В результате получаю вот такую картинку:
user posted image

Это сообщение отредактировал(а) Dreamer_0x01 - 4.6.2009, 14:17


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
Andrey44
Дата 4.6.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 12
Всего: 26



Код

//а вот с вписыванием вертикального текста - проблемы с попаданием в прямоугольник
    //с такими параметрами вообще не попадаем
    mes_sz = (r2.right-r2.left);
    fnt.CreateFont(mes_sz, 0, 900, 0, 0, 0, 0, 0, 
        DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
        CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
        DEFAULT_PITCH | FF_DONTCARE, L"Arial");
    oldfont = dc.SelectObject(&fnt);
    dc.DrawText(mytext,&r2,DT_CENTER|DT_NOCLIP|DT_SINGLELINE|DT_BOTTOM);
    dc.SelectObject(oldfont);
    fnt.DeleteObject();
    //а с такими попадаем по горизонтали, но не попадаем по вертикали.
    mes_sz = (r3.right-r3.left);
    fnt.CreateFont(mes_sz, 0, 900, 0, 0, 0, 0, 0, 
        DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, 
        CLIP_DEFAULT_PRECIS, PROOF_QUALITY,
        DEFAULT_PITCH | FF_DONTCARE, L"Arial");
    oldfont = dc.SelectObject(&fnt);
    dc.DrawText(mytext,&r3,DT_LEFT|DT_NOCLIP|DT_SINGLELINE|DT_BOTTOM);
    dc.SelectObject(oldfont);
    fnt.DeleteObject();
    //когда выравнивание по горизонтали вместо CENTER сделали LEFT, то по горизонтали попадаем.
    //а по вертикали все равно не попадаем.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
Dreamer_0x01
Дата 4.6.2009, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Терминатор
**


Профиль
Группа: Участник
Сообщений: 780
Регистрация: 14.4.2005
Где: Санкт-Петербург

Репутация: 9
Всего: 12



Клево, получилось!

Но маленькое уточнение - сейчас стиль стоит DT_BOTTOM, но вертикально текст выровнен по центру.
А как сделать, чтобы текст рисовался от начала прямоугольника, то есть выравнивание было по нижнему краю? 


--------------------
Нет ничего невозможного. Есть цели, и есть время и силы на их достижение.
PM ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0414 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.