2011-06-17 33 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屬性。