Автор
|
Тема: text resize
|
sudv |
опубликован 21-08-2001 15:32 MSK
Скажите каким образом можно масштабировать текст в окне? Этот код при изменении размера окна должен изменять размер содержимого. Если добавить графические объекты(линии,прямоугольники и т.д.), то они ресайзятся. А текст нет. Почему? case WM_SIZE: xClientView=LOWORD(lParam); yClientView=HIWORD(lParam); hdc=BeginPaint(hWnd,&ps); SetMapMode(hdc,MM_ISOTROPIC); SetWindowExtEx(hdc,500,500,NULL); SetViewportExtEx(hdc,xClientView,yClientView,NULL); SetViewportOrgEx(hdc,0,0,NULL); myFont=CreateFont(12,12,0,0,FW_NORMAL, TRUE,TRUE,FALSE, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, FF_DONTCARE, "Times New Roman"); oldFont=SelectObject(hdc,&myFont); TextOut(hdc,100,100,"ABCDE",5)); SelectObject(hdc,oldFont); DeleteObject(myFont); ValidateRect(hWnd,NULL); EndPaint(hWnd,&ps);
|
Kosha
|
опубликован 21-08-2001 15:39 MSK
Потому что делаешь вывод через TextOut. Эта функция по определению Resize не поддерживает (т.к. самая простая). Вроде было что-то похожее в DrawText, но я не уверен.В любом случае, у меня сильные сомнения, что Windows сможет заресайзить текст, у которого явно указан шрифт и размер этого шрифта... Попробуй подгонять шрифт. |
talex
|
опубликован 21-08-2001 15:49 MSK
по-моему и не получится, я думаю причина в том что буквы, это отдельные картинки, т.е. текст представляет собой их набор, а не одно целое, а т.к windows может менять масштаб отдельного куска изображ, то следовательно отдельные быквы не сможет, наверное придется соответственно изменениям менять font изображаемого текста. P.S.но я не уверен, может и есть способ, но он будет довольно таки сложным.... |
sudv
|
опубликован 21-08-2001 15:52 MSK
Я и не хочу чтобы текст ресайзился функцией TextOut. Вариант с подбором разного размера шрифтов не подходит. Кстати в тексте программы надо добавить break; сase WM_PAINT: перед hdc=BeginPaint(hWnd,&ps); |
Kosha
|
опубликован 22-08-2001 02:23 MSK
Хорошо. Ну как хочешь:Делаешь memory DC (например, через CreateCompatibleDC) размера, в который выводит TextOut. Потом делаешь BitBlt на сам экран с ресайзом по нужному RECT'у. (почитай MSDыN) Но качество будет - <beep>... Лучше выводить, например, шрифтом эдак 70-80, потом ресайзить поменьше. Качество все равно <beep>, но уже лучше. Только блиттинг с таких больших memDC тормозить будет (20-30fps) Можешь использовать DirectX - тормозить не будет, можно для повышения качества использовать Antialising... А ЕЩЕ ЛУЧШЕ - не <eBEEp> мозги и возьми какой-нить контрол, который все это делает. ЗЫ: Почитал MSDN, чего-то не нашел даже намека на то, что текст можно ресайзить. Просвети глупого, где ты это нарыл? |
sudv
|
опубликован 22-08-2001 05:34 MSK
Нашел! Шрифт должен выбираться этой строкой: oldFont=SelectObject(hdc,myFont); Сообщение об ошибке не выдавалось и мой шрифт не выбирался и винды писали в окне своим системным шрифтом, который не ресайзится. А теперь все ОК! Мне это нужно для печати и предварительного просмотра отчетов. Кстати изменение размеров происходит за счет вот этих строк:SetMapMode(hdc,MM_ISOTROPIC); SetWindowExtEx(hdc,400,400,NULL); SetViewportExtEx(hdc,xClientView,yClientView,NULL); Все просто. Масштаб зависит от соотношения величин в третьей и второй строке.
|