Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Давно заметил, что всё-таки языки С/C++ это не самый лучший вариант программирования под Windows. Сейчас появилась масса более современных и удобных языков, например тот же Python - кроссплатформенный язык, очень легок в изучение. Я его изучил буквально за несколько дней по этому курсу - ссылка. Автор постарался, там видеоуроки на удивление легкие и понятные.

Иконка на кнопке

Забавная штука, получается, очень симпатично выглядит кнопка с рисунком, но стоит добавить манифест к файлу, как сразу эти кнопки отображаются обычными. Для этой цели я написал функцию, которая загоняет в кнопку иконку:
#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(), т.к. подключение манифеста, без этого вызова, приводит к абнормальному созданию окон - говоря простым языком, окно может не отобразиться на экране.

Приятной разработки программ с удобным интерфейсом.
С уважением BOBKA.




<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS