Программно создаем динамическую иконку

Для создания динамической иконки (и не только) понадобится API функция:

HICON CreateIcon(HINSTANCE hInstance, int nWidth, int nHeight, BYTE cPlanes, BYTE cBitsPixel, CONST BYTE *lpbANDbits, CONST BYTE *lpbXORbits);

Где:
hInstance – идентификатор приложения;
nWidth – ширина иконки, в пикселях;
nHeight – высота иконки, в пикселях;
cPlanes – количество плоскостей в XOR маске;
cBitsPixel – количество бит на пиксель в XOR маске;
lpbANDbits – указатель на битовый массив AND маски;
lpbXORbits – указатель на битовый массив XOR маски.

Попробуем её в действии, запускайте Visual C++ 6.0, далее “Ctrl+N” -> “MFC AppWizard(exe)”, на следующем шаге выберете “Dialog based”, на втором шаге отключите поддержку всего и жмите “Finish”. После создания проекта, в редакторе ресурсов, поместите на форму диалога элемент “Picture”, в свойстве укажите “Type: Icon”, на вкладке “Styles” поставьте галочку на “Notify”. Теперь жмите “Ctrl+W” появиться “MFC Class Wizard”, на вкладке “Member Variables” в поле “Control IDs” укажите на элемент и нажмите кнопку “Add Variable…” появиться окно, заполните поля как показано на рисунке:
Программно создаем динамическую иконку

После на вкладке “ClassView”, щелкните правой кнопкой мыши на ветке “C_имя-проекта_Dlg”, в появившемся меню выберете “Add Member Function…” как показано на рисунке:

Программно создаем динамическую иконку.
Появиться окно, в поле “Function Type:” введите HICON, в поле “Function Declaration: ” CreateDynamicIco(int x, int y) как показано на рисунке:
Программно создаем динамическую иконку

После нажатия кнопки “OK” Вы автоматически перейдете к ее реализации, теперь немного кода, откройте файл “имя_проектаDlg.h” и напишите в том месте где идет описания защищенных переменных и методов следующее:

// Implementation
 
protected:
        HICON m_hIcon;
        BYTE    ANDmask[32];
        BYTE    XORmask[32];

После, в инициализацию диалога добавьте следующий код:

ZeroMemory(XORmask,sizeof(XORmask));
ZeroMemory(ANDmask,sizeof(ANDmask));

Теперь в реализацию недавно созданной нами функции CreateDynamicIco напишите:

ZeroMemory(XORmask,sizeof(XORmask));
 
x = (32 - ((x*32)/100));
 
y = (32 - ((y*32)/100));
 
for(int i=32;i>=x;i-=2)
 
        XORmask[i] = 0x7e;
 
for(int j=31;j>=y;j-=2)
 
        XORmask[j] = 0x7e;
 
HICON h_ico = CreateIcon(AfxGetApp()->m_hInstance,16,16,1,1,ANDmask,XORmask);
 
return h_ico;

Теперь в редакторе ресурсов откройте форму диалога и добавьте кнопку и двойным щелчком по ней добавляем обработчик кнопки, появится окно, жмите “OK”. Вы автоматически перейдете к реализации, где напишите:

m_ico.SetIcon(CreateDynamicIco(rand()%100,rand()%100));

Вот и все, жмите “F7”, потом “Ctrl+F5”.