c# - 为什么 PrintPreview 与纸质打印不完全相同?

标签 c# winforms printing

好吧,在你用 StringFormat.Alignment = StringAlignment.Center 向我发送垃圾邮件之前...听听我的整个问题:

当我使用以下代码绘制文本时,字符串在 PrintPreview 中居中,但在打印时未在实际纸张上居中。整个页面稍微偏右一点,因此有些东西在打印预览中显示为正在打印,但在打印时从纸张上脱落(不仅仅是超出边距范围,而是从纸张上脱落)。

    private void button1_Click(object sender, EventArgs e)
    {
        PrintDocument pd = new PrintDocument();

        pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);

        PrintPreviewDialog ppd = new PrintPreviewDialog();

        ((Form)ppd).WindowState = FormWindowState.Maximized;

        ppd.Document = pd;
        ppd.ShowDialog();
    }

    void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        for (int y = 100; y < 400; y += 25)
        {
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;

            e.Graphics.DrawRectangle(Pens.Black, new Rectangle(5, y, 840, 25));
        }

        e.HasMorePages = false;
    }

关于为什么关闭的任何想法?这应该是微不足道的,但事实并非如此。

编辑: 我发现它不仅仅是文本......它打印的一切都只是一点点。我更新了上面的代码以提供更好的问题示例。只需将其放入带有按钮的表单中即可。

编辑 2: 根据给出的答案,我修改了代码,现在可以使用了。我正在为那些可能想要查看它的人提供最终代码。我必须识别我是在 PrintPreview 对话框中还是在纸上看到它,所以我有一个 IsPreview 标志来处理这个。

公共(public)部分类 Form1 : 表单
{
    bool IsPreview = true;

    公共(public) Form1()
    {
        初始化组件();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        IsPreview = true;
        PrintDocument pd = new PrintDocument();

        pd.EndPrint += new PrintEventHandler(pd_EndPrint);
        pd.PrintPage += new PrintPageEventHandler(pd_PrintPage);


        PrintPreviewDialog ppd = new PrintPreviewDialog();

        ((Form)ppd).WindowState = FormWindowState.Maximized;

        ppd.Document = pd;
        ppd.ShowDialog();
    }

    void pd_EndPrint(对象发送者,PrintEventArgs e)
    {
        IsPreview = false;
    }

    void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
        矩形 b3 = e.PageBounds;

        如果(IsPreview)
        {
            e.Graphics.TranslateTransform(e.PageSettings.HardMarginX, e.PageSettings.HardMarginY);
        }

        b3.Width -= (int)e.PageSettings.HardMarginX * 2;
        b3.Height -= (int)e.PageSettings.HardMarginY * 3;

        int y = b3.Y;
        整数 x=0;
        而 ((y + 25) < b3.底部)
        {
            x++;
            StringFormat sf = new StringFormat();
            sf.Alignment = StringAlignment.Center;

            矩形 R = new Rectangle(b3.X, y, b3.Width, 25);

            e.Graphics.DrawRectangle(Pens.Black, R);
            e.Graphics.DrawString(x.ToString(), this.Font, Brushes.Black, b3.X + 5, y + 5);

            y += 25;
        }
       //画出最后一点
        e.Graphics.DrawRectangle(Pens.Black, new Rectangle(b3.X, y, b3.Width, b3.Height - y));

        e.HasMorePages = false;
    }
}

最佳答案

向右偏移往往可以通过 PageSettings.HardMarginX 属性的值来解释。打印机驱动程序生成的值。然而,打印机驱动程序通常不太擅长猜测通过打印机的实际纸张路径可能是什么样子。那是机械的、压紧辊、托盘对齐等等。软件和机械工程师在一起吃午饭的次数不够多。

但是软件工程师几乎总能解决机械工程师的问题。您将需要一个选项对话框以允许用户解决机械工程师的问题。在 e.Graphics.TranslateTransform 调用中使用该值。

关于c# - 为什么 PrintPreview 与纸质打印不完全相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339351/

相关文章:

c# - .NET winforms 错误(保存文件对话框)?

html - CSS 媒体查询冲突

windows - 带有依赖服务的定时任务重启服务

c# - Newtonsoft JSON.NET 解析为自定义键/值对对象数组

c# - 获取前 5 个频繁值及其总计数 Linq-to-Sql

c# - MVC ASP 3 表连接然后显示结果

c# - WPF:如何在运行时向菜单添加新的菜单项?

c# - 在 Windows 窗体的 Web 浏览器控件中从 PDF 中获取选定的文本

c# - 如何让 WinForms 图表控制主 Y 轴绘制在图表的两边?

python - 在 Pygame 中使用 screen.blit 时可以使用 .format 功能吗?