2009-02-20 115 views
9

我注意到我的應用程序向Windows托盤發送了大小爲16x16像素的圖標 - 而我的Vista PC中有一個雙倍寬度的任務欄,它顯示爲18x18的圖標。我的應用程序圖標上的調整大小的工件看起來很糟糕。我怎樣才能問Windows圖標應該是多大?如何向Windows詢問系統托盤圖標的大小?

編輯:

我生成的圖標動態,具有像素字體文本覆蓋。如果動態地生成一堆圖標大小似乎很浪費,所以最好避免使用所有「可能的」大小構建圖標(而不是我甚至確定它們是什麼)。

GetSystemMetrics(SM_CXSMICON)返回16 - 錯誤的值。

GetThemeBackgroundContentRect也沒有幫助。

回答

0

以多種格式創建您的圖標,並讓Windows選擇它想要的圖標。

Here's the Wikipedia article on the .ico format.

如果你真的需要知道,GetSystemMetrics與SM_CXICON或SM_CYICON的參數會告訴你的寬度和高度的Windows要加載。

+3

這個答案的前半部分是錯誤的。通知圖標的API是`Shell_NotifyIcon`。它收到一個包含'HICON'的'NOTIFYICONDATA`。現在,`HICON`指的是一個單一的圖標,所以你必須在調用`Shell_NotifyIcon`之前決定大小。最後一段是準確的。 – 2012-12-03 19:24:24

1

馬克的核心答案是正確的:以多種格式創建您的圖標,讓Windows選擇正確的圖標。不要忘記爲HighDPI場景設置32x32和64x64圖標。

但SM_CXICON/SM_CYICON不一定會返回將在任務欄中使用的大小。任務欄爲其大小選擇正確的圖標大小(在Windows 7中,這是更重要的)。

只是提供適當大小的圖標,你應該沒問題。

+2

我想我應該提到:我正在動態生成圖標,並使用像素字體文本覆蓋。動態生成一堆圖標大小似乎很浪費。 GetSystemMetrics(SM_CXSMICON)返回16 - 不正確的值再次。 – keelo 2009-02-20 04:25:49

+1

不幸的是,信息並沒有改變我的答案 - 你仍然需要產生多個圖標大小。或者只是產生一個256x256的圖標,讓系統爲你縮小它。 – 2009-02-21 03:42:02

0

您最好的選擇可能是GetThemeBackgroundContentRect通過TBN_BACKGROUND作爲iPartId的托盤通知背景。

GetThemeBackgroundContentRect應返回當前主題定義的大小,該大小可用於繪製而不重疊父元素的邊框。如果我正確閱讀這篇文章,那將是最大尺寸的通知圖標,並且可能是正在使用的尺寸。

使用多個DPI設置進行測試可能是判斷這是否返回正確值的最簡單方法。