You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WinForm子窗体打印异常求助:横向设置、位置及缩放问题

WinForms子窗体打印问题解决方案

问题1:横向打印设置无效

直接设置DefaultPageSettings.Landscape或通过打印对话框修改后未同步到打印文档是核心问题,需确保将打印对话框的设置完全覆盖到PrintDocument:

if (prnDialog.ShowDialog() == DialogResult.OK)
{
    // 同步对话框的页面设置到打印文档
    prnDocument.DefaultPageSettings = prnDialog.PageSettings;
    // 执行预览或打印
    prnPreview.Document = prnDocument;
    prnPreview.ShowDialog();
}

同时检查HP打印机驱动的设备设置,若驱动层面强制锁定纸张方向,需在打印机属性中解除限制。

问题2:截图左上角超出窗体范围

截图时不要使用包含标题栏、边框的Bounds属性,应精准截取窗体客户区:

// 获取客户区在屏幕上的左上角坐标
Point clientScreenPos = yourChildForm.PointToScreen(new Point(0, 0));
// 创建与客户区尺寸匹配的截图画布
Bitmap screenshot = new Bitmap(yourChildForm.ClientSize.Width, yourChildForm.ClientSize.Height);
using (Graphics g = Graphics.FromImage(screenshot))
{
    // 从客户区左上角开始截取内容
    g.CopyFromScreen(clientScreenPos, new Point(0, 0), yourChildForm.ClientSize);
}

问题3:截图缩放适配打印整页

通过计算截图与打印可打印区域的宽高比例,取最小比例保持原图比例,居中绘制避免变形:

private void prnDocument_PrintPage(object sender, PrintPageEventArgs e)
{
    Bitmap screenshot = // 你的截图对象
    // 获取排除边距后的可打印区域
    RectangleF printArea = e.MarginBounds;
    // 计算宽高方向的缩放比例,取最小值保证完整显示
    float scaleX = printArea.Width / screenshot.Width;
    float scaleY = printArea.Height / screenshot.Height;
    float scale = Math.Min(scaleX, scaleY);

    // 计算居中绘制的坐标
    float drawX = printArea.Left + (printArea.Width - screenshot.Width * scale) / 2;
    float drawY = printArea.Top + (printArea.Height - screenshot.Height * scale) / 2;
    // 绘制缩放后的截图
    e.Graphics.DrawImage(screenshot, drawX, drawY, screenshot.Width * scale, screenshot.Height * scale);
}

内容的提问来源于stack exchange,提问作者DataSalad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:57:05