0

現在、WM_PRINT 呼​​び出しを使用して、コントロールをグラフィック オブジェクトにレンダリングしています。

GraphicsState backup = graphics.Save();
graphics.TranslateTransform(50, 50);

IntPtr destHdc = graphics.GetHdc();

const int flags = (int)(DrawingOptions.PRF_CHILDREN | DrawingOptions.PRF_CLIENT | DrawingOptions.PRF_NONCLIENT);
NativeMethods.SendMessage(srcControl.Handle, (Int32)WM.WM_PRINT, (IntPtr)destHdc, (IntPtr)flags);
graphics.ReleaseHdc(destHdc);
graphics.DrawLine(Pens.Blue, new Point(), new Point(srcControl.Width, srcControl.Height));

graphics.Restore(backup);

DrawToBitmap メソッドは画面外にあるコントロールを処理しないため、control.DrawToBitmap() ではなく WM_PRINT コマンドを使用する必要があります。

このコードは、青い線の描画を 50,50 で正しく変換しますが、コントロールは左上隅 (0,0) にレンダリングされます。WM_PRINT コマンドを使用して特定の場所 (50,50) に印刷する方法はありますか?

ありがとう

4

1 に答える 1

0

これは、が 経由ではなく をWM_PRINT使用しているため、は影響を受けません。で呼び出された描画メソッドでのみ影響を受けます。回避策は次のとおりです。Device contextgraphicstranslate transformgraphics

GraphicsState backup = graphics.Save();
Bitmap bm = new Bitmap(srcControl.Width, srcControl.Height);
Graphics g = Graphics.FromImage(bm);
IntPtr destHdc = g.GetHdc();

const int flags = (int)(DrawingOptions.PRF_CHILDREN | DrawingOptions.PRF_CLIENT |     DrawingOptions.PRF_NONCLIENT);
NativeMethods.SendMessage(srcControl.Handle, (Int32)WM.WM_PRINT, destHdc,  (IntPtr)flags);
g.ReleaseHdc(destHdc);
graphics.DrawImage(bm, new Point(50,50));
graphics.DrawLine(Pens.Blue, new Point(), new Point(srcControl.Width, srcControl.Height));

graphics.Restore(backup);
于 2013-08-18T10:54:26.617 に答える