我正在尝试使用整数值设置一个枚举属性,例如
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的奇怪之处,或者是什么?
答案 0 :(得分:4)
查看SmoothingMode Enumeration说明。
引用:
默认,无和HighSpeed 等效并指定渲染 没有平滑应用。
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
,因为这基本相同。
答案 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)
答案 4 :(得分:0)
请参阅文档here。它说“AntiAlias和HighQuality是等效的,并指定应用平滑的渲染。”我假设enum被编码为enum SmoothingMode {AntiAliased = 2,HighQuality = 2}。执行强制转换时,将选择枚举中声明值为2的第一个项目。在这种情况下,AntiAliased首先出现,因此被选中。如果您改为从枚举值设置SmoothingMode属性,那么这不会成为问题。