簡體   English   中英

以比屏幕分辨率更高的dpi打印表單

[英]Print a Form at higher dpi than screen resolution

問題:

我們需要有關如何使用WinForms自動縮放到不同DPI的功能的幫助,以允許我們以600dpi而不是屏幕DPI的格式打印表單。

對於您看到的就是您得到的打印,我們只是簡單地將布局精美的窗口打印出來(關閉滾動條和按鈕等)。 除了一件事,它的效果非常好:它的輸出速度為96dpi或120dpi(無論屏幕分辨率是什么)……兩者看上去都不真實且不專業(我們的客戶在抱怨)。 而且,盡管它與屏幕上的內容一樣可讀,但是您希望打印的文檔比在屏幕上更具可讀性……您希望能夠看到更多詳細信息,能夠閱讀更小的文本,等等。

考慮的替代方案:

鑒於我們具有很好的自動縮放功能,因此我們的窗口在96dpi,120dpi,144 dpi等條件下看起來都不錯,我們希望我們可以以600dpi的速度繪制窗口然后進行打印。

或者,我們看着在屏幕外以比正常大5-6倍的比例繪制窗口,以使我們擁有與600dpi相同的像素數,但像素為96或120 dpi…但是隨后以300或600的比例將巨大的窗口繪制到打印頁面dpi(無論打印機是什么)。

如果您可以告訴我們如何執行這些替代方法之一,或者可以給我們提供實現目標的其他方法,那么我們將不勝感激。

當前代碼:

如果需要的話,我們的窗體由將其他較小的FlowLayoutPanels放置到列中的FlowLayoutPanel組成,那些較小的FlowLayoutPanels布局了TextBoxes,RichTextBoxes,第三方RichTextEditor,PictureBoxes和DataGridViews的單個列。 我們使用從PrintDocument派生的類來實現OnBeginPrint,OnPrintPage和OnEndPrint。 在OnPrintPage中,它操縱正常的屏幕外窗口(在實際屏幕的下方和右側)以適合頁面大小,然后要求主面板(頂部FlowLayoutPanel)使用DrawToBitmap,然后使用傳遞到PrintEventArgs中的Graphics對象到DrawImage該位圖。 我們還使用Graphics.DrawString將頁腳應用於每個頁面。 主要代碼:

                    using (Bitmap bm = new Bitmap(sz.Width, sz.Height))
                    {
                        Rectangle rect = new Rectangle(0, 0, sz.Width, sz.Height);
                        mp.DrawToBitmap(bm, rect);
                        e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality; // so footer is anti-aliased
                        e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;  // so when we scale up, we smooth out the jaggies somewhat
                        e.Graphics.DrawImage(bm, this.MarginBounds, rect, GraphicsUnit.Pixel);
                        if (this.Footer != null)
                            e.Graphics.DrawImage(this.Footer, this.FooterLocation);
                        if (!string.IsNullOrEmpty(pageNumber))
                        {
                            e.Graphics.DrawString(pageNumber, KBStyle.Normal.Font, Brushes.Black,
                                                  this.MarginBounds.X, this.FooterLocation.Y + FooterOffset);
                        }
                    }

如何使打印的頁面達到600dpi? (甚至300 dpi都很棒!)

當我們打印時,從120dpi的機器打印時看起來比從96dpi的機器打印時看起來要好得多,因此為什么我們知道它是以屏幕分辨率打印的。 但是,這也讓我們懷疑是否有某種簡單的方法可以告訴它“此表格應以600 dpi的速度繪制”,然后上面的所有其余代碼都可以正常工作。

注意:如果我們使用上面的代碼抓取EMF(增強型圖元文件)並將其打印到打印機,則該EMF的輸出速度為600dpi。 不幸的是,我們沒有找到可以在FlowLayoutPanel而不是DrawToBitmap上調用的DrawToEMF方法。 將位圖更改為600dpi並沒有幫助……DrawToBitmap方法似乎仍然以屏幕分辨率繪制位圖。

謝謝!!

好的,我已經弄清楚了...而且效果很好!

我仍然不知道如何以300dpi的速度創建表單並使用自動縮放功能。

但…

我已經證明,如果您創建的窗口比96 dpi時所需的窗口大3.125倍,並且將字體放大至3.125倍,依此類推,那么即使您的屏幕是像素數,也需要300 dpi的速度為96dpi,則可以使用正常的Control.DrawToBitmap()功能將其轉換為位圖,然后可以使用GDI Graphics.DrawImage(thatGiantBitmap,giantSrcRect,pageSizeDestRect)到打印機Graphics對象,它將進行映射那些巨大的96dpi像素到頁面大小的300dpi像素,可為您提供300dpi的打印效果。 完善。

對於我們支持縮放大小並允許用戶任意縮放內容的任何窗口,然后輕松打印“您所見即所得”即可:

在您的PrintDocument的OnBeginPrint中,執行以下操作:

(1)(可選)將表單重復放置,以免與用戶的查看內容混淆

(2)將您要打印的表格移出屏幕(在所有屏幕的下方和右側)

(3)設置窗體,使其可以大於屏幕尺寸(默認情況下,WinForms不會大於屏幕尺寸)

(4)將300 dpi除以屏幕dpi以獲得增長因子

(5)通過成長因素發展自己的形態

(6)按增長因子縮放其內容(如果它們沒有根據窗體的大小自動縮放/自動縮放)

在你的PrintDocument的OnPrintPage,這樣做:

(7)在要打印的窗體中的任何控件上,將DrawToBitmap()設置為該控件大小的位圖

(8)在e.Graphics上執行DrawImage(thatGiantBitmap,giantSrcRect,pageSizeDestRect)

如果您的thatGiantBitmap中有那么多像素,則該DrawImage調用將以打印機的分辨率進行繪制。 在這種情況下,我計算了位圖以給出300 dpi所需的像素數,因此即使打印機為600 dpi,我也將獲得300 dpi的打印輸出。 如果需要完整的600 dpi,只需在第4步的計算中使用600 dpi。

完全可以猜到,但是使用CSS呢? 我正在猜測您要縮放多少,並且不知道如何知道打印機的縮放比例。 使用打印介質查詢使此功能適用於打印,但僅保留屏幕視圖。

@media print {
  * {
    transform: scale(2000px,2000px);
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM