0

override Paint()自分の図面を使用するUserControlがあります。ユーザーが印刷できるようにしたい。

私はすでに多くの時間を書いているので、public void Draw(Graphics e)このメソッドを再利用して、を渡すことを望んでいましたPrintEventArgs.Graphics。それほど単純ではないことに気づきました。私もそれを自分でページングする必要があります。

「最適」または「100%スケール」の種類の印刷機能を計算するために使用できるOpenGL「プロジェクションマトリックス」のようなものはありますか?

4

2 に答える 2

0

Graphicsオブジェクトには、MatrixタイプのTransformプロパティがあり、OpenGLマトリックスとほぼ同じ方法で、描画されたグラフィックを拡大縮小、回転などするために使用できます。

于 2012-08-27T16:38:39.350 に答える
0

ユーザーの描画を次のような別のメソッドに移動します。

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        Rectangle client=new Rectangle(0, 0, ClientSize.Width-1, ClientSize.Height-1);
        Render(e.Graphics, client);
    }

    public void Render(Graphics g, Rectangle client)
    {
        g.DrawEllipse(Pens.Blue, client); //test draw
        //...
    }

次に、印刷ドキュメントから呼び出します。

    private void button1_Click(object sender, EventArgs e)
    {
        PrintPreviewDialog dlg=new PrintPreviewDialog();
        PrintDocument doc=new PrintDocument();

        doc.PrintPage+=(s, pe) =>
        {
            userControl11.Render(pe.Graphics, pe.PageBounds); // user drawing
            pe.HasMorePages=false;                
        };
        doc.EndPrint+=(s, pe) => { dlg.Activate(); };
        dlg.Document=doc;
        dlg.Show();            
    }

結果: スクレンショット

編集1 印刷出力で同じピクセル数を維持するには、印刷ルーチンを次のように変更します。

        doc.PrintPage+=(s, pe) =>
        {
            Rectangle client = new Rectangle(
                pe.PageBounds.Left, 
                pe.PageBounds.Top,
                userControl11.ClientSize.Width-1,
                userControl11.ClientSize.Height-1 );
            userControl11.Render(pe.Graphics, client);
            pe.HasMorePages=false;                
        };
于 2012-08-27T17:20:44.240 に答える