3

テーブル印刷の目的で、テキストの高さを測定しようとしています。

これがコードです。私の場合、プレビューと実際のページに異なる数字が出力されます。現在、Microsoft Office Document Image Writer 以外のプリンターを試すことはできませんが、プリンターの問題ではないと確信しています。

おそらく、誰かがこの問題の回避策を見つけましたか?

    private void button1_Click(object sender, EventArgs e)
    {
        Print();
    }

    public void Print()
    {
        PrintDocument my_doc = new PrintDocument();
        my_doc.PrintPage += new PrintPageEventHandler(this.PrintPage);

        PrintPreviewDialog my_preview = new PrintPreviewDialog();
        my_preview.Document = my_doc;

        my_preview.ShowDialog();

        my_doc.Dispose();
        my_preview.Dispose();
    }

    private void PrintPage(object sender, 
       System.Drawing.Printing.PrintPageEventArgs e)
    {
        e.Graphics.PageUnit = GraphicsUnit.Pixel;

        string s = "String height is ";

        SizeF h = e.Graphics.MeasureString(s, new Font("Arial", 24));

        e.Graphics.DrawString(s + Convert.ToString(h.Height), 
           new Font("Arial", 24), new SolidBrush(Color.Black), 1, 1);
    }
4

4 に答える 4

1

問題は System.Drawing.Graphics が GDI+ に基づいていることだと思いますが、実際の印刷は GDI に基づいています。

MeasureString への呼び出しを置き換えて、GDI ベースのメソッドを使用できます。

SizeF hT = TextRenderer.MeasureText(s, new Font("Arial", 24));

System.Windows.Forms.TextRenderer クラスは、Windows オペレーティング システムに期待される Windows フォーム コントロールの複雑なスクリプトと同じレベルのサポートを提供するために開発されました。この TextRenderer は、Windows Unicode Script Processor (Uniscribe) を使用する GDI テキスト レンダリング API に基づいています。[MSDN より]

詳細については、テキスト レンダリングに関する MSDN マガジンの次の優れた記事を参照してください。

テキスト レンダリング: Windows フォーム コントロールで複雑なスクリプトを使用して、世界対応のアプリを構築する

于 2008-12-09T21:23:24.433 に答える
0

PrintPageイベントでGraphics.Pixel以外のPageUnitを試してください。インチ、ミリメートル、またはポイント(とりわけ)は、プレビューまたは印刷で同じ結果をもたらすはずです。ピクセルプレビュー画面とプリンターのピクセル解像度が異なるため、そうしないと思います。

于 2008-11-19T06:00:34.757 に答える
0

利用可能なすべてのPageUnitを試しましたが、違いはありませんでした。プレビューの高さと印刷の高さの比率は約1.029336で、一定です。

PS。実際、私は回避策を見つけました。MeasureStringを使用して行数をカウントし、それをFontクラスから派生した文字の高さで乗算して、テキストチャンクの高さをカウントします。それはいくつかの調整でうまく機能します。

于 2008-11-19T06:22:51.513 に答える