アイコンの使用

次のトピックでは、アイコンに関連する特定のタスクを実行する方法について説明します。

アイコンの作成

次の例では、2 つのアイコン ハンドルを作成します。1 つは標準の質問アイコン用で、もう 1 つはアプリケーションのリソース定義ファイルにリソースとして含まれているカスタム アイコン用です。

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

アプリケーションでは、実行時にアイコンを作成するのではなく、リソースとしてカスタム アイコンを実装し、 LoadIcon または LoadImage を使用する必要があります。 アイコン リソースを使用すると、デバイスへの依存を回避し、ローカライズを簡略化し、アプリケーションでアイコンデザインを共有できます。

CreateIcon を使用すると、実行時にカスタム モノクロ アイコンを作成できます。 カーソルの作成からPackCursorMasks ヘルパーとシンボル マップを使用し、1 ピクセルあたり 1 つの平面と 1 ビットのアイコンを作成します。

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

実行時にアルファ ブレンド アイコンを作成するには、「アルファ ブレンド カーソルの作成 」 を参照してください。ICONINFO でfIconTRUE渡して、カーソルではなくアイコンを作成します。

アプリケーションを閉じる前に、DestroyIcon を使用して、CreateIcon、CreateIconIndirect、CreateIconFromResourceEx から取得したアイコン (LR_SHARED フラグなし)、または LR_SHARED フラグのない LoadImage を破棄する必要があります。 LoadIcon で読み込まれたアイコン、またはLR_SHAREDで作成または読み込まれたアイコンは、共有システム リソースであり、破棄することはできません。

アイコン サイズの取得

「カーソル サイズの取得」を参照してください。 この例は、アイコンに対して同じように機能し、HCURSORの代わりにHICONを渡します。

アイコンの表示

アプリケーションは、アプリケーションのクライアント領域または子ウィンドウに表示するアイコンを読み込んで作成できます。 次の例では、 hdc パラメーターによって識別されるデバイス コンテキスト (DC) を持つウィンドウのクライアント領域にアイコンを描画する方法を示します。

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);