StretchBlt всем будет интересно поломать голову...
От: Lebets_VI  
Дата: 19.07.04 15:29
Оценка:
Давиче я задавал вопрос, почему взятый из ресурса битмап не ПЕЧАТАЛСЯ на принтере, при чем просмотр перед печатью работал отличною Теперь намного философии:
1. У меня был код, который в режиме SetMapMode(MM_TWIPS) отлично печатал и показывал данный битмап, но ТОЛЬКО на 1 компьютере!!!!!!!!!!!!.
2. На других ПК (в том числе и на полностью аналогичном) программа в упор не хотела печатать битмап.
3. В конечном счете я изменил только 1 строку: "srcDC.CreateCompatibleDC(NULL);" где вместо реального CDC поставил NULL — и, о радость, все заработало!!!! НО!!!!!!!!!!! возник вопрос: а почему на самом первом ПК где было "srcDC.CreateCompatibleDC(pDC);" (т.е. конкретный данный нам CDC)все прекрасно печаталось??? Для меня это так и осталось заадкой.
4. Все теперь работает, все печатается, НО!!! только на настоящие принтеры (локальные или сетевые), а вот на принтеры отображенные в файл (у меня например куча PS принтеров) и на тот же виртуальный принтер "Adob PDF" функция StretchBlt выдает FALSE, да что там она, даже BitBlt тоже самое выдает.

Уменя только один вопрос П О Ч Е М У ???? п.3 и п.4.

Спасибо за ранее за то, что подумали над этими засадами.
Вячеслав.
Re: StretchBlt всем будет интересно поломать голову...
От: rus blood Россия  
Дата: 19.07.04 15:56
Оценка:
Здравствуйте, Lebets_VI, Вы писали:
L_V>3. В конечном счете я изменил только 1 строку: "srcDC.CreateCompatibleDC(NULL);" где вместо реального CDC поставил NULL — и, о радость, все заработало!!!! НО!!!!!!!!!!! возник вопрос: а почему на самом первом ПК где было "srcDC.CreateCompatibleDC(pDC);" (т.е. конкретный данный нам CDC)все прекрасно печаталось??? Для меня это так и осталось заадкой.

Вообще, в CreateCompatibleDC нужно поставить DC принтера. Если стоит NULL, то использется DC экрана. Наверно, если параметры экранного DC и принтерного совпадают (глубина цвета, например), то все ок. Если не совпадают, то не работает...
Имею скафандр — готов путешествовать!
Re[2]: StretchBlt всем будет интересно поломать голову...
От: Lebets_VI  
Дата: 19.07.04 16:27
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Вообще, в CreateCompatibleDC нужно поставить DC принтера. Если стоит NULL, то использется DC экрана. Наверно, если параметры экранного DC и принтерного совпадают (глубина цвета, например), то все ок. Если не совпадают, то не работает...


Кстати, может и так, т.к. на том ПК, где все работало с параметром DC принтера, глубина цвета экрана была 24, а на остальных проверочных, 32, 16, и т.д..
но вот, почему не печатает на виртуальных принтерах (первое сообщение)

Кстати могу выслать проект, от необычен тем, что печать идет от класса CListView, т.е. в окне обычный список, а печатается отчет.
Re[3]: StretchBlt всем будет интересно поломать голову...
От: rus blood Россия  
Дата: 19.07.04 16:31
Оценка:
Здравствуйте, Lebets_VI, Вы писали:

L_V>но вот, почему не печатает на виртуальных принтерах (первое сообщение)


Укажи в CreateCompatibeDC контекст принтера, а не экрана.

L_V>Кстати могу выслать проект, от необычен тем, что печать идет от класса CListView, т.е. в окне обычный список, а печатается отчет.


НЭ надо...
Имею скафандр — готов путешествовать!
Re[3]: StretchBlt всем будет интересно поломать голову...
От: rus blood Россия  
Дата: 19.07.04 16:32
Оценка:
Здравствуйте, Lebets_VI, Вы писали:


И что это там
Автор: rus blood
Дата: 19.07.04
за игры какие-то с (-1).
Там это поле bm.bmHeight оно положительное или отрицательное???
Имею скафандр — готов путешествовать!
Re[4]: StretchBlt всем будет интересно поломать голову...
От: Lebets_VI  
Дата: 19.07.04 18:07
Оценка:
Здравствуйте, rus blood, Вы писали:

