2017-09-11 42 views
0

我在Windows 10上運行,但使用Delphi 7(是的,我知道這是相當古老)。Windows小系統圖標高度不正確

我想使用Windows中的系統圖標,並通過定義TImageList稱爲SystemIcons了關於這個,我初始化如下:

var 
    fileInfo: TSHFileInfo; 

begin 
    SystemIcons.Handle := ShGetFileInfo('', 0, fileInfo, SizeOf(fileInfo), 
    SHGFI_ICON or SHGFI_SMALLICON or SHGFI_SYSICONINDEX); 

... 

我有靜態設定爲與寬度的TImageList組件SystemIcons性能和高度設置爲16.

在其他地方,我希望從給定有效shell對象的圖像索引的圖像列表中檢索圖標。因爲這些是「小系統圖標」,我預計它們是16x16。調用GetSystemMetrics(SM_CYSMICON)的結果得出16.奇怪的是,尺寸取決於我是將它們檢索爲位圖還是圖標。

... 
var 
    icon: TIcon; 
    bm: TBitmap; 

begin 
    ... 
    icon := TIcon.Create; 
    SystemIcons.GetIcon(imgIndex, icon); 

    bm := TBitmap.Create; 
    SystemIcons.GetBitmap(imgIndex, bm); 

imgIndex在這兩種情況下都是正確的。按預期檢索到的圖像在每種情況下都是相同的。位圖的尺寸(bm.Widthbm.Height)也如預期:16x16。但是,圖標的尺寸(icon.Widthicon.Height)不是。他們是32x32。

當我在畫布上繪製圖標時,它顯示爲16x16。所以只有它的HeightWidth值看起來不正確。很奇怪。

爲什麼這些不同?

+0

計算機上連接了多少個屏幕。他們中的一個是高分辨率的嗎? –

+0

@DavidHeffernan只有一個屏幕。我正在使用筆記本電腦。 – lurker

回答

0

圖像實際上可能是32x32開頭。

在內部,TImageList.GetIcon()簡單地檢索所選擇的直接從基礎Win32 API的ImageList圖像的HICON,使用ImageList_GetIcon(),並分配該至TIcon.Handle屬性。另一方面,

TImageList.GetBitmap()有點不同。它將TBitmap大小設置爲TImageList(16x16)的尺寸,然後使用TImageList.Draw()將選定圖像繪製到TBitmap.Canvas上,然後使用ImageList_DrawEx()

+0

爲什麼'GetSystemMetrics(SM_CYSMICON)'返回16?而當我將圖標作爲圖標繪製在屏幕上而不是位圖時,顯示爲16x16?這只是看起來不錯的「高度」和「寬度」屬性。所有其他行爲表明它是16x16。 – lurker

+0

@lurker:如果你閱讀文檔,'SM_CYSMICON'是一個「推薦」高度,而不是絕對的。另一方面,如果圖標呈現爲16x16,那麼它可能只是D7中'TIcon'屬性中的一個錯誤。例如,在D6中,如果圖標數據尚未在內存中解析,則TIcon.Height返回SM_CYICON而不是SM_CYSMICON –

+0

好的,謝謝澄清。我在描述中掩蓋了「推薦」形容詞。我傾向於認同它可能是D7處理'TIcon'中的一個錯誤。 – lurker