| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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. Спасибо. |
| Автор: Emura 3.12.2010, 01:06 |
| плюс к сказанному, не мешало бы удостовериться что нет утечек GDI ресурсов. |
| Автор: Dreamer_0x01 3.12.2010, 12:05 |
Я не только на принтер пытался выводить - выводил и на всякие pdf-креаторы и прочии инструмнты для "виртуальной печати" - при печати в файл тот же косяк. В тестовом примере кроме 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 | ||
Почитал, спасибо. Дело скорее всего не в этом, так как выполнил следующий тест. 1. создал промежуточный контекст, совместимый с оконным, на который делаю StretchBlt 2. из этого контекста делаю BitBlt на принтер. Напрямую - не уговорить. 3. Сделал возможность ручного заданий коэффициентов умножения длины/ширины битмепа, на который делается StretchBlt. В итоге вот что получается. Если размеры выставлять так, чтобы печатать узкую и длинную полосу - то есть сильно растянутое либо по вертикале, либо по горизонтали изображение, то печатается нормально. Причем даже в том случае, если длина полосы превышает размер контекста принтера. Но вот когда пытаюсь увеличить ширину этой полосы, то это удается сделать до какого-то крайнего предела. Этот крайний предел инвариантен относительно какой-то абстрактной единицы площади - скажем, изображение растянутое в пропорциях 7х3, 8х2 печатается даже с выходом за пределы контекста, а вот растянутое в пропорциях 7х4, 8х3 уже не хочет - такое чувство, что то ли памяти не хватает, то ли других каких-то ресурсов. Посему вопрос - можно ли подправить контекст принтера так, чтобы разрешение у него было низкое и количество пикселов было сравнимо с экранным? |