Я думаю, что сообщение WM_PRINT будет полезно. Вот пример, который работает почти. (Он по-прежнему печатает полосы прокрутки, а фон теряется на участках «из прокрутки».) Возможно, вы можете играть с этим и заставить его работать, или кто-то с большим опытом WinForms может перейти на следующий уровень?
Объявляет следующее в своем классе:
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
private const int WM_PRINT = 791;
/// <summary>
/// The WM_PRINT drawing options
/// </summary>
[Flags]
private enum DrawingOptions
{
/// <summary>
/// Draws the window only if it is visible.
/// </summary>
PRF_CHECKVISIBLE = 1,
/// <summary>
/// Draws the nonclient area of the window.
/// </summary>
PRF_NONCLIENT = 2,
/// <summary>
/// Draws the client area of the window.
/// </summary>
PRF_CLIENT = 4,
/// <summary>
/// Erases the background before drawing the window.
/// </summary>
PRF_ERASEBKGND = 8,
/// <summary>
/// Draws all visible children windows.
/// </summary>
PRF_CHILDREN = 16,
/// <summary>
/// Draws all owned windows.
/// </summary>
PRF_OWNED = 32
}
Затем окрасить управление растровым:
using (Bitmap screenshot = new Bitmap(this.panel1.DisplayRectangle.Width, this.panel1.DisplayRectangle.Height))
using (Graphics g = Graphics.FromImage(screenshot))
{
try
{
SendMessage(this.panel1.Handle, WM_PRINT, g.GetHdc().ToInt32(), (int)(DrawingOptions.PRF_CHILDREN | DrawingOptions.PRF_CLIENT | DrawingOptions.PRF_NONCLIENT | DrawingOptions.PRF_OWNED));
}
finally
{
g.ReleaseHdc();
}
screenshot.Save("temp.bmp");
}
EDIT: Вот альтернативная стратегия краски, которая может получить Вас что вы ищете. Я делаю некоторые предположения, но, возможно, это сработает. Он рисует фиктивный фон на Bitmap первым, а также удаляет скроллбар:
using (Bitmap screenshot = new Bitmap(this.panel1.DisplayRectangle.Width, this.panel1.DisplayRectangle.Height))
using (Graphics g = Graphics.FromImage(screenshot))
{
g.FillRectangle(SystemBrushes.Control, 0, 0, screenshot.Width, screenshot.Height);
try
{
SendMessage(this.panel1.Handle, WM_PRINT, g.GetHdc().ToInt32(), (int)(DrawingOptions.PRF_CHILDREN | DrawingOptions.PRF_CLIENT | DrawingOptions.PRF_OWNED));
}
finally
{
g.ReleaseHdc();
}
screenshot.Save("temp.bmp");
}
Спасибо! Кажется, это единственный способ на данный момент! Немного работы, хотя !! Еще раз спасибо!! – Shri
Эй, ребята Просто обновление об этом .... Работа была создана для создания того же элемента управления в памяти и определения пользовательской высоты и ширины, а затем вызова функции DrawToBitmap! Был приятный успех! Надеюсь, это поможет другим! – Shri
+1 для PrintDocument – hometoast