Как вручную получить экземпляр объекта Graphics в WinForms? - PullRequest
8 голосов
/ 21 января 2011

Я знаю, как работать с объектом типа Graphics (по крайней мере, я могу отображать изображения), но я всегда делаю это, передавая графический объект, полученный из метода OnPaint.

Я хотел бы отобразить изображениекогда приложение открыто (т.е. в методе Form_Load), но не имеет ни малейшего понятия, как получить экземпляр объекта Graphics, который я мог бы использовать?Спасибо

Ответы [ 5 ]

13 голосов
/ 21 января 2011

Использование объекта e.Graphics, который вам предоставляет OnPaint (), является правильным способом сделать это.Он будет запущен сразу после метода OnLoad ().Форма еще не видна в OnLoad.

Поддерживается получение графического объекта из Control.CreateGraphics ().Однако все, что вы рисуете с этим, будет уничтожено, как только форма перекрасится.Что происходит, когда пользователь перемещает другое окно через ваше (до Aero) или когда он минимизирует и восстанавливает или иным образом изменяет размеры окна.Используйте CreateGraphics только при анимации с высокой скоростью.

2 голосов
/ 21 января 2011

Если вы пытаетесь создать графический объект на поверхности вашей формы, вы можете использовать this.CreateGraphics

Если вы пытаетесь создать новое изображение, вы всегда можете инициализировать Imageи затем вызовите Graphics.CreateGraphics.FromImage(YourImage) например

Bitmap b = new Bitmap(100,100);
var g = Graphics.CreateGraphics.FromImage(b);

. На этом этапе любой рисунок, выполненный с вашим графическим объектом, будет нарисован на вашем изображении.

0 голосов
/ 22 мая 2017

Ни один из предыдущих ответов не работал для меня. Я нашел решение Rajnikant Rajwadi эффективным (см. https://social.msdn.microsoft.com/Forums/vstudio/en-US/ce90eb80-3faf-4266-b6e3-0082191793f7/creation-of-graphics-object-in-wpf-user-control?forum=wpf)

Вот ужасно сжатый звонок Graphics.MeasureString(). (пожалуйста, код более ответственно)

SizeF sf = System.Drawing.Graphics.FromHwnd(new System.Windows.Interop.WindowInteropHelper(this).Handle).MeasureString("w", new Font(TheControl.FontFamily.ToString(), (float)TheControl.FontSize));
0 голосов
/ 21 января 2011

А как вы планируете использовать графический объект, который вы получили в событии Load?

Если вы хотите нарисовать что-то на экране, вы должны быть в событии Paint, или он будет очищенна следующем рисунке.

Что вы можете сделать: загрузить другую (простую) форму, просто с изображением, и скрыть ее, когда ваша основная форма загружена.

Поскольку ваше событие Load, вероятно, будет выполняться в потоке пользовательского интерфейса.Вызовите DoEvents, чтобы появилась другая форма.

0 голосов
/ 21 января 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...