我需要一種以打印方式以編程方式設置每頁打印設置的好方法。在Windows中打印時,以編程方式設置每頁打印頁數(N-Up)選項
我知道用戶可以通過打印機設置對話框選擇此選項,並且如果我願意,我可以做出這樣的對話框顯示。但是在我正在開發的程序的上下文中,我需要通過軟件本身來選擇它,而不需要用戶深入研究打印機設置。
雖然看起來我可以問Windows是否打印機使用DEVMODE
結構的dmNup
成員支持此操作,但似乎沒有任何官方方式來爲當前打印作業實際設置它。
顯然,一種解決方案是在我的軟件中更改打印算法,以便在設備上下文中適當地佈置頁面,以便在生成的輸出中獲取每頁多個頁面。但是,我還沒有看到任何簡單的方法可以做到這一點,即在繪製到打印機設備上下文的所有代碼中不需要進行重大更改。出於各種原因,我寧願避免大規模的代碼更改。
另一種解決方案是在Windows中安裝打印機的多個副本,同時將它們全部指向同一個打印機端口。打印機的每個副本都設置了不同的默認頁數(每頁)。然後軟件可以選擇合適的打印機,最終結果就好像它已經以編程方式選擇了每張紙所需的頁數選項。但是,我遇到了這個方案中的各種問題,所以我正在尋找一種替代方案,減輕支持負擔。
This article提供了另一種可能的解決方案:操縱官方DEVMODE結構後面的專用驅動程序數據中的適當字節。問題是,不能保證任何特定的打印機驅動程序實際上使用相同的字節,並且我需要基本上支持在辦公環境中可以合理使用的任何打印機。看起來我的軟件需要一個配置,我可以爲不使用默認值的驅動程序指定不同的字節偏移量。這可能是罕見的事件或頻繁頭痛,取決於多少打印機驅動程序決定使用此設置的不同字節。
因此,這裏是我的問題:
- 沒有人有使用操縱私人司機數據的最後一個技術的任何真實世界的體驗?處理來自不同製造商的各種打印機時它有多好?
- 有沒有其他技術我忽略了?
- 如果沒有別的,那麼是否有任何簡單的方法可以將文本,線條,圖形等繪製到打印機設備上下文中,並以某種方式強制它縮放,移動和可能旋轉(每頁2頁)輸出到設備上下文中的必要位置,而無需編寫所有代碼(並且不會丟失1像素寬的線)?
注意:值得一提的是,我正在使用的程序是使用C++和MFC。但是,所有這些應該同樣適用於處理設備上下文和其他Windows API本身的任何程序。