ユーザーの描画を次のような別のメソッドに移動します。
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;
};