使用圖示

下列主題描述如何執行與圖示相關的特定工作:

建立圖示

以下範例建立兩個圖示句柄:一個用於標準問題圖示,另一個用於應用程式資源定義檔案中包含的自訂圖示。

HICON hIcon1 = LoadIcon(NULL, IDI_QUESTION);
HICON hIcon2 = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON));

應用程式應實作自訂圖示作為資源,並使用 LoadIcon 或 LoadImage ,而非執行時 建立 圖示。 使用圖示資源可避免對裝置依賴、簡化本地化,並使應用程式能共享圖示設計。

CreateIcon 可在執行時建立自訂的單色圖示。 使用PackCursorMasks「建立游標」中的輔助工具和符號映射,然後建立一個圖示,每個像素只有一個平面和一個位元:

HICON hIcon = CreateIcon(hInstance, CURSOR_SIZE, CURSOR_SIZE, 1, 1, abAnd, abXor);

若要在執行階段建立 Alpha 混合圖示,請參閱 「建立 Alpha 混合游標」 — 將 TRUE 傳遞給 fIcon 中的 ,即可建立圖示而非游標。

關閉前,你的應用程式必須使用 DestroyIcon 來銷毀從 CreateIcon、 CreateIconIndirect、 CreateIconFromResourceEx 取得的任何圖示(不含 LR_SHARED 旗標),或 LoadImage 未標 LR_SHARED 示的圖示。 使用 LoadIcon 載入,或使用 LR_SHARED 建立或載入的圖示,都是共享的系統資源,不得將其銷毀。

取得圖示大小

請參考 「取得游標大小」。 這個範例對圖示也完全適用——以 HCURSOR 取代 HICON 來傳入。

顯示圖示

您的應用程式可以載入並建立圖示,以顯示在應用程式的工作區或子視窗中。 下列範例示範如何在視窗的工作區中繪製圖示,其裝置內容 (DC) 是由 hdc 參數所識別。

DrawIcon(hdc, 10, 20, hIcon1);

系統會自動顯示視窗的類別圖示。 您的應用程式可以在註冊視窗類別時指派類別圖示。 你的應用程式可以透過 SetClassLongPtr 函式替換類別圖示。 此函式會變更指定類別之所有視窗的預設窗口設定。 下列範例會將類別圖示取代為資源標識碼為 480 的圖示。

SetClassLongPtr(hWnd, GCLP_HICON,
    (LONG_PTR)LoadIcon(hInstance, MAKEINTRESOURCE(IDI_MYICON)));

若要獲得關於視窗類別的詳細資訊,請參閱 視窗類別。

共用圖示資源

下列程式代碼會使用 CreateIconFromResourceEx、DrawIcon和 LookupIconIdFromDirectoryEx和數個資源函式的函式,根據另一個可執行檔中的圖示數據建立圖示句柄。 然後,它會在視窗中顯示圖示。

安全性警告: 使用 LoadLibrary 錯誤,可能會藉由載入錯誤的 DLL 來危害應用程式的安全性。 如需如何使用不同 Windows 版本正確載入 DLL 的相關信息,請參閱 LoadLibrary 檔。

int cx = GetSystemMetrics(SM_CXICON);
int cy = GetSystemMetrics(SM_CYICON);

// LoadLibraryExW with LOAD_LIBRARY_AS_DATAFILE avoids running the DLL/EXE.
// Always use a fully qualified path to prevent DLL planting.
HINSTANCE hExe = LoadLibraryEx(TEXT("C:\\path\\to\\myapp.exe"), NULL,
                               LOAD_LIBRARY_AS_DATAFILE);
if (hExe == NULL)
    return;

HRSRC hResource = FindResource(hExe, MAKEINTRESOURCE(440), RT_GROUP_ICON);
HGLOBAL hMem    = LoadResource(hExe, hResource);
BYTE *lpResource = LockResource(hMem);

int nID = LookupIconIdFromDirectoryEx(lpResource, TRUE, cx, cy, LR_DEFAULTCOLOR);

hResource  = FindResource(hExe, MAKEINTRESOURCE(nID), RT_ICON);
hMem       = LoadResource(hExe, hResource);
lpResource = LockResource(hMem);

HICON hIcon1 = CreateIconFromResourceEx(lpResource,
    SizeofResource(hExe, hResource), TRUE, 0x00030000,
    cx, cy, LR_DEFAULTCOLOR);

DrawIcon(hdc, 10, 20, hIcon1);

FreeLibrary(hExe);