代码之家  ›  专栏  ›  技术社区  ›  Jerry

为什么打印预览与纸张打印不完全相同?

  •  3
  • Jerry  · 技术社区  · 16 年前

    好吧,在你用StringFormat.Alignment=StringAlignment.Center垃圾邮件给我之前…听听我的问题:

    当我用以下代码绘制文本时,字符串在打印预览中居中,但在打印时不在实际纸张上居中。整个页面向右偏一点,因此有些内容在打印预览时显示为打印,但在打印时会从纸张上脱落(不只是超出页边空白范围,而是从纸张上脱落)。

    private void button1_click(object sender,eventargs e)
    {
    printDocument pd=new printDocument();
    
    pd.printpage+=新的printpageeventhandler(pd_printpage);
    
    printPreviewDialog ppd=新建printPreviewDialog();
    
    ((窗体)ppd).windowstate=form windowstate.maximized;
    
    ppd.document=pd;
    ppd.showDialog();
    }
    
    void pd_printpage(对象发送方,printpageEventargs e)
    {
    对于(int y=100;y<400;y+=25)
    {
    stringFormat sf=new stringFormat();
    sf.alignment=stringAlignment.center;
    
    E.图形.画矩形(钢笔.黑色,新矩形(5,Y,840,25));
    }
    
    e.hasmorepages=false;
    }
    < /代码> 
    
    

    有没有想过为什么它会关闭?这应该是微不足道的,但事实并非如此。

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

    edit 2:给出答案后,我修改了代码,现在可以工作了。我正在为那些可能想看到它的人提供最终代码。我必须认识到我是在打印预览对话框中还是在纸上看到它,所以我有一个ispreview标志来处理这个问题。

    <> <代码> >

    public分部类form1:form
    {
    bool ispreview=true;
    
    公共窗体()
    {
    初始化组件();
    }
    
    专用的void按钮1_click(对象发送器,事件参数e)
    {
    ispreview=真;
    printDocument pd=new printDocument();
    
    pd.endprint+=新的printEventHandler(pd_endprint);
    pd.printpage+=新的printpageEventHandler(pd_printpage);
    
    
    printPreviewDialog ppd=新建printPreviewDialog();
    
    ((窗体)ppd).windowstate=form windowstate.maximized;
    
    ppd.document=pd;
    ppd.showDialog();
    }
    
    void pd_endprint(对象发送器,printEventArgs e)
    {
    ispreview=false;
    }
    
    void pd_printpage(对象发送方,printpageeventargs e)
    {
    矩形b3=e.pagebounds;
    
    如果(ISPREVIEW)
    {
    e.graphics.translateTransform(e.pagesettings.hardbarginx,e.pagesettings.hardbarginy);
    }
    
    b3.宽度-=(int)e.pagesettings.hardbarginx*2;
    b3.height-=(int)e.pagesettings.hardbarginy*3;
    
    In=b3.y;
    int x=0;
    同时(Y+25)<b3.底部)
    {
    X++;
    stringFormat sf=new stringFormat();
    sf.alignment=stringAlignment.center;
    
    矩形R=新矩形(b3.x,y,b3.宽度,25);
    
    e.图形.画矩形(钢笔.黑色,R);
    e.graphics.drawstring(x.toString(),this.font,brush.black,b3.x+5,y+5);
    
    y+=25;
    }
    //画最后一点
    e.graphics.drawrectangle(pens.black,新矩形(b3.x,y,b3.宽度,b3.高度-y));
    
    e.hasmorepages=false;
    }
    }
    < /代码> 
    
    

    当我用以下代码绘制文本时,字符串在打印预览中居中,但在打印时不在实际纸张上居中。整个页面向右偏了一点,因此有些内容在打印预览时显示为打印,但在打印时会从纸张上脱落(不仅超出页边距范围,而且会从纸张上脱落)。

        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:给出了答案后,我修改了代码,现在可以工作了。我正在为那些可能想看到它的人提供最终代码。我必须知道我是在打印预览对话框中还是在纸上看到这个,所以我有一个ISpreview标志来处理这个问题。

    public partial class Form1 : Form
    {
        bool IsPreview = true;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        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(object sender, PrintEventArgs e)
        {
            IsPreview = false;
        }
    
        void pd_PrintPage(object sender, PrintPageEventArgs e)
        {
            Rectangle b3 = e.PageBounds;
    
            if (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;
            int x=0;
            while ((y + 25) < b3.Bottom)
            {
                x++;
                StringFormat sf = new StringFormat();
                sf.Alignment = StringAlignment.Center;
    
                Rectangle 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;
            }
            // draw the last little bit
            e.Graphics.DrawRectangle(Pens.Black, new Rectangle(b3.X, y, b3.Width, b3.Height - y));
    
            e.HasMorePages = false;
        }
    }
    

    2 回复  |  直到 12 年前
        1
  •  6
  •   dotNET    12 年前

    偏右往往可以用 PageSettings.HardMarginX 财产。由打印机驱动程序产生的值。但是,打印机驱动程序通常不擅长猜测通过打印机的实际纸张路线可能是什么样子。这是机械的,夹送辊,托盘对齐等等。软件工程师和机械工程师经常不在一起吃午饭。

    但软件工程师几乎总能解决机械工程师的问题。您需要一个选项对话框,允许用户修复机械工程师的问题。使用中的值 e.Graphics.TranslateTransform 打电话。

        2
  •  0
  •   Joel Coehoorn    16 年前

    预览与纸张不匹配的原因是您尚未选择打印机。每台打印机在不可打印区域、强制页边距等方面都有所不同。我已经有一段时间没有进行WinForms打印了,但我记得传递的图形对象有一种方法可以解释这一点。

    推荐文章