2011-06-17 17 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(int equivalent 4)のいずれかになります。

enumが、キャスト&の割り当てに影響を与えるクラスのプロパティであるか、Graphics.SmoothingModeについて何か奇妙なもの、または何かについて異なることがありますか?

+0

OK、誰もがほとんどのSmoothingMode列挙値が機能的に同等であることを指摘しています。しかし、なぜそれが単なる十分に残っておらず、現状のままで価値を割り当てることができないのかについての説明はありません。だから、_my_理論は、この一見強制的に等価が 'Grahpics'プロパティの' get'メソッドの内部で実装されているということです。 –

答えて

4

SmoothingMode Enumerationの説明をご覧ください。

引用:

デフォルト、なし、および高速同等 であり、適用された平滑化せずに をレンダリングする指定。

AntiAliasとHighQualityは に相当し、 スムージングが適用されたレンダリングを指定します。

  • アンチエイリアスレンダリング(HighQualityAntiAlias
  • なしアンチエイリアス(DefaultNoneHighSpeed
  • 無効(Invalid

だから基本的に3つのモードがありますpはありませんあなたのコードに列挙された問題。次の行は合法です。

g.SmoothingMode = (SmoothingMode)2; 

それはちょうど、内部でそれがAntiAliasがそうであるようにHighQuality同じように扱います。

そうした場合:

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

xは、基本的にこれと同じようSmoothingMode.AntiAliasを返します。 MSDNによると

2

デフォルト、なし、および高速は同等 であり、適用された平滑化せずに をレンダリングする指定します。 AntiAlias とHighQualityは同等で、 はスムージングレンダリングを指定します が適用されます。

したがって、SmoothingModeプロパティをDefault、NoneまたはHighSpeedのいずれかに設定すると、Noneに設定することと同等です。AntiAliasとHighQualityは、AntiAliasに設定​​するのと同じです。

明らかに、Graphics.SmoothingModeは、NoneまたはAntiAliasの2つの値のいずれかに設定できます。

0

ああ..私はあなたが実際に問題があるとは思わない。

仕様「here」から、「AntiAliasとHighQualityは同等であり、スムージングが適用されたレンダリングを指定しています」と記載されています。

内部的には、「none」または「anti-aliased」の値しか維持していないと思います。

4

HighQualityとAntiAliasは仕様ごとに同等ですが、.Netがこれを達成する方法はかなりファンキーなようです。

私は反射鏡を通じてSystem.Drawing.Graphicsを走り、ゲッターとセッターで、次の変種で、起こっていくつかの興味深いの魔法を見つけました:

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

これは、いくつかの古いのWin32 APIの呼び出しのように見えますGdiPlus.dllにあり、データは入力されたものとは異なる可能性があります。 GDI GetSmoothingModeへ

MSDNのリンク:
http://msdn.microsoft.com/en-us/library/ms535723(v=vs.85).aspx

+0

-1 - なぜこれがupvotedであるかわかりません。これは間違った説明です。これは、この列挙が定義されている方法である: 'パブリック列挙SmoothingMode { アンチエイリアス= 4、 デフォルト= 0、 高品質= 2、 高速= 1、 無効= -1、 なし= 3 }' –

+0

を使用するだろうあなたの答えは質問に関連していないことに同意しますか? –

+0

ええ、私はすべてのSmoothingMode値の実際の等価物を私に与えた少しのコードを実行していました。そしてAlex Azaは正しいです。 –

0

ドキュメントhereを参照してください。 "AntiAliasとHighQualityは同等で、スムージングを適用したレンダリングを指定しています。" EnumがEnum SmoothingMode {AntiAliased = 2、HighQuality = 2}のようにコード化されていると仮定しています。キャストが実行されると、値2の列挙で宣言された最初の項目が選択されます。この場合、AntiAliasedが最初に表示され、選択されます。代わりに、代わりにEnum値からSmoothingModeプロパティを設定すると問題はありません。

関連する問題