回答編集履歴

2 追加要件に対応

umed0025

umed0025 score 652

2016/03/26 16:50  投稿

フォーム上で描写されているRichTextBoxのイメージ取る形でよければこんな感じでしょうか?
やってることは、RichTextBox(Control)の座標を元にキャプチャしてるだけです。
PictureBoxを指定すれば、RichTextBoxを埋め込んだ感じのイメージがとれるかと。
``` C#
public static Bitmap ToBmp(Control control)
{
   control.Update();
   Bitmap bmp = new Bitmap(control.Width, control.Height);
   using (Graphics graphics = Graphics.FromImage(bmp))
   {
       graphics.CopyFromScreen(control.PointToScreen(Point.Empty), Point.Empty, control.Size);
   }
   return bmp;
}
```
注意:フォームに描画されていないものはこの方法でとれなかったはず。
注意:フォームに描画されていないものはこの方法でとれなかったはず。
追記
===
要件が追加されたので違うサンプルを。gdi32 BitBltを使う方法になります。
PrintWindowあたりでもいーんですが取れないことがあるんでこっちで。
[BitBlt](http://www.pinvoke.net/default.aspx/gdi32/BitBlt.html)
[PrintWindow](http://www.pinvoke.net/default.aspx/user32.printwindow)
```C#
//using System.Drawing;
//using System.Windows.Forms;
//using System.Runtime.InteropServices;
[DllImport("gdi32.dll")]
private static extern int BitBlt(IntPtr hDestDC, int x, int y, int nWidth, int nHeight, IntPtr hSrcDC, int xSrc, int ySrc, int dwRop);
public static Bitmap CaptureControl(Control target)
{
   Bitmap caputuredBitmap;
   using (Graphics targetGraphic = target.CreateGraphics())
   {
       caputuredBitmap = new Bitmap(target.Width, target.Height);
       using (Graphics capturedGraphics = Graphics.FromImage(caputuredBitmap))
       {
           IntPtr targetDc = targetGraphic.GetHdc();
           IntPtr capturedDc = capturedGraphics.GetHdc();
           BitBlt(capturedDc, 0, 0, target.Width, target.Height, targetDc, 0, 0, 0xCC0020);
           targetGraphic.ReleaseHdc(targetDc);
           capturedGraphics.ReleaseHdc(capturedDc);
       }
   }
   return caputuredBitmap;
}
```
1 誤字修正

umed0025

umed0025 score 652

2016/03/26 13:51  投稿

フォーム上で描写されているRichTextBoxのイメージ取る形でよければこんな感じでしょうか?
やってることは、PictureBox(Control)の座標を元にキャプチャしてるだけです。
やってることは、RichTextBox(Control)の座標を元にキャプチャしてるだけです。
PictureBoxを指定すれば、RichTextBoxを埋め込んだ感じのイメージがとれるかと。
``` C#
public static Bitmap ToBmp(Control control)
{
   control.Update();
   Bitmap bmp = new Bitmap(control.Width, control.Height);
   using (Graphics graphics = Graphics.FromImage(bmp))
   {
       graphics.CopyFromScreen(control.PointToScreen(Point.Empty), Point.Empty, control.Size);
   }
   return bmp;
}
```
注意:フォームに描画されていないものはこの方法でとれなかったはず。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る