Забавная штука, получается, очень симпатично выглядит кнопка с рисунком, но стоит добавить манифест к файлу, как сразу эти кнопки отображаются обычными. Для этой цели я написал функцию, которая загоняет в кнопку иконку: #pragma pack(push, 8) BOOL Button_SetIcon(HWND hwndButton, HINSTANCE hModule, LPSTR szIcon, INT cx = 32, INT cy = 32, UINT fuLoad = LR_DEFAULTCOLOR) { BOOL ret = FALSE;
HICON hIconBlend; HICON hIcon = (HICON)LoadImage(hModule, szIcon, IMAGE_ICON, cx, cy, fuLoad);
struct { HIMAGELIST himl; // Index: Normal, hot, pushed, disabled, focused. RECT margin; // Margin around icon. UINT uAlign; } bi; memset(&bi, 0, sizeof(bi)); bi.himl = ImageList_Create(cx,cy,ILC_COLOR16|ILC_MASK,4,0); bi.uAlign = 4;
ImageList_AddIcon(bi.himl,hIcon); // Normal ImageList_AddIcon(bi.himl,hIcon); // hot ImageList_AddIcon(bi.himl,hIcon); // pushed
// disabled hIconBlend = ImageList_GetIcon(bi.himl,0,ILD_BLEND50|ILD_TRANSPARENT); ImageList_AddIcon(bi.himl,hIconBlend); DestroyIcon(hIconBlend);
hIconBlend = ImageList_GetIcon(bi.himl,3,ILD_BLEND50|ILD_TRANSPARENT); ImageList_Remove(bi.himl,3); ImageList_AddIcon(bi.himl,hIconBlend); DestroyIcon(hIconBlend);
ImageList_AddIcon(bi.himl,hIcon); // focused
if(!(ret = SendMessage(hwndButton,(0x1600/*BCM_FIRST*/ + 0x0002)/*BCM_SETIMAGELIST*/,0,(LPARAM)&bi))) { ImageList_Destroy(bi.himl); ret = SendMessage(hwndButton,BM_SETIMAGE,IMAGE_ICON,(LPARAM)hIcon); } else { DestroyIcon(hIcon); SetWindowText(hwndButton,""); } return ret; } #pragma pack(pop) Параметры я сделал как у функции LoadImage для удобства использования, т.е. если захотите загрузить иконку не из ресурсов, а из файла, просто ставите флажок. Кроме этого добавил код, который делает "дважды" бледной иконку для неактивной кнопки.Зачастую используется не та операционка, на которой мы создавали и лицезрели наше творение. По этой причине я добавил код, который в случае неудачи, загоняет иконку стандартным способом, что позволяет программе жить и под Вин9х.
Как использовать этот код? Очень просто - добавьте в .срр-файл этот код, где используется этот наворот. Или как я - в отдельный файл с кучей аналогичных функций, описать в файле-хедере и использовать.в апях: Button_SetIcon(GetDlgItem(hdlg, IDC_BUTTON), GetModuleHandle(NULL), "MYICON"); // или в МФС: Button_SetIcon(GetDlgItem(IDC_BUTTON)->m_hWnd,AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME) ,16,16); Примечание: Необходимо в начале программы вызывать InitCommonControls(), т.к. подключение манифеста, без этого вызова, приводит к абнормальному созданию окон - говоря простым языком, окно может не отобразиться на экране. |