아이콘 사용

다음 항목에서는 아이콘과 관련된 특정 작업을 수행하는 방법을 설명합니다.

아이콘 만들기

다음 예제에서는 두 개의 아이콘 핸들을 만듭니다. 하나는 표준 질문 아이콘용이고 다른 하나는 애플리케이션의 리소스 정의 파일에 리소스로 포함된 사용자 지정 아이콘에 대한 핸들입니다.

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

애플리케이션은 사용자 지정 아이콘을 리소스로 구현하고 런타임에 아이콘을 만드는 대신 LoadIcon 또는 LoadImage 를 사용해야 합니다. 아이콘 리소스를 사용하면 디바이스 의존성이 방지되고 지역화가 간소화되며 애플리케이션에서 아이콘 디자인을 공유할 수 있습니다.

CreateIcon 을 사용하여 런타임에 사용자 지정 단색 아이콘을 만들 수 있습니다. PackCursorMasks 커서 만들기에서 도우미 및 기호 맵을 사용한 다음, 하나의 평면과 픽셀당 1비트를 사용하여 아이콘을 만듭니다.

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

런타임에 알파 혼합 아이콘을 만들려면 알파 혼합 커서 만들기를 참조하세요. 커서 대신 아이콘을 만들려면 TRUE에서 fIcon 대신 을 전달합니다.

닫기 전에 애플리케이션은 DestroyIcon을 사용하여 CreateIcon, CreateIconIndirect, 플래그가 없는 CreateIconFromResourceEx 또는 플래그가 없는 LR_SHAREDLR_SHAREDLoadImage에서 가져온 아이콘을 삭제해야 합니다. 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);