1. 程式人生 > >Windows圖示:有一些你未必知道的東西

Windows圖示:有一些你未必知道的東西

很奇怪,我的圖示明明不是這樣的,在資源管理器的資料夾裡面,我的圖示能夠正常顯示,在桌面的工作列裡,也能正常的顯示,唯獨在工作管理員裡顯示不正常。雖然不是什麼大問題,但是如果是一個產品釋出出去,會讓人覺得很不專業,會產生一定的負面影響。 這個圖示有點像是程式沒有圖示,使用的是系統預設的圖示,或者是程式無法響應的時候顯示的圖示。 應用程式圖示是個很重要的UI元素,在很多地方會顯示。這些位置大概可以分為兩類:
  • 靜態顯示,就是程式沒有執行。比如資源管理器的資料夾裡、桌面快捷方式、開始選單等。
  • 動態顯示,就是程式執行後。比如:桌面工作列、工作管理員、程式視窗標題欄等。
靜態顯示,由於程式沒有執行,所以作業系統只能從檔案資訊中獲取應用程式的圖示。Windows程式有一個資源區,將資源以二進位制的形式存放在檔案中,而且exe可執行檔案是一個格式化的檔案,具有一定的格式,windows當然知道資源的位置,它從資源中找到圖示資源,並且顯示出來。這個功能可以使用SHGetFileInfo函式來實現。將任何一個其它檔案,比如txt檔案修改為exe副檔名,windows資源管理器也會嘗試去查詢圖示資源,當然是找不到啦,所以一般都會顯示系統預設的圖示,如上圖顯示的圖示。所以很多dos程式,在windows裡都顯示預設的圖示。 動態顯示,程式已經執行,可以接受視窗訊息。而且桌面工作列、工作管理員這兩個地方,顯示的是頂層視窗。每個視窗可以顯示不同的圖示和標題,所以這兩個地方不可能是讀取檔案資訊來獲取圖示顯示。很顯然,標題可以通過GetWindowText跨程序來獲取。那麼視窗圖示呢?視窗圖示也可以有很多方式跨程序獲取。比如給視窗傳送WM_GETICON,通過GetClassLong獲取視窗類圖示。也就是說,桌面和工作管理員這兩個程式,可能是通過這些方式來獲取圖示進行顯示。 也就是說,靜態顯示,顯示的是應用程式圖示;動態顯示,顯示的是視窗的圖示。 我的程式在工作管理員裡顯示不正常,那應該是視窗的圖示顯示不正常。於是我嘗試工作管理員可能採用的獲取圖示方式,逐一檢查我的程式。WM_GETICON訊息一般都是預設處理,應該沒問題。GetClassLong是獲取視窗類資訊,所以我檢查我的視窗註冊程式碼,發現沒有設定視窗類圖示。(由於採用了UI介面庫,裡面註冊了一些預設的視窗類,都是沒有設定圖示的,這個UI庫,所有的UI都是自繪的,標題欄也不是真正的windows標題欄,是自己繪製的圖示和標題,所以視窗顯示圖示正常)。 將視窗類圖示補上後,工作管理員裡顯示正常。 雖然是個小問題,但是如果思路不正確,哪怕是有多年開發經驗的老手,也可能會花費比較久的時間才能解決。尤其是現在大量使用各種庫,各種框架,很多新人連註冊視窗類都不知道。。。。 其實Windows圖示還是很值得花點時間去全面瞭解一下,有一些關於Windows圖示的技術實現還是比較有趣: 1、快捷方式是如何實現的? 2、圖示上的數字是如何實現的?有些程式會在桌面應用程式圖示上顯示一個數字,比如軟體管理程式,會以這種方式告訴你有幾款軟體有更新,使用者體驗非常好。 3、svn是如何在改變圖示的?svn會改變資料夾,檔案的圖示,就是在原有圖示上新增一些資訊,比如更改後的、簽出的。。 4、QQ推出的新功能,將經常聊天的人的頭像弄到桌面上,點選就可以啟動QQ進行聊天。