2011-11-09 3 views
3

ここに私のコードです。 DrawIconはスケール変換を無視しますが、変換変換は無視します。これには特別な理由はありますか、それとも単なるバグですか?Graphics.DrawIconはスケール変換を無視しますか?

protected override void OnPaint(PaintEventArgs e) 
{ 
    Icon icon = SystemIcons.Warning; 
    Image img = icon.ToBitmap(); 

    // DrawIcon ignores this transform, but not a translate transform 
    e.Graphics.ScaleTransform(1.5f, 1.5f); 

    e.Graphics.DrawRectangle(Pens.Red, 60, 90, icon.Width, icon.Height); 
    e.Graphics.DrawString("Icon", this.Font, Brushes.Black, 100, 100); 
    e.Graphics.DrawIcon(icon, 60, 90); 

    e.Graphics.DrawRectangle(Pens.Red, 60, 190, img.Width, img.Height); 
    e.Graphics.DrawString("Bitmap", this.Font, Brushes.Black, 100, 200); 
    e.Graphics.DrawImage(img, 60, 190); 
} 

NOT ScaledScaled

答えて

3

はい、その説明があります。 GDI +は描画アイコンをサポートしていません。アイコンのサポートはまったくありません。代わりに、Graphics.DrawIcon()は、アイコンDrawIconEx()を描画するためのWindows API関数を呼び出すIcon.DrawIcon()に委譲します。そうでなければ、スケーリング係数を考慮に入れることを忘れてしまいます。 DrawIconEx()はそれをサポートしていません。 DrawIcon(Icon、Rectangle)オーバーロードを使用してこれを修正することができます。

+0

私はそれがそれのようなものかもしれないと思った。私はそれがどこにでも書かれているのを見つけられませんでした。 – climbage

3

アイコンファイル(通常は)異なるサイズと同じ画像の複数のバージョンが含まれています。 .Net Iconクラスは、アイコンファイル全体からではなく、アイコンファイルからの単一のイメージを表します。 Iconクラスインスタンスを作成するときに、サイズを選択します。

従来、アイコンファイルには2つのサイズ(16x16と32x32)しかありませんでした。あなたは望みのものを選び、スケーリングなしでそれを表示します。より新しいバージョンのWindowsはより大きなアイコンをサポートし、より大きなサイズの古いアイコンを表示するための拡大/縮小をサポートしています。

DrawIcon *関数は、このモデルに従うように設計されているようです。

  • DrawIcon(Icon、int、int)関数はスケーリングを行いません。
  • DrawIcon(Icon、Rectangle)関数はスケーリングをサポートしていますが、スケーリング変換は考慮していません。おそらくアイコンを正確なピクセルサイズにスケーリングするためです。
  • DrawIconUnstretched(Icon、Rectangle)関数は、他のDrawIconオーバーロードのいずれかとパラメータが衝突するため、異なる名前を持つ可能性があります。
関連する問題