gpt4 book ai didi

c# - 在 C# 中读取打印机设备上下文

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:43 24 4
gpt4 key购买 nike

我能够显示屏幕设备并将其保存到 DIB 位图,我想对打印机设备上下文执行相同的操作。我可以获得非空位图,但它始终是纯黑色。

这是允许我处理屏幕设备上下文的代码。

        //In size variable we shall keep the size of the window.
SIZE size;

//Win32 API functions are imported in classes
//PlatformInvokeGDI32
//PlatformInvokeUSER32

//Get handle of calc.exe window.
IntPtr hwnd = PlatformInvokeUSER32.FindWindow("SciCalc", "Calculator");

//Get window dimensions
PlatformInvokeUSER32.RECT rect;
PlatformInvokeUSER32.GetWindowRect(hwnd, out rect);
size.cx = rect._Right - rect._Left;
size.cy = rect._Bottom - rect._Top;

//Get the device context of Calculator.
IntPtr hDC = PlatformInvokeUSER32.GetDC(hwnd);

//Draw on the Calculator surface.
Graphics CalculatorGraphics = Graphics.FromHdc(hDC);
Color colorRed = Color.FromName("Red");
Pen penRed = new Pen(colorRed);
CalculatorGraphics.DrawEllipse(penRed, 50, 50, 50, 50);
CalculatorGraphics.Save();

//Here we make a compatible device context in memory for screen device context.
IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(hDC);

//Create a compatible bitmap of window size and using screen device context.
m_HBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(hDC, size.cx, size.cy);

//As m_HBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used.
if (m_HBitmap != IntPtr.Zero)
{
//Here we select the compatible bitmap in memeory device context and keeps the refrence to Old bitmap.
IntPtr hOld = (IntPtr)PlatformInvokeGDI32.SelectObject(hMemDC, m_HBitmap);
//We copy the Bitmap to the memory device context.
PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, hDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);
//We select the old bitmap back to the memory device context.
PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
//We delete the memory device context.
PlatformInvokeGDI32.DeleteDC(hMemDC);
//We release the screen device context.
PlatformInvokeUSER32.ReleaseDC(hwnd, hDC);
//Image is created by Image bitmap handle and returned.
return System.Drawing.Image.FromHbitmap(m_HBitmap);
}
//If m_HBitmap is null retunrn null.
return null;

以下是我如何获取打印机设备上下文:

        //In size variable we shall keep the size of the window.
SIZE size;
size.cx = 1000;
size.cy = 1000;

//Get Printer Handle
IntPtr PrinterHandle;
PlatformInvokeGDI32.PRINTER_DEFAULTSW defaults = new PlatformInvokeGDI32.PRINTER_DEFAULTSW();
PlatformInvokeGDI32.OpenPrinterW("Bullzip PDF Printer", out PrinterHandle, defaults);

//Get Printer Device context
IntPtr PrinterHDC = PlatformInvokeGDI32.CreateDCW("", "Bullzip PDF Printer", "", IntPtr.Zero);

//Initialize DocInfo structure.
PlatformInvokeGDI32.DOCINFOW docInfo = new PlatformInvokeGDI32.DOCINFOW();

//Start printing.
PlatformInvokeGDI32.StartDocW(PrinterHDC, ref docInfo);
PlatformInvokeGDI32.StartPage(PrinterHDC);
Graphics graphics = Graphics.FromHdc(PrinterHDC, PrinterHandle);

Color theColor = Color.FromName("Red");
Pen pen = new Pen(theColor);
graphics.DrawRectangle(pen, 50, 50, 50, 50);
graphics.DrawEllipse(pen, 50, 50, 50, 50);
graphics.Save();

//Here we make a compatible device context in memory for screen device context.
IntPtr hMemDC = PlatformInvokeGDI32.CreateCompatibleDC(PrinterHDC);

//Create a compatible bitmap of window size and using screen device context.
m_HBitmap = PlatformInvokeGDI32.CreateCompatibleBitmap(PrinterHDC, size.cx, size.cy);

//As m_HBitmap is IntPtr we can not check it against null. For this purspose IntPtr.Zero is used.
if (m_HBitmap != IntPtr.Zero)
{
//Here we select the compatible bitmap in memeory device context and keeps the refrence to Old bitmap.
IntPtr hOld = (IntPtr)PlatformInvokeGDI32.SelectObject(hMemDC, m_HBitmap);
//We copy the Bitmap to the memory device context.
PlatformInvokeGDI32.BitBlt(hMemDC, 0, 0, size.cx, size.cy, PrinterHDC, 0, 0, PlatformInvokeGDI32.SRCCOPY);
//We select the old bitmap back to the memory device context.
PlatformInvokeGDI32.SelectObject(hMemDC, hOld);
//We delete the memory device context.
PlatformInvokeGDI32.DeleteDC(hMemDC);
//We release the screen device context.
//PlatformInvokeUSER32.ReleaseDC(hwnd, PrinterHDC);
//Image is created by Image bitmap handle and returned.

PlatformInvokeGDI32.EndPage(PrinterHDC);
PlatformInvokeGDI32.EndDoc(PrinterHDC);
PlatformInvokeGDI32.ClosePrinter(PrinterHandle);
pen.Dispose();
graphics.Dispose();


return System.Drawing.Image.FromHbitmap(m_HBitmap);
}
//If m_HBitmap is null retunrn null.
return null;

如何在打印机设备上下文中绘制?如何将打印机设备上下文保存到 DIB?

谢谢,

雅各布

最佳答案

打印机设备上下文是只写的。

例如,假设您正在打印到 PostScript 打印机。您创建打印机设备上下文并在其上绘制一些文本。打印机设备驱动程序不呈现包含您的文本的位图。相反,它创建一系列 PostScript 命令来绘制文本并将命令发送到打印机。也就是说,没有要复制的位图。

你想达到什么目的?

关于c# - 在 C# 中读取打印机设备上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7882831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com