Данная статья является логическим продолжением статьи Background Image - картинка в фоне окна. Нам известны два способа загрузки изображений из ресурсов: - С помощью LoadBitmap(LoadImage) можно загрузить файлы типа bmp
- С помощью SHLoadImageResource можно загрузить файлы типов bmp,jpg,png,gif
оба эти способа не лишены недостатков. LoadBitmap умеет загружать только bmp формат, SHLoadImageResource достаточно медленная функция и требует наличия shell, т.е. не работает на чистой WinCE. Но кроме этих двух способов мы можем воспользоваться интерфейсом IImagingFactory. В общем виде задача загрузки изображения сводится к получению данных ресурса. Допустим, наш ресурс описан так, как это используется для функции SHLoadImageResource Code IDB_IMAGE GIF DISCARDABLE "image.png" Шаг 1. Создаем экземпляр фабрики классов Code IImagingFactory* pFactory = NULL; IImage * pImage = NULL; ...
CoInitializeEx(0, COINIT_MULTITHREADED); CoCreateInstance(CLSID_ImagingFactory, 0, CLSCTX_INPROC_SERVER, __uuidof(IImagingFactory) , (void**)&pFactory);
Шаг 2. Получаем указатель на данные ресурса и создаем объект IImage Code if (pFactory) { HMODULE hInst = (HMODULE)GetModuleHandle(NULL); HRSRC hRsrc = FindResource(hInst,MAKEINTRESOURCE(IDB_IMAGE),L"GIF"); if (hRsrc) { DWORD dwSize = SizeofResource(hInst,hRsrc); HGLOBAL hRes = LoadResource(hInst,hRsrc); if (hRes) { LPVOID ptr = LockResource(hRes); if (ptr) pFactory->CreateImageFromBuffer(ptr, dwSize, BufferDisposalFlagNone, &pImage); } } } Шаг 3. Рисуем Code if (pImage) { pImage->Draw(hDC,&r,NULL); } 4. Освобождаем ресурсы Code if (pImage) pImage->Release(); if (pFactory) { pFactory->Release(); } CoUninitialize(); Вот в общем-то и все.
|