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

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

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

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

Кто виноват, что делать?
код в студию
...
Рейтинг: 0 / 0
09.03.2006, 16:22
    #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
09.03.2006, 19:08
    #33590952
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рисование текста под наклоном
Оказывается, под Windows 98 этого эффекта нет (у меня 2000).
Под XP есть.
...
Рейтинг: 0 / 0
10.03.2006, 14:38
    #33592867
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рисование текста под наклоном
под Visual Studio 6.0

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

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

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

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

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

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

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

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

В любом случае спасибо за внимание.
...
Рейтинг: 0 / 0
10.03.2006, 17:12
    #33593519
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рисование текста под наклоном
попробуй лучше не TextOut, а DrawText
...
Рейтинг: 0 / 0
10.03.2006, 17:46
    #33593629
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рисование текста под наклоном
Cerebrumпопробуй лучше не TextOut, а DrawText
Не лучше:
The DrawText function supports only fonts whose escapement and orientation are both zero. (MSDN)
...
Рейтинг: 0 / 0
10.03.2006, 18:07
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Рисование текста под наклоном / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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