int в enum: приведение работает отлично, назначение не выполнено - PullRequest
2 голосов
/ 17 июня 2011

Я пытаюсь установить свойство, являющееся перечислением, используя целочисленное значение, например

Graphics g = this.CreateGraphics();
int enumValue = 2; // corresponds to SmoothingMode.HighQuality
g.SmoothingMode = (SmoothingMode)2; // does not have expected result
// also tried:
SmoothingMode sm = (SmoothingMode)Enum.ToObject(typeof(SmoothingMode), enumValue); // works correctly
g.SmoothingMode = sm; // still doesn't work!

Но свойство объекта никогда не устанавливается в правильное значение перечисления.Я выполнил это через отладчик VS2010, и приведение и / или использование Enum.ToObject работает правильно, но после назначения g.SmoothingMode равно, например, AntiAlias ​​ вместо HighQuality.На самом деле, независимо от того, какое число я произнесу, назначение всегда приводит к тому, что AntiAlias ​​(int эквивалент 3) или None (int эквивалент 4) присваивается свойству объекта.

Есть ли что-то другое, когда перечислениеэто свойство класса, которое влияет на приведение и присвоение, или просто что-то странное в Graphics.SmoothingMode, или что?

Ответы [ 5 ]

4 голосов
/ 17 июня 2011

HighQuality и AntiAlias ​​эквивалентны в соответствии со спецификацией, однако то, как .Net выполняет это, кажется довольно прикольным.

Я запустил System.Drawing.Graphics через рефлектор и обнаружил некоторую интересную магию, с вариантамив getter и setter:

int status = SafeNativeMethods.Gdip.GdipGetSmoothingMode(new HandleRef(this, this.NativeGraphics), out smoothingMode);
// ...
return smoothingMode;

Это, кажется, вызов некоторого старого Win32 API, расположенного в GdiPlus.dll, где данные, кажется, возвращаются потенциально отличные от введенных.

MSDN Ссылка на GDI GetSmoothingMode:
http://msdn.microsoft.com/en-us/library/ms535723(v=vs.85).aspx

4 голосов
/ 17 июня 2011

Взгляните на SmoothingMode Enumeration description.

Цитата:

По умолчанию, Нет и Высокая скорость эквивалент и указать рендеринг без сглаживания.

AntiAlias ​​и HighQuality эквивалентный и указать рендеринг с применяется сглаживание.

Так что в основном есть три режима:

  • сглаженный рендеринг (HighQuality, AntiAlias)
  • без сглаживания (Default, None, HighSpeed
  • неверно (Invalid)

Нет проблем с перечислением в вашем коде. Следующая строка является допустимой.

g.SmoothingMode = (SmoothingMode)2;

Он просто внутренне обрабатывает HighQuality так же, как AntiAlias.

Если вы делаете:

g.SmoothingMode = SmoothingMode.HighQuality;
var x = g.SmoothingMode;

x вернет SmoothingMode.AntiAlias, так как это в основном то же самое.

2 голосов
/ 17 июня 2011

Согласно MSDN :

По умолчанию, Нет и Высокая скорость эквивалент и указать рендеринг без сглаживания. AntiAlias и HighQuality эквивалентны и указать рендеринг со сглаживанием приложенное.

Таким образом, если для свойства SmoothingMode задано значение «По умолчанию», то значение «Нет» или «HighSpeed» эквивалентно значению «Нет». AntiAlias ​​и HighQuality эквивалентны установке его в AntiAlias.

Очевидно, вы можете установить для Graphics.SmoothingMode только одно из двух возможных значений: Нет или AntiAlias.

0 голосов
/ 17 июня 2011

См. Документацию здесь . В нем говорится: «AntiAlias ​​и HighQuality эквивалентны и определяют рендеринг с примененным сглаживанием». Я предполагаю, что перечисление закодировано так, что перечисление SmoothingMode {AntiAliased = 2, HighQuality = 2}. Когда приведение произойдет, будет выбран первый элемент, объявленный в перечислении со значением 2. В этом случае сначала появляется AntiAliased, поэтому он выбирается. Это не будет проблемой, если вместо этого вы установите свойство SmoothingMode из значения перечисления.

0 голосов
/ 17 июня 2011

Ах .. Хорошо .. Я не думаю, что у вас действительно есть проблема.

Из их спецификаций здесь они утверждают, что "AntiAlias ​​и HighQuality эквивалентны и определяют рендеринг с помощьюприменяется сглаживание. "

Внутренне я думаю, что он поддерживает только значения" none "или" anti-aliased ".

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