powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Рисование текста под наклоном
10 сообщений из 10, страница 1 из 1
Рисование текста под наклоном
    #33590314
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рисую текст функцией TextOut(). Когда угол наклона (надписи и символов) равен нулю, получаю один результат. Как только угол становится ненулевым (хотя бы 1 десятая градуса), а все остальные параметры остаются прежними, надпись "проваливается" вниз (см. приложенный рисунок, горизонтальная надпись красная).

Такое впечатление, что для горизонтальной надписи учитываются под/над символьные элементы, а для наклонной нет.

Кто виноват, что делать?
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33590340
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой ВэйРисую текст функцией TextOut(). Когда угол наклона (надписи и символов) равен нулю, получаю один результат. Как только угол становится ненулевым (хотя бы 1 десятая градуса), а все остальные параметры остаются прежними, надпись "проваливается" вниз (см. приложенный рисунок, горизонтальная надпись красная).

Такое впечатление, что для горизонтальной надписи учитываются под/над символьные элементы, а для наклонной нет.

Кто виноват, что делать?
код в студию
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33590412
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если просто кусок кода, то пожалуйста (некоторые переменные заменены на значения):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
LOGFONT lf;
memset(&lf, 0 ,sizeof(lf));
lf.lfHeight = - 131 ;
lf.lfWidth  =   158 ;
lf.lfWeight = FW_NORMAL;
lf.lfClipPrecision |= CLIP_LH_ANGLES;
lstrcpy(lf.lfFaceName,"Courier New");

CFont hFont,hFont1;
lf.lfEscapement = lf.lfOrientation =  0 ;
if(!hFont.CreateFontIndirect(&lf))
    return;
CFont* hold = pDC->SelectObject(&hFont);
pDC->SetTextColor( 255 );
pDC->TextOut(x,y,text); //горизонтальная надпись

lf.lfEscapement = lf.lfOrientation = - 1 ;
if(!hFont1.CreateFontIndirect(&lf))
    return;

pDC->SelectObject(&hFont1);
hFont.DeleteObject();

pDC->SetTextColor(RGB( 0 , 0 , 255 ));
pDC->TextOut(x,y,text); //наклонная надпись

pDC->SelectObject(hold);
hFont1->DeleteObject();

А если работающий проект, то тоже можно сделать.
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33590952
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается, под Windows 98 этого эффекта нет (у меня 2000).
Под XP есть.
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33592867
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
под Visual Studio 6.0

проще уже некуда, см. CTextOutView::OnDraw(), TextOutView.cpp.

или это глюк GDI (NT only), или мой

Неужели неинтересно?
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33593236
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой Вэйили это глюк GDI (NT only), или мой

Неужели неинтересно?

Интересно, конечно. Но, наверное,мало кто это использовал.

Могу только предположить: может в 2000 и XP используется какая-нибудь реперная точка, вокруг которой крутится изображение? Ну, там начальный пиксел надо будет установить в центр надписи (например как при ломаных рисовании линий). И, допустим, эта точка используется в 98-м только для линий, а в более новых версиях учитывается еще и для надписей.

Попробуй покапать в этом направлении
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33593447
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akh
Попробуй покопать в этом направлении
С удовольствием, но задай хоть какую-нибудь реперную точку :)
Где она указывается при рисовании линий? (имя хоть какой-нибудь функции, например)

Вообще-то точка, вокруг которой вращается надпись, согласно документации задаётся функцией SetTextAlign, и это как правило один из углов надписи (а никак не произвольная точка).

В любом случае спасибо за внимание.
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33593519
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй лучше не TextOut, а DrawText
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33593629
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cerebrumпопробуй лучше не TextOut, а DrawText
Не лучше:
The DrawText function supports only fonts whose escapement and orientation are both zero. (MSDN)
...
Рейтинг: 0 / 0
Рисование текста под наклоном
    #33593675
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя не совсем понятно, в чём заключается это "supports only". Клипует она точно без учёта поворота, а рисовать вроде может.

Получился такой рисунок (красный это TextOut без поворота, синий — TextOut с поворотом, зелёный — DrawText с поворотом):

DrawText вызывал два раза, с вычислением размеров рамки и без:
UINT nFormat = DT_SINGLELINE | DT_CENTER | DT_VCENTER | DT_NOCLIP;
pDC->DrawText(text,&rect,nFormat | DT_CALCRECT);
pDC->DrawText(text,&rect,nFormat);

Т.е. DrawText лучше :)


Нашёл похожий вопрос на другом форуме, ответов тоже нет:
http://www.rsdn.ru/Forum/?mid=837041
Там автор обращает внимание, что проблема только со шрифтами OpenType, не просто TrueType. У меня это наблюдение не подтверждается.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Рисование текста под наклоном
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]