RB>Там это поле bm.bmHeight оно положительное или отрицательное???

Я использую SetMapMode(MM_TWIPS) поэтому ширина должна быть отрицательной
а вот если я вместо DC экрана укажу DC принтера, то вообще ничего не печатается
Re[5]: StretchBlt всем будет интересно поломать голову...
От: Alglib Россия  
Дата: 19.07.04 21:48
Оценка:
Здравствуйте, Lebets_VI, Вы писали:

L_V>Здравствуйте, rus blood, Вы писали:


RB>>Там это поле bm.bmHeight оно положительное или отрицательное???

L_V>Я использую SetMapMode(MM_TWIPS) поэтому ширина должна быть отрицательной

шутки шутишь? как ширина может быть отрицательна? это же ш ширина
Re: StretchBlt всем будет интересно поломать голову...
От: Vadim B  
Дата: 20.07.04 00:44
Оценка:
Здравствуйте, Lebets_VI, Вы писали:

L_V>Давиче я задавал вопрос, почему взятый из ресурса битмап не ПЕЧАТАЛСЯ на принтере, при чем просмотр перед печатью работал отличною Теперь намного философии:


Возможно, немного не по теме, но печатать битмапы лучше через StretchDIBits. Работает всегда, в отличие от StretchBlt.
Re: StretchBlt всем будет интересно поломать голову...
От: Lebets_VI  
Дата: 20.07.04 05:59
Оценка: 14 (1)
Здесь все серьезно, без шуток. Ширина указывается отрицательная, т.к. у нас в данном режиме (SetMapMode(MM_TWIPS)) отрицательная ось y.
А вот Vadim B сказал правильно, что надо все делать через StretchDIBits. Почему??? так вот я нашел ответы на все интересующие меня вопросы,
рассказывать не буду, а приведу ссылки на MSDN 2003^

1. топик "INFO: Blitting Between DCs for Different Devices Is Unsupported"
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/enu_kbwin32sdk/win32sdk/195830.htm)

2. топик "StretchBlt()/StretchDIBits() Fails When Bitmap Sizes Differ Greatly"
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003APR.1033/enu_kbwinmil/winmil/269585.htm)

3. топик "HOWTO: Convert Between Device-Dependent Bitmaps and DIBs" это артикль 80080 кнолиджбэйза.

Кстати там написано что,!!!!!!! для печати надо использовать memory DC как промежуточный DC для помещения битмапа, а все будет работать ТОЛЬКО через DIB, т.е. надо битмап (DDB) преобразовать в DIB.
Re: StretchBlt всем будет интересно поломать голову...
От: Chez Россия  
Дата: 20.07.04 14:56
Оценка:
Здравствуйте, Lebets_VI, Вы писали:

А CreateCompatibleBitmap() там использовалось?

L_V>3. В конечном счете я изменил только 1 строку: "srcDC.CreateCompatibleDC(NULL);" где вместо реального CDC поставил NULL — и, о радость, все заработало!!!! НО!!!!!!!!!!! возник вопрос: а почему на самом первом ПК где было "srcDC.CreateCompatibleDC(pDC);" (т.е. конкретный данный нам CDC)все прекрасно печаталось??? Для меня это так и осталось заадкой.

Из MSDN по функции CreateCompatibleBitmap:

Note: When a memory device context is created, it initially has a 1-by-1 monochrome bitmap selected into it. If this memory device context is used in CreateCompatibleBitmap, the bitmap that is created is a monochrome bitmap. To create a color bitmap, use the hDC that was used to create the memory device context, as shown in the following code:

В общем если создавать конекст из NULL, то если использовать его для CreateCompatibleBitmap() то оно создастся монохромным...
Я на такой напарывался...

L_V>4. Все теперь работает, все печатается, НО!!! только на настоящие принтеры (локальные или сетевые), а вот на принтеры отображенные в файл (у меня например куча PS принтеров) и на тот же виртуальный принтер "Adob PDF" функция StretchBlt выдает FALSE, да что там она, даже BitBlt тоже самое выдает.

видать то же самое
... << RSDN@Home 1.1.3 stable >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.