int到enum:cast工作正常,赋值失败

时间:2011-06-17 00:36:14

标签: c# .net winforms graphics enums

我正在尝试使用整数值设置一个枚举属性,例如

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 equivalent 3)或None(int equivalent 4)被赋值给对象的属性。

当枚举是一个影响铸造的类的属性时,是否存在不同之处?赋值,或者只是关于Graphics.SmoothingMode的奇怪之处,或者是什么?

5 个答案:

答案 0 :(得分:4)

查看SmoothingMode Enumeration说明。

引用:

  

默认,无和HighSpeed   等效并指定渲染   没有平滑应用。

     

AntiAlias和HighQuality是   等效并指定渲染   平滑应用。

所以基本上有三种模式:

  • 抗锯齿渲染(HighQualityAntiAlias
  • 没有抗锯齿(DefaultNoneHighSpeed
  • 无效(Invalid

代码中的枚举没有问题。以下行是合法的。

g.SmoothingMode = (SmoothingMode)2;

它只是在内部处理HighQuality的方式与AntiAlias相同。

如果你这样做:

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

x将返回SmoothingMode.AntiAlias,因为这基本相同。

答案 1 :(得分:4)

HighQuality和AntiAlias相当于规范,但.Net如何实现这一点似乎相当时髦。

我通过反射器运行了System.Drawing.Graphics并发现了一些有趣的魔法,在getter和setter中有以下变体:

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

这似乎是对一个位于GdiPlus.dll中的旧Win32 API的调用,其中数据似乎可能与输入的数据有所不同。

MSDN链接到GDI GetSmoothingMode:
http://msdn.microsoft.com/en-us/library/ms535723(v=vs.85).aspx

答案 2 :(得分:2)

根据MSDN

  

默认,无和HighSpeed   等效并指定渲染   没有平滑应用。消除锯齿   和HighQuality是等价的   使用平滑指定渲染   应用

因此,当将SmoothingMode属性设置为Default,None或HighSpeed相当于将其设置为None。 AntiAlias和HighQuality相当于将其设置为AntiAlias。

显然,您只能将Graphics.SmoothingMode设置为以下两个可能值之一:None或AntiAlias。

答案 3 :(得分:0)

啊..好吧..我认为你确实没有问题。

根据他们的规范here,他们声明“AntiAlias和HighQuality是等效的,并指定应用平滑的渲染。”

在内部,我认为它只保留“无”或“反锯齿”值。

答案 4 :(得分:0)

请参阅文档here。它说“AntiAlias和HighQuality是等效的,并指定应用平滑的渲染。”我假设enum被编码为enum SmoothingMode {AntiAliased = 2,HighQuality = 2}。执行强制转换时,将选择枚举中声明值为2的第一个项目。在这种情况下,AntiAliased首先出现,因此被选中。如果您改为从枚举值设置SmoothingMode属性,那么这不会成为问题。