2011-11-09 164 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()委託給Icon.DrawIcon(),它調用Windows API函數來繪製圖標DrawIconEx()。否則代碼會忘記考慮縮放因子。可能有意爲之,因爲負面和錯誤匹配的縮放因子無法工作,DrawIconEx()不支持。你可以使用DrawIcon(Icon,Rectangle)重載來自己修改。

+0

我認爲這可能是這樣的。我無法在任何地方找到它。 – climbage

3

圖標文件(通常)包含具有不同大小的同一圖像的多個版本。 .Net Icon類表示來自圖標文件的單個圖像,而不是整個圖標文件。您在創建Icon類實例時選擇所需的大小。

傳統上,圖標文件只有兩種尺寸(16x16和32x32)。你會選擇一個你想要的,並顯示它沒有縮放。更新版本的Windows支持更大的圖標,並支持縮放以更大尺寸顯示較舊的圖標。

DrawIcon *函數似乎被設計成遵循這個模型。

  • DrawIcon(Icon,int,int)函數沒有縮放。
  • DrawIcon(圖標,矩形)函數確實支持縮放(但不考慮縮放變換,可能是因爲其意圖是將圖標縮放到精確的像素大小)。
  • DrawIconUnstretched(Icon,Rectangle)函數可能只是因爲參數與其他DrawIcon重載衝突而具有不同的名稱。