Usando ícones

Os tópicos a seguir descrevem como executar determinadas tarefas relacionadas a ícones:

Criando um ícone

O exemplo a seguir cria dois identificadores de ícone: um para o ícone de pergunta padrão e outro para um ícone personalizado incluído como um recurso no arquivo de definição de recurso do aplicativo.

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

Os aplicativos devem implementar ícones personalizados como recursos e usar LoadIcon ou LoadImage em vez de criar o ícone em tempo de execução. O uso de recursos de ícone evita a dependência do dispositivo, simplifica a localização e permite que os aplicativos compartilhem designs de ícones.

CreateIcon pode ser usado para criar um ícone monocromático personalizado em tempo de execução. Use o auxiliar PackCursorMasks e o mapa de símbolos de Criando um cursor, depois crie um ícone com um plano e um bit por pixel:

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

Para criar um ícone com mesclagem alfa em tempo de execução, consulte Criando um cursor com mesclagem alfa — passe TRUE para fIcon em ICONINFO para criar um ícone em vez de um cursor.

Antes de fechar, seu aplicativo deve usar DestroyIcon para destruir qualquer ícone obtido de CreateIcon, CreateIconIndirect, CreateIconFromResourceEx sem o LR_SHARED sinalizador ou LoadImage sem o LR_SHARED sinalizador. Ícones carregados com LoadIcon, ou criados ou carregados com LR_SHARED, são recursos compartilhados do sistema e não devem ser destruídos.

Obtendo o tamanho do ícone

Veja Como obter um tamanho de cursor. O exemplo funciona de forma idêntica para ícones — passe um HICON no lugar de HCURSOR.

Exibindo um ícone

Seu aplicativo pode carregar e criar ícones para serem exibidos na área de cliente do aplicativo ou nas janelas filhas. O exemplo a seguir demonstra como desenhar um ícone na área do cliente da janela cujo contexto de dispositivo (DC) é identificado pelo parâmetro hdc .

DrawIcon(hdc, 10, 20, hIcon1);

O sistema exibe automaticamente os ícones de classe de uma janela. Seu aplicativo pode atribuir ícones de classe ao registrar uma classe de janela. Seu aplicativo pode substituir um ícone de classe usando a função SetClassLongPtr . Essa função altera as configurações de janela padrão para todas as janelas de uma determinada classe. O exemplo a seguir substitui um ícone de classe pelo ícone cujo identificador de recurso é 480.

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

Para obter mais informações sobre classes de janela, consulte Classes de Janela.

Recursos de ícone de compartilhamento

O código a seguir usa as funções CreateIconFromResourceEx, DrawIcon e LookupIconIdFromDirectoryEx e várias das funções de recurso para criar um identificador de ícone com base em dados de ícone de outro arquivo executável. Em seguida, ele exibe o ícone em uma janela.

Aviso de segurança: Usar LoadLibrary incorretamente pode comprometer a segurança do aplicativo carregando a DLL errada. Consulte a documentação do LoadLibrary para obter informações sobre como carregar corretamente DLLs com diferentes versões de Windows.

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