1

PrintDocument および PrintPreviewDialog クラスをいじって学習していますが、プリンターに送信されたときにドキュメントを印刷できないようです。また、PrintPreviewDialog には何も描画されず、白い空白のページでさえありません。すべて灰色。余白を変更したり、場所を描画したり、巨大な長方形を描画したりしましたが、何も表示されません。私は GDI+ にあまり詳しくないので、何かが足りないと確信していますが、何が見つかりません。

私が使用している関連コードは次のとおりです。

//Print
private void menuPrint_click(Object source, EventArgs e)
{
    printDocumentPage = 0;

    printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(printDocument1_PrintPage);
    printDocument1.BeginPrint += new System.Drawing.Printing.PrintEventHandler(printDocument1_BeginPrint);

    printPreviewDialog1.Document = printDocument1;
    printPreviewDialog1.ShowDialog();
}

private void printDocument1_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
{
    // Save our print action so we know if we are printing 
    // a preview or a real document.
    printAction = e.PrintAction;

    // Set some preferences, our method should print a box with any 
    // combination of these properties being true/false.
    printDocument1.OriginAtMargins = false;

    if (printAction != PrintAction.PrintToPreview)
    {
        PrintDialog printDlg = new PrintDialog();
        printDocument1.DocumentName = "Print Document Simple Text";
        printDlg.Document = printDocument1;

        // Show printer dialog
        if (printDlg.ShowDialog() == DialogResult.OK)
        {
            printDocument1.PrinterSettings = printDlg.PrinterSettings;
        }
        else
        {
            e.Cancel = true;
        }
    }
}

void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    Graphics g = e.Graphics;

    RectangleF marginBounds = e.MarginBounds;

    RectangleF printableArea = e.PageSettings.PrintableArea;

    //if (printAction == PrintAction.PrintToPreview)
        //g.TranslateTransform(printableArea.X, printableArea.Y);

    int availableWidth = (int)Math.Floor(printDocument1.OriginAtMargins ? marginBounds.Width : (e.PageSettings.Landscape ? printableArea.Height : printableArea.Width));
    int availableHeight = (int)Math.Floor(printDocument1.OriginAtMargins ? marginBounds.Height : (e.PageSettings.Landscape ? printableArea.Width : printableArea.Height));

    //g.DrawRectangle(Pens.Red, 0, 0, availableWidth - 1, availableHeight - 1);

    // Doesnt work either
    //g.DrawRectangle(Pens.Red, 0, 0, 100, 100);

    System.Drawing.Font myFont = new System.Drawing.Font("Courier New", 10, FontStyle.Underline, GraphicsUnit.Pixel);

    float lineHeight = myFont.GetHeight(g);
    float yLineTop = e.MarginBounds.Top;

    if (printDocumentPage >= m_report.PageCount)
    {
        e.HasMorePages = false;
        return;
    }

    otPage page = m_report.pageAt((int)printDocumentPage);

    for (int i = 0; i < page.LineCount ; i++)
    {
        otLine line = page.lineAt(i);

        g.DrawString(line.getPrintLine(true), myFont, Brushes.Black, e.MarginBounds, StringFormat.GenericTypographic);

        yLineTop += lineHeight;
    }

    printDocumentPage++;

    if (printDocumentPage < m_report.PageCount)
    {
        e.HasMorePages = true;
        return;
    }

    e.HasMorePages = false;
}

PrintPreviewDialog が表示され、両方のイベント ハンドラーが実行され、行を正しくループしてそれぞれを描画しますが、ダイアログには何も描画されず、プリンターに送信されると空のページが印刷されます。PrintPreviewDialog はすべて灰色で、白いページなどはなく、すべてのレベルでズームしても何も起こりません。

編集: 現在のページ/行の処理を取り除き、単一の文字列、任意の文字列、または四角形を描画しようとしても、も機能しません。

印刷プレビュー画面のスクリーンショットです。ズーム/ページを変更しても何も起こりません:ここに画像の説明を入力

EDIT2:

この非常に単純なサンプル プロジェクトをhttp://www.c-sharpcorner.com/uploadfile/mahesh/printpreviewcontrol-in-c-sharp/からダウンロードしました。箱から出してすぐに、これは同じことを行います。灰色の画面 (およびフォーム上のボタン) のみが表示されます。printpreviewcontrol には何も印刷されません。

何が問題なのですか?

EDIT3:

これを別の開発マシンでテストしたところ、正常に動作しました。私のコンピュータで動作しないのはなぜですか? 他のコンピューターは 64 ビットですが、これは 32 ビットですが、同じ設定で構築されています。.NET フレームワークが台無しになっている可能性がありますか?

EDIT4:

すべての編集で申し訳ありません。デフォルトのプリンターを切り替えると、完全に機能することがわかりました。e.MarginBounds と関係があります。

4

0 に答える 0