您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)利用c#怎么解決winform中PictureBox 無(wú)法打印全部圖片的問(wèn)題,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
在頁(yè)面使用PictureBox 加載資料圖片后,點(diǎn)擊“打印”,只能打印圖片首頁(yè),較大圖片則無(wú)法全部打印。
PictureBox中打印圖片時(shí)沒(méi)有設(shè)置繼續(xù)打印相關(guān)屬性,因此每次只能打印第1頁(yè)。
PictureBox控件增加打印全部頁(yè)面屬性,如果為T(mén)rue,表示打印全部頁(yè)面;如果為False,保留原有邏輯不變。
在打印全部頁(yè)面時(shí),將控件的圖片按頁(yè)面大小切割,打印頁(yè)面索引小于頁(yè)面總數(shù)時(shí),設(shè)置打印屬性PrintPageEventArgs. HasMorePages = true繼續(xù)打印,打印完成后將該屬性設(shè)置為False結(jié)束打印。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Printing; using System.Text; using System.Windows.Forms; namespace MyClass { //public enum OperationState { Default, ZoomIn, ZoomOut }; public partial class UCPictureBox : PictureBox { //private OperationState operationState;//處理狀態(tài) private HScrollBar hScrollBar;//水平滾動(dòng)條 private VScrollBar vScrollBar;//垂直滾動(dòng)條 private PrintDocument printDocument;//打印對(duì)象 private Rectangle currRect;//現(xiàn)在矩形對(duì)象 private Bitmap currBmp;//現(xiàn)在圖形對(duì)象 //private int hScrollBarMidVal;//水平滾動(dòng)條中間值 //private int vScrollBarMidVal;//垂直滾動(dòng)條中間值 private RectangleF srcRect; private RectangleF destRect; private bool isMoveScrollBar;//是否移動(dòng)滾動(dòng)條 int currentPageIndex = 0;//當(dāng)前頁(yè)面 int pageCount = 0;//打印頁(yè)數(shù) /// <summary> /// 構(gòu)造函數(shù) /// </summary> public UCPictureBox() { InitializeComponent(); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); SetStyle(ControlStyles.AllPaintingInWmPaint, true); //hScrollBarMidVal = 0; //vScrollBarMidVal = 0; //operationState = OperationState.Default; isMoveScrollBar = false; srcRect = new RectangleF(); destRect = new RectangleF(); printDocument = new PrintDocument(); printDocument.PrintPage += new PrintPageEventHandler(printDocument_PrintPage); //構(gòu)造水平滾動(dòng)條 hScrollBar = new HScrollBar(); hScrollBar.Visible = false; hScrollBar.Dock = DockStyle.Bottom; hScrollBar.Scroll += new ScrollEventHandler(scrollBar_Scroll); this.Controls.Add(hScrollBar); //構(gòu)造垂直滾動(dòng)條 vScrollBar = new VScrollBar(); vScrollBar.Visible = false; vScrollBar.Dock = DockStyle.Right; vScrollBar.Scroll +=new ScrollEventHandler(scrollBar_Scroll); this.Controls.Add(vScrollBar); } #region 公共屬性 [Category("外觀"), Description("獲取或設(shè)置圖片")] public new Image Image { get { return base.Image; } set { if (value != null) { base.Image = value; currRect.Width = base.Image.Width; currRect.Height = base.Image.Height; hScrollBar.Value = 0; vScrollBar.Value = 0; displayScrollBars(); setScrollBarsValues(); Invalidate(); } } } //縮放比例 private int scaleSize = 1; [Category("其它"), Description("獲取或設(shè)置圖片縮放比例")] public Int32 ScaleSize { get { return scaleSize; } set { if (value > 1 && value < 51) { scaleSize = value; } } } //縮放倍數(shù) private int scaleScope = 5; [Category("其它"), Description("獲取或設(shè)置圖片最大縮放倍數(shù)")] public int ScaleScope { get { return scaleScope; } set { if (value > 1 && value < 11) { scaleScope = value; } } } //圖片邊框顏色 //private Color borderColor = Color.DarkGray; //[Category("其它"), Description("獲取或設(shè)置圖片邊框顏色")] //public Color BorderColor //{ // get { return borderColor; } // set { borderColor = value; } //} //圖片邊框?qū)挾? private int borderWidth = 5; [Category("其它"), Description("獲取或設(shè)置圖片邊框?qū)挾?quot;)] public Int32 BorderWidth { get { return borderWidth; } set { borderWidth = value; } } //打印全部頁(yè)面 [Category("其它"),Description("true-打印全部頁(yè)面,false-打印首頁(yè)")] public bool PrintAllPages { get; set; } #endregion #region 內(nèi)部公共方法 /// <summary> /// 從新繪制 /// </summary> protected override void OnPaint(PaintEventArgs pe) { // TODO: 在此處添加自定義繪制代碼 // 調(diào)用基類(lèi) OnPaint base.OnPaint(pe); if (this.Image != null) { if (currBmp != null) { currBmp.Dispose(); } currBmp = new Bitmap(currRect.Width + 2 * borderWidth, currRect.Height + 2 * borderWidth); //繪制新圖片 using (Graphics g = Graphics.FromImage(currBmp)) { using (Pen pen = new Pen(BackColor, borderWidth)) { g.DrawRectangle(pen, borderWidth * 0.5f, borderWidth * 0.5f, currRect.Width + borderWidth, currRect.Height + borderWidth); } g.DrawImage(this.Image, borderWidth, borderWidth, currRect.Width, currRect.Height); } //圖片繪制到控件上 pe.Graphics.Clear(BackColor); if (hScrollBar.Visible || vScrollBar.Visible) {//滾動(dòng)條可見(jiàn) drawDisplayedScrollBars(pe.Graphics); } else {//滾動(dòng)條不可見(jiàn) float x = 0, y = 0; isMoveScrollBar = false; //是否繪制到中心點(diǎn)坐標(biāo) if (this.SizeMode == PictureBoxSizeMode.CenterImage) { x = Math.Abs(ClientSize.Width - currBmp.Width) * 0.5f; y = Math.Abs(ClientSize.Height - currBmp.Height) * 0.5f; } pe.Graphics.DrawImage(currBmp, x, y, currBmp.Width, currBmp.Height); } } } /// <summary> /// 重寫(xiě)控件大小發(fā)生改變事件 /// </summary> protected override void OnClientSizeChanged(EventArgs e) { base.OnClientSizeChanged(e); displayScrollBars(); setScrollBarsValues(); Invalidate(); } #endregion #region 圖片打印與預(yù)覽 /// <summary> /// 打印圖片 /// </summary> public void PrintPictrue() { PrintDialog printDialog = new PrintDialog(); printDialog.Document = printDocument; //added by lky 2017-11-16 修復(fù)Windows 7 x64位環(huán)境無(wú)法彈出打印對(duì)話框的問(wèn)題 printDialog.UseEXDialog = true; if (printDialog.ShowDialog() == DialogResult.OK) { try { printDocument.Print(); } catch (Exception ex) { MessageBox.Show(ex.Message, "打印出錯(cuò)", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } } } /// <summary> /// 打印預(yù)覽 /// </summary> public void PrintPreview() { PrintPreviewDialog printPreviewDialog = new PrintPreviewDialog(); printPreviewDialog.Document = printDocument; try { printPreviewDialog.ShowDialog(); } catch (Exception ex) { MessageBox.Show(ex.Message, "打印出錯(cuò)", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// <summary> /// 打印圖片事件 /// </summary> private void printDocument_PrintPage(object sender, PrintPageEventArgs e) { if (currBmp == null) return; try { if (PrintAllPages)//added by lky 2018-1-15 打印全部頁(yè)面 { int pageWith =(int) e.PageSettings.PrintableArea.Width; int pageHeight = (int)e.PageSettings.PrintableArea.Height; int horizontalTimes = (int)Math.Ceiling((decimal)currBmp.Width / pageWith);//水平方向切割頁(yè)數(shù) int verticalTimes = (int)Math.Ceiling((decimal)currBmp.Height / pageHeight);//垂直方向切割頁(yè)數(shù) if (pageCount == 0) { pageCount = horizontalTimes * verticalTimes;//總頁(yè)數(shù) currentPageIndex = 0; } int horizontalCurrentPosition = (currentPageIndex % horizontalTimes);//當(dāng)前打印的水平偏移頁(yè)數(shù) int verticalCurrentPosition = (int)Math.Floor((decimal)currentPageIndex / horizontalTimes);//當(dāng)前打印的垂直偏移頁(yè)數(shù) int x = horizontalCurrentPosition * pageWith;//水平方向打印偏移位置 int y = verticalCurrentPosition * pageHeight;//垂直方向打印偏移位置 int leftX = (currBmp.Width - x) > 0 ? (currBmp.Width - x) : 0;//水平方向未打印尺寸 int leftY = (currBmp.Height - y) > 0 ? (currBmp.Height - y) : 0;//垂直方向未打印尺寸 Bitmap printBmp = (Bitmap)currBmp.Clone(new Rectangle(x, y, (leftX > pageWith ? pageWith : leftX), (leftY > pageHeight ? pageHeight : leftY)), currBmp.PixelFormat); //待打印圖片緩存 e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; e.Graphics.DrawImage(printBmp, 0, 0, printBmp.Width, printBmp.Height); printBmp.Dispose(); currentPageIndex++; e.HasMorePages = currentPageIndex < pageCount;//是否繼續(xù)打印 if (!e.HasMorePages) pageCount = 0;//打印頁(yè)數(shù)置為0 } else //僅打印首頁(yè) { Bitmap printBmp = (Bitmap)currBmp.Clone(); e.Graphics.SmoothingMode = SmoothingMode.AntiAlias; e.Graphics.PixelOffsetMode = PixelOffsetMode.HighSpeed; e.Graphics.DrawImage(printBmp, 0, 0, printBmp.Width, printBmp.Height); printBmp.Dispose(); } } catch (Exception ex) { //寫(xiě)日志文件 LogWriter.Write(LOG_CATEGORY.WIN_UI, LOG_LEVEL.ERROR, "UCPicturBox.PrintPage" + ex.ToString()); } } #endregion #region 圖片放大、縮小、原始大小、全屏顯示、旋轉(zhuǎn)功能 /// <summary> /// 放大圖片 /// </summary> public void ZoomInPicture() { if (this.Image != null) { //operationState = OperationState.ZoomIn; double scale = 1 + (scaleSize * 0.01); currRect.Width = Convert.ToInt32(currRect.Width * scale); currRect.Height = currRect.Width * this.Image.Height / this.Image.Width; if (currRect.Width < (this.Image.Width * scaleScope)) { displayScrollBars(); setScrollBarsValues(); Invalidate(); } } } /// <summary> /// 縮小圖片 /// </summary> public void ZoomOutPicture() { if (this.Image != null) { //operationState = OperationState.ZoomOut; double scale = 1 - (scaleSize * 0.01); currRect.Width = Convert.ToInt32(currRect.Width * scale); currRect.Height = currRect.Width * this.Image.Height / this.Image.Width; displayScrollBars(); setScrollBarsValues(); Invalidate(); } } /// <summary> /// 原始大小 /// </summary> public void ZoomOriginalPicture() { if (this.Image != null) { //operationState = OperationState.Default; isMoveScrollBar = false; currRect.Width = this.Image.Width; currRect.Height = this.Image.Height; displayScrollBars(); setScrollBarsValues(); Invalidate(); } } /// <summary> /// 全屏顯示 /// </summary> public void ZoomShowAllPicture() { if (this.Image != null) { if (this.Image.Width > this.Image.Height) { currRect.Width = ClientSize.Width - 2 * borderWidth; currRect.Height = currRect.Width * this.Image.Height / this.Image.Width; if ((currRect.Height + 2 * borderWidth) > ClientSize.Height) { currRect.Height = ClientSize.Height - 2 * borderWidth; currRect.Width = currRect.Height * this.Image.Width / this.Image.Height; } //if ((currRect.Height + 2 * borderWidth) > ClientSize.Height) //{ // currRect.Width = ClientSize.Width - 2 * borderWidth - vScrollBar.Width; // currRect.Height = currRect.Width * this.Image.Height / this.Image.Width; //} } else { currRect.Height = ClientSize.Height - 2 * borderWidth; currRect.Width = currRect.Height * this.Image.Width / this.Image.Height; if ((currRect.Width + 2 * borderWidth) > ClientSize.Width) { currRect.Width = ClientSize.Width - 2 * borderWidth; currRect.Height = currRect.Width * this.Image.Width / this.Image.Height; } //if ((currRect.Width + 2 * borderWidth) > ClientSize.Width) //{ // hScrollBar.Value = 0; // currRect.Height = ClientSize.Height - 2 * borderWidth - hScrollBar.Height; // currRect.Width = currRect.Height * this.Image.Width / this.Image.Height; //} } isMoveScrollBar = false; displayScrollBars(); setScrollBarsValues(); Invalidate(); } } /// <summary> /// 旋轉(zhuǎn)圖片 /// </summary> public void RotatePicture() { if (this.Image != null) { isMoveScrollBar = false; this.Image.RotateFlip(RotateFlipType.Rotate90FlipNone); int tempWidth = currRect.Width; currRect.Width = currRect.Height; currRect.Height = tempWidth; displayScrollBars(); setScrollBarsValues(); Invalidate(); } } /// <summary> /// 顯示水平滾動(dòng)條與垂直滾動(dòng)條 /// </summary> private void displayScrollBars() { //是否顯示水平滾動(dòng)條 if ((currRect.Width + 2 * borderWidth) > ClientSize.Width) { hScrollBar.Visible = true; } else { hScrollBar.Visible = false; } //是否顯示垂直滾動(dòng)條 if ((currRect.Height + 2 * borderWidth) > ClientSize.Height) { vScrollBar.Visible = true; } else { vScrollBar.Visible = false; } } /// <summary> /// 設(shè)置水平滾動(dòng)條與垂直滾動(dòng)條值 /// </summary> private void setScrollBarsValues() { //設(shè)置水平滾動(dòng)條值 if (hScrollBar.Visible) { hScrollBar.Minimum = 0; hScrollBar.Maximum = currRect.Width - ClientSize.Width + 2 * borderWidth; hScrollBar.LargeChange = currRect.Width / 10; if (vScrollBar.Visible) { hScrollBar.Maximum += vScrollBar.Width; } if (hScrollBar.LargeChange > hScrollBar.Maximum) { hScrollBar.LargeChange = hScrollBar.Maximum - 1; } hScrollBar.SmallChange = hScrollBar.LargeChange / 5; hScrollBar.Maximum += hScrollBar.LargeChange; //繪制坐標(biāo)為中心點(diǎn) if (this.SizeMode == PictureBoxSizeMode.CenterImage) { if (hScrollBar.Value == 0 || isMoveScrollBar == false) { hScrollBar.Value = (hScrollBar.Maximum - hScrollBar.LargeChange) / 2; } } } else { hScrollBar.Value = 0; } //設(shè)置垂直滾動(dòng)條值 if (vScrollBar.Visible) { vScrollBar.Minimum = 0; vScrollBar.Maximum = currRect.Height - ClientSize.Height + 2 * borderWidth; vScrollBar.LargeChange = currRect.Height / 10; if (hScrollBar.Visible) { vScrollBar.Maximum += hScrollBar.Height; } if (vScrollBar.LargeChange > vScrollBar.Maximum) { vScrollBar.LargeChange = vScrollBar.Maximum - 1; } vScrollBar.SmallChange = vScrollBar.LargeChange / 5; vScrollBar.Maximum += vScrollBar.LargeChange; //繪制坐標(biāo)為中心點(diǎn) if (this.SizeMode == PictureBoxSizeMode.CenterImage) { if (vScrollBar.Value == 0 || isMoveScrollBar ==false) { vScrollBar.Value = (vScrollBar.Maximum - vScrollBar.LargeChange) / 2; } } } else { vScrollBar.Value = 0; } } /// <summary> /// 移動(dòng)水平滾動(dòng)條事件 /// </summary> private void scrollBar_Scroll(object sender, ScrollEventArgs e) { isMoveScrollBar = true; using (Graphics graphics = this.CreateGraphics()) { drawDisplayedScrollBars(graphics); } this.Update(); } /// <summary> /// 從新繪制顯示的滾動(dòng)條 /// </summary> private void drawDisplayedScrollBars(Graphics graphics) { float x = 0, y = 0; if (this.SizeMode == PictureBoxSizeMode.CenterImage) { x = Math.Abs(ClientSize.Width - currBmp.Width - vScrollBar.Width) * 0.5f; y = Math.Abs(ClientSize.Height - currBmp.Height - hScrollBar.Height) * 0.5f; } if (hScrollBar.Visible == false) {//水平滾動(dòng)條不可見(jiàn) destRect.X = x; destRect.Y = 0; srcRect.X = 0; srcRect.Y = vScrollBar.Value; } else if (vScrollBar.Visible == false) {//垂直滾動(dòng)條不可見(jiàn) destRect.X = 0; destRect.Y = y; srcRect.Y = 0; srcRect.X = hScrollBar.Value; } else {//兩個(gè)滾動(dòng)條都可見(jiàn) destRect.X = 0; destRect.Y = 0; srcRect.X = hScrollBar.Value; srcRect.Y = vScrollBar.Value; } destRect.Width = currBmp.Width; destRect.Height = currBmp.Height; srcRect.Width = currBmp.Width; srcRect.Height = currBmp.Height; graphics.DrawImage(currBmp, destRect, srcRect, GraphicsUnit.Pixel); } #endregion } }
關(guān)于利用c#怎么解決winform中PictureBox 無(wú)法打印全部圖片的問(wèn)題就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。