2015-02-14 3 views
1

Я использую различные типы кистей, как SolidBrush, HatchBrush и т.д .., рисовать сложные фигуры и текст в моих окнах формы управления. Код я использую,SolidBrush.Clone бросает исключение

protected void FillShape(Brush myBrush, GraphicsPath shape) 
     { 
      if (myBrush is SolidBrush) 
      { 
       using (SolidBrush sbr = myBrush.Clone() as SolidBrush) 
       { 
        //Code for drawing with solid brush 
       } 
      } 
      else if (myBrush is HatchBrush) 
      {      
        //Code for drawing with hatch brush 
      } 
      else if (myBrush is LinearGradientBrush) 
      { 
        //Code for drawing with linear gradient brush 
      } 
      else if (myBrush is PathGradientBrush) 
      { 
        //Code for drawing with path gradient brush 
      } 
     } 

Несколько раз, линия myBrush.Clone() бросает ArgumentException. Я искал MSDN ссылку для SolidBrush.Clone() метода, но нет никакой информации о каких-либо исключениях SolidBrush.Clone

Итак, я проверил исходный код этого метода в следующей ссылке Reference code for SolidBrush class

Код, используемый в System.Drawing.SolidBrush.Clone методы является

public override object Clone() 
     { 
      IntPtr cloneBrush = IntPtr.Zero; 

      int status = SafeNativeMethods.Gdip.GdipCloneBrush(new HandleRef(this, this.NativeBrush), out cloneBrush); 

      if (status != SafeNativeMethods.Gdip.Ok) 
       throw SafeNativeMethods.Gdip.StatusException(status); 

      // We intentionally lose the "immutable" bit. 

      return new SolidBrush(cloneBrush); 
     } 

Очевидно, что метод Clone может бросить исключение, но я не в состоянии определить, когда и почему он будет бросать исключение, так как этот код не мой.

Кто-нибудь знает, когда и почему исключение будет выбрано этим методом?

Edit:

Прикрепленный изображение показывает детали исключения

Exception Image

Кроме того, это не система кисти, потому что immutable свойство кисти false

Not a system brush

+0

Не уверен, что это связано, но поскольку вы пишете его, это может быть только иногда, возможно, это случаи, когда вы проходите стандартную кисть, которая не может быть удалена предложение use попытается сделать .. – TaW

+1

'ArgumentException' может быть что угодно, особенно если вы не укажете текст сообщения и вывод его в виде _exact_. См. Http://stackoverflow.com/help/mcve и http://stackoverflow.com/help/how-to-ask для получения информации о том, как написать хороший ответный вопрос. –

+0

Строка 'using (SolidBrush sbr = myBrush.Clone() as SolidBrush)' бессмысленна. Нет смысла создавать копию кисти только для ее удаления. Просто используйте оригинальный 'myBrush', не используя его (иначе говоря, без' использования'). – Loathing

ответ

1

Вы можете определить, является ли это ctually Clone(), который бросает исключение или распоряжение. Если вы пытаетесь избавиться или изменить SystemBrush, то исключение будет происходить:

SystemBrushes.Control.Dispose(); // ArgumentException: Changes cannot be made to Brush because permissions are not valid. 

Но клонировать его, а затем утилизации его работает отлично:

((Brush) SystemBrushes.Control.Clone()).Dispose(); // OK 

Так может быть просто избежать Clone в целом, если вы считаете, что есть проблема, например:

// instead of using clone, just make a new instance 
    Brush myBrush = SystemBrushes.Control; 
    if (myBrush is SolidBrush) { 
     using (var nb = new SolidBrush(((SolidBrush) myBrush).Color)) { 
      // ... 
     } 
    } 
+0

Спасибо за вы стараетесь, но кисть не является кистью системы, отредактировал вопрос для получения более подробной информации. – Kira

+1

@Anand Это исключение произойдет, если вы пытаетесь «клонировать» кисть, которая уже расположена. – Loathing

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