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

ВИДЕОКУРС
выпущен 4 ноября!


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

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



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Конвертируем иконку 32x32 в 16x16


Автор: Fabio Falsini

Для решения такой задачи, берём два битмапа иконки (битмап самой картинки и битмап маски) и изменяем размер каждого битмапа отдельно с 32x32 до 16x16. Из двух новых битмапов, полученных путём преобразования легко можно сделать новую иконку 16x16. Теоретически, процедура работает правильно, однако, я заметил, что сама Windows преобразовывает более качественно.

HICON Convert32x32IconTo16x16(HICON h32x32Icon)
 {
   HDC hMainDC, hMemDC1, hMemDC2;
   HICON h16x16Icon;
   BITMAP bmp;
   HBITMAP hOldBmp1, hOldBmp2;
   ICONINFO IconInfo32x32, IconInfo16x16;
 
   GetIconInfo(h32x32Icon, &IconInfo32x32);
 
   hMainDC = ::GetDC(m_hWnd);
   hMemDC1 = CreateCompatibleDC(hMainDC);
   hMemDC2 = CreateCompatibleDC(hMainDC);
 
   GetObject(IconInfo32x32.hbmColor, sizeof(BITMAP), &bmp);
 
   IconInfo16x16.hbmColor = CreateBitmap( 16, 16,
                                          bmp.bmPlanes,
                                          bmp.bmBitsPixel,
                                          NULL);
 
   hOldBmp1 = (HBITMAP) SelectObject( hMemDC1,
                                      IconInfo32x32.hbmColor);
   hOldBmp2 = (HBITMAP) SelectObject( hMemDC2,
                                      IconInfo16x16.hbmColor);
 
   StretchBlt(hMemDC2,
        0, 0,
        16, 16,
        hMemDC1,
        0, 0,
        32, 32,
        SRCCOPY
        );
 
   GetObject(IconInfo32x32.hbmMask, sizeof(BITMAP), &bmp);
 
   IconInfo16x16.hbmMask = CreateBitmap( 16, 16,
                                         bmp.bmPlanes,
                                         bmp.bmBitsPixel,
                                         NULL);
 
   SelectObject(hMemDC1, IconInfo32x32.hbmMask);
   SelectObject(hMemDC2, IconInfo16x16.hbmMask);
 
   StretchBlt(hMemDC2,
              0, 0,
              16, 16,
              hMemDC1,
              0, 0,
              32, 32,
              SRCCOPY
        );
 
   SelectObject(hMemDC1, hOldBmp1);
   SelectObject(hMemDC2, hOldBmp2);
 
   IconInfo16x16.fIcon = TRUE;
   h16x16Icon = CreateIconIndirect(&IconInfo16x16);
 
   DeleteObject(IconInfo32x32.hbmColor);
   DeleteObject(IconInfo16x16.hbmColor);
   DeleteObject(IconInfo32x32.hbmMask);
   DeleteObject(IconInfo16x16.hbmMask);
   DeleteDC(hMemDC1);
   DeleteDC(hMemDC2);
   ::ReleaseDC(m_hWnd, hMainDC);
 
   return h16x16Icon;
 }
 

 



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

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




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



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


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