Graphics
является "контекстом устройства" объектом.Он обрабатывает рисунки в Bitmap
, но не может быть преобразован обратно в Bitmap
.
Однако вы можете скопировать биты, уже нарисованные на вашем окне, и нарисовать на Graphics
.Например:
protected override void OnMouseClick(MouseEventArgs e)
{
base.OnMouseClick(e);
//get the screen coordinates for this window
var rect = this.RectangleToScreen(this.ClientRectangle);
//copy bits from screen to bitmap
using (var bmp = new Bitmap(rect.Width, rect.Height))
{
var gr = Graphics.FromImage(bmp);
gr.CopyFromScreen(rect.Left, rect.Top, 0, 0, rect.Size);
//save to file
bmp.Save(@"c:\test\test.bmp");
}
}
Или вы можете сделать это сразу после рисования в ответ на сообщения Windows, но вам нужно позвонить Graphics::Flush
, чтобы сообщить Windows, когда вы закончите рисовать.Этот метод предполагает, что целевое окно является видимым.Между командами может быть задержка, или часть окна не видна, и вы не получите желаемый результат.
В другом ответе предлагается лучшее решение: создать растровое изображение памяти и нарисоватьк этому.
Если вы не хотите повторять код, вы можете создать функцию, которая обрабатывает все рисунки как для контекста устройства окна, так и для контекста устройства памяти:
public void do_all_paintings(Graphics gr)
{
//paint something random, add all other drawings
gr.Clear(Color.Red);
}
Теперь рисуйте в ответв запрос рисования Windows:
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
do_all_paintings(e.Graphics);
}
Используйте ту же функцию do_all_paintings
для создания файла в ответ на команду:
protected override void OnMouseClick(MouseEventArgs e)
{
base.OnMouseClick(e);
var rect = this.RectangleToScreen(this.ClientRectangle);
using (var bmp = new Bitmap(rect.Width, rect.Height))
{
do_all_paintings(Graphics.FromImage(bmp));
bmp.Save(@"c:\test\test.bmp");
}
}