본문 바로가기

망각/Windows UI

::LoadIcon과 ::LoadImage

HICON LoadIcon(      
    HINSTANCE hInstance,
    LPCTSTR lpIconName
);
HANDLE LoadImage(      
    HINSTANCE hinst,
    LPCTSTR lpszName,
    UINT uType,
    int cxDesired,
    int cyDesired,
    UINT fuLoad
);

일단 두 함수의 프로토타입은 이렇고, MSDN의 LoadIcon 항목에는LoadIcon이 LoadImage로 대체되었다고 한다. 대체라? deprecate된 것들과 차이가 뭔지 잘 모르겠다.

Note  This function hase been superseded by the LoadImage function.

일단 16x16, 32x32, 48x48 크기의 아이콘 리소스가 실행파일에 포함되어 있고 이를 읽어 설정한다고 하면,
HICON icon = ::LoadIcon(isntance, MAKEINTRESOURCE(IDI_ICON));
::SetClassLongPtr(hwnd, GCLP_HICON, (LONG_PTR)icon);
다음과 같이 하면 타이틀과 작업표시줄 버튼의 16x16 아이콘과 ALT+TAB시 48x48크기의 아이콘이 제대로 나온다. 헌데,
HICON icon = (HICON) ::LoadImage(app.getInstance(), MAKEINTRESOURCE(IDI_ICON_EXPLORER), IMAGE_ICON, 0, 0, LR_DEFAULTSIZE|LR_LOADTRANSPARENT);
::SetClassLongPtr(app.getHandle(), GCLP_HICON, (LONG_PTR)icon);
이렇게 했더니 16x16 크기의 아이콘이 48x48 크기의 아이콘이 축소되벼러서 깨져 나와버렸다. 왜왜왜, 잠시 헤매다가 같은 아이콘 핸들을 GCLP_HICONSM도 설정했더니 잘 나온다.
::SetClassLongPtr(app.getHandle(), GCLP_HICONSM, (LONG_PTR)icon);
작은 아이콘 설정이 따로 있다면 어째서 LoadIcon으로 읽은 핸들은 GCLP_HICONSM 없이 GCLP_HICON 설정만으로도 잘 나올까? 무슨 차이가 있는건지 모르겠다. 구글링해보자.