Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: DrawTextEx  (Прочитано 14520 раз)
0 Пользователей и 4 Гостей смотрят эту тему.
AlexCasual
Помогающий

by
Offline Offline

« : 06-12-2011 18:30 » 

Вызываю функцию DrawTextEx() последовательно два раза с идентичным набором параметров,в первом случае возвращается значение 0x29(высота текста в логических единицах),а во втором 0х10(высота текста в логических единицах)...Почему так,в чём может быть проблема?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 06-12-2011 18:43 » 

AlexCasual, А код вызовов можно посмотреть?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
AlexCasual
Помогающий

by
Offline Offline

« Ответ #2 : 07-12-2011 12:34 » 

в общем я совсем запутался...

Код:

bool v = ::StretchBlt(hCompatibleDC,0,0,GetDeviceCaps(hCompatibleDC, HORZRES),GetDeviceCaps(hCompatibleDC, VERTRES),
hPrinteDC,0,0,GetDeviceCaps(hPrinteDC, HORZRES),GetDeviceCaps(hPrinteDC, VERTRES)/,SRCCOPY);

DWORD error = GetLastError();

То есть пытаюсь контекст принтера скопировать.GetLastError() возвращает 0х8 (ERROR_NOT_ENOUGH_MEMORY)...

Как вообще можно сохранить контекст принтера в файл,например,bmp?
Записан
zubr
Гость
« Ответ #3 : 07-12-2011 12:53 » 

А какой размер ты выделил под размер битмапа?
Записан
AlexCasual
Помогающий

by
Offline Offline

« Ответ #4 : 08-12-2011 13:04 » 

zubr :

Код:
hBitMap = ::CreateCompatibleBitmap(hDC, GetDeviceCaps(hPrinteDC, HORZRES), GetDeviceCaps(hPrinteDC, VERTRES));

И вот такой ещё вопрос  - с каким по умолчанию цветом фона создаётся контекст DC?У меня получется чёрный фон :
Код:
hDC  = ::CreateDCA("DISPLAY",NULL,NULL,NULL);
И потом я никак не могу изменить его :

Код:
::SetBkColor(hDC ,RGB(255,255,255));
- отрабатывает без ошибок,но фон не меняется,так же и

Код:
::FillRect(hDC,&rct,(HBRUSH) (COLOR_WINDOW+1));
-отрабатывает без ошибок,но фон остаётся по-прежнему чёрным...
Записан
zubr
Гость
« Ответ #5 : 08-12-2011 13:48 » 

Цитата
Код:
hBitMap = ::CreateCompatibleBitmap(hDC, GetDeviceCaps(hPrinteDC, HORZRES), GetDeviceCaps(hPrinteDC, VERTRES));
Ну и теперь прикинь, если, к примеру, у принтера разрешение 600 x 300 DPI, то это грубо говоря для формата A4 если преобразовать в пиксели будет разрешение 50000 x 35000. Итого около 7 гиг памяти потребуется (для 32-битного DIB). На твоем компе есть столько памяти?
Записан
AlexCasual
Помогающий

by
Offline Offline

« Ответ #6 : 08-12-2011 17:40 » 

zubr,смысл понятен...
А можешь направить на верную мысль по поводу цвета фона для DC?
Записан
zubr
Гость
« Ответ #7 : 08-12-2011 18:29 » new

AlexCasual, покажи более полный код твоих манипуляций с контекстом устройства.
Записан
AlexCasual
Помогающий

by
Offline Offline

« Ответ #8 : 21-01-2012 14:38 » 

zubr, подскажи пожалуйста,как можно конвертировать глифы в unicode?
На входе функции ExtTextOut у меня вместо строки массив глифов приходит...
Записан
zubr
Гость
« Ответ #9 : 21-01-2012 15:21 » 

Ну собственно все просто:
1. В функцию GetCharacterPlacement  в качестве контекста устройства подставляем hdc функции ExtTextOut, в качестве строки подставляем массив символов от 0 до 255
2. Результатом выполнения указанной функции (нас интересуют только глифы) получаем массив глифов, соответствующих этим символам.
3. Сопоставляем глифы символам - получаем строку символов.
Записан
AlexCasual
Помогающий

by
Offline Offline

« Ответ #10 : 21-01-2012 17:21 » 

zubr, то есть необходимо вручную получить массив глифов и сопоставить их с символами?
Да,а почему символы от 0-255,ведь могут быть и русские буквы и ещё куча спец.символов.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #11 : 21-01-2012 17:36 » 

AlexCasual, Это смотря в какой кодировке Улыбаюсь Если функция воспринимает UTF16 Тогда твое замечание верно. Если только ASCII то не верно.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
AlexCasual
Помогающий

by
Offline Offline

« Ответ #12 : 21-01-2012 17:49 » 

Я вот просто думаю как автоматизировать данный процесс,не вызывая каждый раз в функции ExtTextOut GetCharacterPlacement...
И получается,что на каждый глиф придётся производить определение соответствующего символа,а это жутко долго для больших объёмов текста...
« Последнее редактирование: 21-01-2012 17:51 от AlexCasual » Записан
zubr
Гость
« Ответ #13 : 21-01-2012 18:19 » 

AlexCasual, естественно я указал таблицу под ASCII. Но, насколько я помню, этого было вполне достаточно для корректного перехвата печати во всех возможных броузерах, офисных документах, пдфниках и т. п. для русских и английских текстов, для других языков не тестировал.
Цитата
Я вот просто думаю как автоматизировать данный процесс,не вызывая каждый раз в функции ExtTextOut GetCharacterPlacement...
В функции ExtTextOut, в параметре Options проверяешь флаг ETO_GLYPH_INDEX, если он присуствует - тогда делаешь конвертацию глифов в символы.
Цитата
И получается,что на каждый глиф придётся производить определение соответствующего символа,а это жутко долго для больших объёмов текста...
Ну во-первых, глифы не так часто используются, во-вторых, если сделать оптимальным алгоритм конвертации - то визуально не увидишь потерю производительности.
После получения таблицы глифов для таблицы символов, сделай ассоциативный массив (какой нибудь мап), где символ увязывается с индексом глифа. Это делается один раз при заходе в функцию. Дальше просто в ассоциативный массив подставляется индекс глифа - результат символ.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines