Joey Arnanzo Ответов: 1

Печать формы windows дает пустую страницу


Всем привет,

Я пытаюсь добавить печать квитанций в POS-проект, над которым работаю
Я создал форму выигрыша с изображением и списком

Я добавил приведенный ниже код для печати, но он дает мне только пустую страницу

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Drawing.Printing;

namespace CrepeCity
{
    public partial class printPreview : Form
    {
        public printPreview()
        {
            InitializeComponent();
        }

        private void printPreview_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            CaptureScreen();
            printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);
            printDocument1.Print();
        }
        Bitmap memoryImage;

        private void CaptureScreen()
        {
            Graphics myGraphics = this.CreateGraphics();
            Size s = this.Size;
            memoryImage = new Bitmap(s.Width, s.Height, myGraphics);
            Graphics memoryGraphics = Graphics.FromImage(memoryImage);
            memoryGraphics.CopyFromScreen(this.Location.X, this.Location.Y, 0, 0, s);
        }


        private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {

        }

        private void printDocument1_PrintPage_1(object sender, PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(memoryImage, 0, 0);
        }
    }
}


Что я уже пробовал:

Also I've tried this code to print a specific panel and it also gives me an empty page

<pre lang="c#">  [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern long BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
        private Bitmap memoryImage;
        private void CaptureScreen()
        {
            Graphics mygraphics = this.CreateGraphics();
            Size s = this.Size;
            memoryImage = new Bitmap(s.Width, s.Height, mygraphics);
            Graphics memoryGraphics = Graphics.FromImage(memoryImage);
            IntPtr dc1 = mygraphics.GetHdc();
            IntPtr dc2 = memoryGraphics.GetHdc();
            BitBlt(dc2, 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height, dc1, 0, 0, 13369376);
            mygraphics.ReleaseHdc(dc1);
            memoryGraphics.ReleaseHdc(dc2);
        }
        private void printDocument1_PrintPage(System.Object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            e.Graphics.DrawImage(memoryImage, 0, 0);
        }

        private void button102_Click_1(object sender, EventArgs e)
        {
            CaptureScreen();
            printDocument1.Print();
        }

[no name]

Вероятно, потому, что вы захватываете экран, а затем ничего не делаете с результатом.

Joey Arnanzo

не могли бы вы подсказать мне код, чтобы распечатать результат?

Dave Kreskowiak

Вы также не избавились от своего графического объекта после того, как закончили с ним. Ваш код утекает ресурсы и в конечном итоге приведет к сбою вашего приложения и Windows.

1 Ответов

Рейтинг:
8

OriginalGriff

Это прекрасно работает для меня:

CaptureScreen();
memoryImage.Save(@"D:\Temp\aaaPix.jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
printDocument1.PrintPage += new PrintPageEventHandler(printDocument1_PrintPage);
PrintPreviewDialog ppd = new PrintPreviewDialog();
ppd.Document = printDocument1;
ppd.ShowDialog();
printDocument1.Print();
Я получаю JPG-файл, содержащий мою форму, я вижу его в предварительном просмотре печати, и я вижу его на бумаге с помощью кнопки предварительного просмотра "печать" и команды прямой печати.
Я бы проверил, что любой ваш код выполняется через отладчик.