2015-02-10 3 views
0

Я получил это исключение при вызове моего проекта из API.Общая ошибка в GDI + при очистке

Метод, в котором вызывается сообщение throw из события, когда мы меняем какое-либо значение, оно будет перерисовывать фон и перерисовывать строку. Этого никогда не бывает при использовании приложения обычно, но когда я изменил значение из API, он иногда бросает это.


System.Runtime.InteropServices.ExternalException: A generic error occurred in GDI+. 
    at System.Drawing.Graphics.Clear(Color color) at MyCompany.Project.GUI.Drawable.DrawLabel() in D:\Source\MyCompany\Project\GUI\Drawable.cs:line 191 
    at MyCompany.Project.GUI.Drawable.OnPaint(PaintEventArgs e) in D:\Source\MyCompany\Project\GUI\Drawable.cs:line 26 
    at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer, Boolean disposeEventArgs) 
    at System.Windows.Forms.Control.WmPaint(Message& m) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ScrollableControl.WndProc(Message& m) 
    at System.Windows.Forms.ContainerControl.WndProc(Message& m) 
    at System.Windows.Forms.UserControl.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

Вот как мой код выглядит

public class Drawable : UserControl 
{ 
    private Graphics g; 
    public void OnPaint(PaintEventArgs e) 
    { 
     base.OnPaint(e); 
     DrawLabel(); 
    } 
    private void DrawLabel() 
    { 
     if ((TopLabels != null) || (LeftLabels != null)) 
     {  
      g.Clear(BackColor); //tje error is in here. 
      g = CreateGraphics(); 
      /* another things to do*/ 
     } 
    } 
} 

ответ

2

Вам необходимо пройти Графические из OnPaint() для вашего DrawLabel() метод.

Изменение:

DrawLabel(); 

To:

DrawLabel(e.Graphics); 

И изменение:

private void DrawLabel() 

To:

private void DrawLabel(Graphics g) 

... и избавиться от вызова CreateGraphics().

+0

Зачем мне избавляться от создания графики? Я имею в виду, что ярлык draw вызывается не только из onPaint, но и тот, кто вызывает ошибку, является красным мехом. Можете ли вы дать мне объяснение? – kfmlx

+1

Поскольку CreateGraphics() возвращает ** временную ** поверхность, которая стирается, когда элемент управления обновляется. Это почти никогда не правильный способ сделать это ... –

Смежные вопросы