|
А можно как-то подменить hdc принтера на hdc связанное с bitmap с целью сохранить в файл?
|
|||
---|---|---|---|
#18+
В службе факсов/Fax and Scan есть нехилый такой функционал, связанный с Cover Pages (Титульные страницы). Озадачился нестандартной задачей: сохранить распечатанную Cover Page в TIFF-файл (дабы использовать ее в другом приложении - не MSFax). Стандартный алгоритм описан здесь: Printing a Fax to a Device Context 1.Call the FaxStartPrintJob function to retrieve the handle to a fax printer DC. The function returns the handle in a FAX_CONTEXT_INFO structure. 2.Call the FaxPrintCoverPage function, if a cover page is required, passing a pointer to the FAX_CONTEXT_INFO structure returned by the FaxStartPrintJob function. 3.Print the fax document to the printer DC in the normal manner, passing the handle to the DC returned by the FaxStartPrintJob function. The procedure can include calls to the StartPage and EndPage Win32 GDI functions. 4.Call the EndDoc function or the AbortDoc function, passing the handle to the DC returned by FaxStartPrintJob. This closes the document and ends the fax print job. 5.Call the DeleteDC function to deallocate the handle to the DC. Т.е. FaxStartPrintJob возвращает hdc в структуре FAX_CONTEXT_INFO (и видимо инициализирует StartDoc), а FaxPrintCoverPage лепит CoverPage в это hdc. EndDoc завершает подготовку факса и факс улетает в Fax and Scan на отправку. Ну, штатно все работает: Код: vbnet 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.
Но мне надо "угнать" CoverPage картинку в свой файл. Создаю свою кухню, пытаюсь подсунуть в FaxPrintCoverPage свое hdc, не вызывая предварительно FaxStartPrintJob Код: vbnet 1. 2. 3. 4.
Код: vbnet 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84.
Ну и ни фига не работает, FaxPrintCoverPage отрабатывает без ошибки, но на выходе белый лист бумаги. Почему? По идее должен был туда чего-нибудь накалякать. Но результат таки получил. Делаем все как в первом случае, т.е. с вызовом FaxStartPrintJob, и с подсовыванием в FaxPrintCoverPage честного hdc (FaxContextInfo.hDC, которое вернула первая ф-ция). Но далее делаем. Код: vbnet 1. 2. 3. 4. 5.
Т.е. я вылавливаю-таки желаемую картинку, а затем отменяю "печать" (AbortDoc). Прокатывает, получаем картинку сохраненную в файле. Код: vbnet 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110.
(Ну, код субъективен, принтер Fax надо выставлять программно в 200x200,A4,Портрет - на момент выполнения кода (соответствует разрешению 204x198 и размеру картинки 1728x2339. Но это я умею, также без проблем возвращаю к "текущим установкам"). Мне вот не понятно почему не рисует второй код и что тут можно придумать. Третий код как бы рабочий, но он использует ресурсы принтера, хоть я и не довожу штатную процедуру до конца. Т.е. я делаю копию картинки на полпути, а мне бы изначально эту картинку бухнуть в свое hdc и в файл, не обращаясь к принтеру. P.S hdc и связанный bitmap я готовлю правильно, могу туда без проблем нарисовать какую-нибудь линию через .Net-овскую Grafics и тому подобное, но вот FaxPrintCoverPage туда напрямую рисовать отказывается, хотя BitBlt туда копирует. Понятно что пытаюсь сделать нечто недокументированное, но тем не менее. Должен быть способ его обмануть. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2018, 05:58 |
|
А можно как-то подменить hdc принтера на hdc связанное с bitmap с целью сохранить в файл?
|
|||
---|---|---|---|
#18+
Дмитрий77Но мне надо "угнать" CoverPage картинку в свой файл. Создаю свою кухню, пытаюсь подсунуть в FaxPrintCoverPage свое hdc, не вызывая предварительно FaxStartPrintJob Код: vbnet 1. 2. 3. 4.
Код: vbnet 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84.
Ну и ни фига не работает, FaxPrintCoverPage отрабатывает без ошибки, но на выходе белый лист бумаги. Почему? По идее должен был туда чего-нибудь накалякать… .но вот FaxPrintCoverPage туда напрямую рисовать отказывается, хотя BitBlt туда копирует. Понятно что пытаюсь сделать нечто недокументированное, но тем не менее. Должен быть способ его обмануть. А если заменить Код: vbnet 1.
На вот это Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
то все однако срабатывает и FaxPrintCoverPage выводит графику уже напрямую в мое DC (hdcDst). Осталось сообразить как создать самому правильное hdcDst, чтоб можно было выкинуть FaxStartPrintJob, которое генерирует вспомогательное FaxContextInfo.hDC. М.б. CreateDCW function ? Вопрос только что в нее пихать... Ключевой судя по всему является структура DEVMODE structure , которую придется "сочинять". ... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 02:26 |
|
А можно как-то подменить hdc принтера на hdc связанное с bitmap с целью сохранить в файл?
|
|||
---|---|---|---|
#18+
Ну вот чтоб совсем на абстрактное hdc вывести, что-то не получается. Можно 1) Получить текущую DEVMODE принтера 2) Подправить эту DEVMODE с учетом желаемого разрешения (а заодно чтоб точно было A4+Портрет), не нарушая при этом текущих системных установок принтера 3) Создать DC принтера через CreateDC (передается имя принтера и кастомизированная DEVMODE) 4) Из нее создать еще одну hdc через CreateCompatibleDC, в нее уже можно рисовать FaxPrintCoverPage и сохранять картинку. Поприличней конечно, но по сути не отличается от того что в предыдущем посте. Еще иконка принтера в трей выводится как при печати, хоть мусора в очереди печати и не остается. Также используется имя принтера "Fax", а его вообще говоря можно переименовать в "Fax1". Код: vbnet 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. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145.
... |
|||
:
Нравится:
Не нравится:
|
|||
17.08.2018, 06:39 |
|
|
start [/forum/topic.php?fid=20&fpage=28&tid=1399273]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 24ms |
total: | 169ms |
0 / 0 |