从打印预览创建的图形是纵向而不是横向?

时间:2011-10-27 14:36:32

标签: c# winforms print-preview

我在C#中打印自定义页面。实际打印文档时,它可以正常工作,就像将其显示到对话框一样(通过相同的代码)。当代码用于PrintPreview时,对话框以横向模式显示页面,但创建的Graphics具有纵向文档的尺寸,因此预览无法正确显示。这是我正在使用的代码的缩减版本

using (PrintDocument pd = new PrintDocument())
{
    pd.PrinterSettings.PrintToFile = false;
    pd.DefaultPageSettings.Landscape = true;
    pd.PrinterSettings.DefaultPageSettings.Landscape = true;
    pd.DefaultPageSettings.PrinterSettings.DefaultPageSettings.Landscape = true;

    PrintDialog pDialog = new PrintDialog();
    pDialog.Document = pd;
    pDialog.PrinterSettings.DefaultPageSettings.Landscape = true;
    pDialog.PrinterSettings.PrintToFile = false;
    pDialog.Document.DefaultPageSettings.Landscape = true;

    PrintPreviewDialog printPreview = new PrintPreviewDialog();

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

然后在Print_Me对话框请求打印时调用PrintPreview函数:

private void Print_Me(object sender, PrintPageEventArgs e)
{
    using (Graphics g = e.Graphics)
    {    
        DrawToDC(g);
        e.HasMorePages = hasMorePages;
    }
}

DrawToDC内我使用以下内容来获取尺寸,正如我所提到的,它可以正常打印并显示到对话框中:

dc.VisibleClipBounds.Width
dc.VisibleClipBounds.Height

3 个答案:

答案 0 :(得分:4)

我有完全相同的问题,并最终找到了这个。添加一个OnQueryPageSettings委托处理程序。

void OnQueryPageSettings(object obj,QueryPageSettingsEventArgs e)
{
    if (e.PageSettings.PrinterSettings.LandscapeAngle != 0)
        e.PageSettings.Landscape = true;            
}

和您的PrintDocument

prnDoc.QueryPageSettings + = new QueryPageSettingsEventHandler(OnQueryPageSettings);

为我修好了。

答案 1 :(得分:1)

我遇到了完全相同的问题。但是如果我用正确的宽度和高度绘制页面内容(即交换它们),一切都运行正常。

int width = dc.VisibleClipBounds.Width;
int height = dc.VisibleClipBounds.Height;
if(width < height)
{
    int temp = width;
    width = height;
    height = temp;
}

然后根据宽度和高度绘制页面内容。

不是最好的解决方案,但确保我们总是绘制到横向页面。

答案 2 :(得分:0)

我无法找到连接大卫博尔顿解决方案的地方,但找到了另一种方法。

http://wieser-software.blogspot.co.uk/2012/07/landscape-printing-and-preview-in-wpf.html

从根本上说,您需要在DocumentPaginator的GetPage方法返回的每个DocumentPage上设置PageSize。