2011-06-17 30 views
2

我想设置一个属性,它是使用一个整数值的枚举,像INT到枚举:投做工精细,分配失败

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.SmoothingModeAntiAlias而不是HighQuality。实际上,无论我输入什么数字,赋值都会导致将AntiAlias(int等效3)或None(等于4)分配给该对象的属性。

当enum是一个影响铸造&赋值的类的属性时有什么不同,或者只是对Graphics.SmoothingMode有些奇怪,或者是什么?

+0

好吧,所以大家都指出,大多数SmoothingMode枚举值在功能上是等价的。然而,没有解释为什么它不能保持足够的独立性并允许价值分配保持原样。因此,_my_理论认为,这种看似强制的等价是在'Grahpics'属性的'get'方法中实现的...... – 2011-06-17 19:58:21

回答

4

看一看SmoothingMode Enumeration的说明。

引用:

默认,无和高速是 等效并指定渲染 而不平滑施加。

AntiAlias和HighQuality相当于 ,并指定使用平滑处理应用 。

所以基本上有三种模式:

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

没有p在代码中列举枚举。以下行是合法的。

g.SmoothingMode = (SmoothingMode)2; 

它只是在内部把HighQuality相同的方式,它AntiAlias

如果你这样做:

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

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

2

根据MSDN

默认,无和高速是 等效并指定渲染 而不平滑施加。 AntiAlias 和HighQuality是等效的, 指定了应用平滑 的渲染。

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

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

0

啊..好吧..我不认为你真的有问题。

从他们的规格here中,他们声明“AntiAlias和HighQuality是等价的,并指定了应用平滑的渲染。”

在内部,我认为它只保留“none”或“anti-aliased”值。

4

HighQuality和AntiAlias是相同的规范,但是.net如何完成这似乎是相当时髦。

我跑了通过反射System.Drawing.Graphics,发现了一些有趣的魔术正在进行中,在吸气以下和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

+0

-1 - 不确定我明白为什么这是upvoted。这是错误的解释。这是此枚举是如何定义的:'公共枚举SmoothingMode { 消除锯齿= 4, 默认= 0, 高质量= 2, 高速= 1, 无效= -1, 无= 3 }' – 2011-06-17 01:17:59

+0

你会同意你的回答与问题无关? – 2011-06-17 01:33:32

+0

是的,我已经运行了一段代码,它给了我所有SmoothingMode值的实际int等值,Alex Aza是正确的。 – 2011-06-17 19:43:27

0

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