Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > StretchBlt возвращает FALSE


Автор: Dreamer_0x01 2.12.2010, 19:31
Ситуация такая.

Во-первых, проблема проявляется не на всех компах - примерно на каждом втором вне зависимости от версии установленной Винды.

Пытаюсь рисовать в контекст принтера.
Линии, ружочки рисуются нормально, на печать выводятся.
Но вот данные, получаемые из другого контекста с помощью функции StretchBlt не выводятся, функция возвращает 0.
GetLastError() возвращает 87, в справочнике это соответствует "ERROR_INVALID_PARAMETER".

Но если этой же функцией выводить из того же контекста не в контекст принтера, а в контекст окна, то все рисуется нормально.

В чем может быть проблема и чего не хватает этой функции для нормальной жизни?

Код приводил вот в этой ветке:http://forum.vingrad.ru/forum/topic-316414.html, но чувствуется что тут требуется мнение специалистов именно по WinAPI.

Спасибо.

Автор: 586 2.12.2010, 20:36
Цитата(Dreamer_0x01 @  2.12.2010,  19:31 Найти цитируемый пост)
Во-первых, проблема проявляется не на всех компах - примерно на каждом втором вне зависимости от версии установленной Винды.

Цитата(Dreamer_0x01 @  2.12.2010,  19:31 Найти цитируемый пост)
Но если этой же функцией выводить из того же контекста не в контекст принтера, а в контекст окна, то все рисуется нормально.

Причина может быть в драйверах к принтеру... Попробуй рисовать в контекст принтера по другому.

Автор: Emura 3.12.2010, 01:06
плюс к сказанному, не мешало бы удостовериться что нет утечек GDI ресурсов.

Автор: Dreamer_0x01 3.12.2010, 12:05
Цитата(586 @  2.12.2010,  20:36 Найти цитируемый пост)
Причина может быть в драйверах к принтеру... 


Я не только на принтер пытался выводить - выводил и на всякие pdf-креаторы и прочии инструмнты для "виртуальной печати" - при печати в файл тот же косяк.

Цитата(Emura @  3.12.2010,  01:06 Найти цитируемый пост)
не мешало бы удостовериться что нет утечек GDI ресурсов.


В тестовом примере кроме GetDC никакие ресурсы не создаются...
ReleaseDC делаю.

Автор: Dreamer_0x01 26.12.2010, 00:34
искал утечки gdi, диспетчер задач их не показывает.
Проблемы с печатью тем не менее сохраняются. Уже не знаю, куда копать...

Автор: Dreamer_0x01 19.1.2011, 20:38
Дело в чем-то другом. Удалось получить вот что.

На тех компах, где контекст принтера возвращается небольшим по разрешению, и увеличение растрового изображения при его выводе на принтер происходит примерно в 5-6 раз, все печатается нормально.
А там, где разрешение принтера превосходит разрешение исходного контекста раз в 10-15, растровая операция уже ничего не выводит.

Может, как-то можно ограничить размер того контекста, который возвращается для принтера?

Автор: GremlinProg 19.1.2011, 23:41
возможно, проблема аналогична этой: http://forum.vingrad.ru/forum/topic-242513/kw-transparentblt/hl/stretchblt/index.html
как, собственно и её решение,

т.е. в данном случае, полагаю, вывод за пределы канвы принтера порождает ошибку "неверный параметр",
т.е. возможно следует провести предварительное отсечение картинки перед выводом на принтер

Автор: Dreamer_0x01 20.1.2011, 16:31
Цитата(GremlinProg @  19.1.2011,  23:41 Найти цитируемый пост)
т.е. в данном случае, полагаю, вывод за пределы канвы принтера порождает ошибку "неверный параметр"

Почитал, спасибо.

Дело скорее всего не в этом, так как выполнил следующий тест.
1. создал промежуточный контекст, совместимый с оконным, на который делаю StretchBlt
2. из этого контекста делаю BitBlt на принтер. Напрямую - не уговорить.
3. Сделал возможность ручного заданий коэффициентов умножения длины/ширины битмепа, на который делается StretchBlt.

В итоге вот что получается. Если размеры выставлять так, чтобы печатать узкую и длинную полосу - то есть сильно растянутое либо по вертикале, либо по горизонтали изображение, то печатается нормально. Причем даже в том случае, если длина полосы превышает размер контекста принтера.
Но вот когда пытаюсь увеличить ширину этой полосы, то это удается сделать до какого-то крайнего предела. Этот крайний предел инвариантен относительно какой-то абстрактной единицы площади - скажем, изображение растянутое в пропорциях 7х3, 8х2 печатается даже с выходом за пределы контекста, а вот растянутое в пропорциях 7х4, 8х3 уже не хочет - такое чувство, что то ли памяти не хватает, то ли других каких-то ресурсов.

Посему вопрос - можно ли подправить контекст принтера так, чтобы разрешение у него было низкое и количество пикселов было сравнимо с экранным?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)