|
|
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Вот такой вопрос. Как правильно рассчитать прямоугольник для DrawText? = DrawText (PrinterHDC, lcText, Len(lcText), @lcRect, DT_WORDBREAK) = DrawText ( 0 , lcText, Len(lcText), @lcRect, DT_WORDBREAK) На екране получается одно, а на принтере совсем другое. Т.е. в одном случае в строку попадает например 5 слов, а в другом 4. Пробовал искать какие-то коефициенты с GetDeviceCaps, но ничего хорошего не получилось. На одном из форумов по API мне ответили: Используя флаг DT_CALCRECT сделать сначала DrawText в DC своего окна, потом в DC принтера. Имея два RECT можно посчитать пропорции. Но как, я так и не понял :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.08.2003, 11:34 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Если надо, вот код проги которая печатает текст на екран и на принтер: Код: 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. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. но результат на екране и на бумаге почемуто не совпадает :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 11:33 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Я могу ошибаться, поскольку в API - не силен, но здесь явная проблема в единицах измерения. В каких единицах измерения задаются координаты в lcRect ? Если это пикселы или логические дюймы (логические санитиметры), то требуются специальные переводные коэффициенты, чтобы привести в соответсвие координаты экрана и координаты принтера. Это можно сделать через функцию GetDeviceCaps() для экрана и принтера соответственно. Если же это твипы (twip), то проблема где-то в другом месте :) поскольку как раз-таки твипы не зависят от настроек устройства (для чего собственно и были введены) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 12:26 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Там используються пикселы. Если в екрана 96 dpi, а в принтера 300 dpi я пробовал умножать эти координаты на INT(300/96), но прямоугольники всё ровно не идентичны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 13:40 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Нет. Перевод не такой простой. Размер пиксела зависит от текущей настройки соответсвующего устройства. Универсальной единицей измерения является твип (twip). Т.е. тебе надо перевести экранные пискелы в твипы, а потом из твипов в принтерные пикселы. Перевод экранных пикселов в твипы делается так: DECLARE INTEGER GetActiveWindow IN WIN32API DECLARE INTEGER GetDC IN WIN32API INTEGER iHDC DECLARE INTEGER GetDeviceCaps IN WIN32API INTEGER iHDC, INTEGER iIndex LOCAL liHDC liHDC = GetDC(GetActiveWindow()) LOCAL lnTwipX, lnTwipY lnTwipX = 1440/GetDeviceCaps(m.liHDC,88) lnTwipY = 1440/GetDeviceCaps(m.liHDC,90) * Освобождение контекста устройства, для освобождения памяти DECLARE INTEGER ReleaseDC IN WIN32API INTEGER, INTEGER =ReleaseDC(GetActiveWindow(),m.liHDC) Т.е. размер в твипах на экране это (размер в пикселах по Х) * m.lnTwipX (размер в пикселах по Y) * m.lnTwipY Аналогичный перерасчет необходимо сделать для принтера. Правда как взять контекст принтера я не знаю :( Чтобы относительные размеры были равны соответсвующие координаты в твипах должны быть равны как у экрана так и у принтера. Думаю, тут уже легко получишь переводной коэффициент. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 13:49 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Функция GetDeviceCaps(HDC,88) для екрана взвращает 96, а для принтера 300. Так что переводным коефициентом для екрана может быть 96, а для принтера 300; тогда еденица измерения будет дюйм. Но все равно, даже с теми коефициентами есть неточности :(\r \r 2ВладимирМ \r ...как взять контекст принтера... \r \r Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. \r P.S. Посмотрите, Владимир, сюда :)\r Ведь все же можно, осталось добится, чтоб работало корректно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 15:34 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Ну, то что я написал раньше в данном случае неуместно. Печать через @Say определяет координаты в так называемых "фокселах". 1 фоксел - это средний размер одного символа в текущем шрифте. В принципе, я уже сталкивался с тем, что разные драйверы принтера под один символ отводят разный размер (при печати через REPORT FORM). Разница заключалась буквально в одной...двух точках, но этого хватало, чтобы отчет "поплыл". С чем это связано я не стал выяснять, просто делал размер по ширине несколько избыточным (буквально на пол-символа). Может и тебе имеет смысл делать перевод по типу: X*300/96+k Где k - это и есть небольшая поправка А кстати, почему не использовать стандартный генератор отчетов? Не обязательно FoxPro, мало ли других генераторов. Там эта проблема должна быть решена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 15:57 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Ну генератор отчётов я уже сделал свой. Задача моя заключалася в том, чтоб заполнять готовые бланки документов. Текст я вводил (или читал с dbf) в Edit'ы, которыt потом переганял в мой репорт. И тут таже проблемма (kX+k). Для некоторых шрифтов как нибуть подбирал k, а для не которых.... Вобщем желательно было перед печатью нажать кнопочку "Предварительный просмотр", чтобы убидится всё ли совпалает. А с DrawText то, что в Edit'е и что вывел этой функцией совпадает. Т.е. экран -> экран - всё нормально, экран -> принтер - не очень. Поэтому и хочу переделать эту программку через DrawText, чтоб не использовать репортов (остаеться же это k), а на прямую печатать на принтер. И что означает Используя флаг DT_CALCRECT сделать сначала DrawText в DC своего окна, потом в DC принтера. Имея два RECT можно посчитать пропорции. Как его использовать? Может так удастся найти это k... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 16:26 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Как предположение. Не знаю, насколько правильное. Вероятно, при использовании DT_CALCRECT происходит расчет размеров прямоугольника с поправкой значений в lcRect . Вот на это и намекали - делаешь 2 расчета и смотришь какие стали значение в lcRect . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 16:36 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
Да, пробовал посмотреть, что сидит в lcRect но в VFP это не так уж легко сделать. Не получилось :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 16:44 |
|
||
|
WinAPI DrawText
|
|||
|---|---|---|---|
|
#18+
А в чем проблема-то. У тебя же есть функция формирования lcRect. Сделать все то же самое в обратном порядке лично мне не представляется особо сложным. У тебя же стоит символ @. Т.е. значение lcRect передается по ссылке, значит после выполнения она уже содержит измененное значение надо его только "развернуть". На сегодня все, сейчас у нас сеть отрубят. Опасаются субботних вирусов :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.08.2003, 16:53 |
|
||
|
|

start [/forum/topic.php?fid=41&fpage=416&tid=1598037]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 380ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...