2011-01-21 1 views
7

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

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

ответ

12

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

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

2

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

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

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

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

0

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

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

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

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

0

Ни один из предыдущих ответов не работал для меня. Я нашел решение 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)); 
Смежные вопросы