#winapi #gdi
#winapi #gdi
Вопрос:
У меня есть класс в проекте, который загружает файл .bmp из файла и использует OleLoadPicture, который отлично работает, уже есть интерфейс для загрузки с ресурса, но когда я пытаюсь его использовать, я получаю ошибку CTL_E_INVALIDPICTURE
. Две разные процедуры приведены ниже, почему не работает версия ресурса? Ресурс можно использовать в статическом элементе управления диалогового окна просто отлично, но в этом случае я хочу загрузить и нарисовать его, потому что его нужно изменить размер.
Вот эти процедуры, он находит ресурс с помощью RT_BITMAP, а идентификатор-IDB_MYBITMAP. Есть идеи, что не так?
Правка: Похоже OleLoadPicture
, формат .bmp не поддерживает используемый формат. bmp, когда я поставил метку, чтобы убедиться, что он использовал копию, в итоге размер файла стал намного больше, а затем он работает. Так что, по-видимому, он не может загрузить кодированный RLE .bmp? Я предполагаю, что RLE, потому что, как уже упоминалось,. bmp отлично работает в редакторе ресурсов и имеет статический элемент управления, а размер невелик. Сохранение его другим способом увеличило его с 36 тыс. до 200 тыс.
////////////////// // Load from resource. Looks for "IMAGE" and "BITMAP" type. // BOOL CPicture::Load(HINSTANCE hinst, UINT nidres) { // find resource in resource file HRSRC hrsrc = ::FindResource(hinst, MAKEINTRESOURCE(nidres), _T("IMAGE")); if (!hrsrc) { hrsrc=::FindResource(hinst, MAKEINTRESOURCE(nidres), RT_BITMAP); if (!hrsrc) return FALSE; } // load resource into memory DWORD len = ::SizeofResource(hinst, hrsrc); if ( !len ) return FALSE; HGLOBAL hresdata = ::LoadResource(hinst, hrsrc); if ( !hresdata ) return FALSE; HGLOBAL hglobal = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD, len); if ( !hglobal ) { ::FreeResource(hresdata); return FALSE; } char* pdest = reinterpret_castlt;char*gt; ( ::GlobalLock(hglobal) ); char* psrc = reinterpret_castlt;char*gt; ( ::LockResource(hresdata) ); if (!psrc || !pdest) { ::GlobalFree(hglobal); ::FreeResource(hresdata); return FALSE; } ::CopyMemory(pdest,psrc,len); ::FreeResource(hresdata); ::GlobalUnlock(hglobal); // don't delete memory on object's release IStream* pstream = NULL; if ( ::CreateStreamOnHGlobal(hglobal,FALSE,amp;pstream) != S_OK ) { ::GlobalFree(hglobal); return FALSE; } // create memory file and load it BOOL bret = Load(pstream); pstream-gt;Release(); ::GlobalFree(hglobal); return bret; } ////////////////// // Load from path name. // BOOL CPicture::Load(LPCTSTR pszpathname) { HANDLE hfile = ::CreateFile(pszpathname, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if ( hfile==INVALID_HANDLE_VALUE ) return FALSE; DWORD high=0; DWORD len = ::GetFileSize( hfile, amp;high); if (len == 0 || high || len gt; MAX_GRAPHIC_FILESIZE) return FALSE; HGLOBAL hglobal = ::GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD, len); if ( !hglobal ) { ::CloseHandle(hfile); return FALSE; } char* lpbuffer = reinterpret_castlt;char*gt; ( ::GlobalLock(hglobal) ); DWORD dwbytesread; BOOL bret=ReadFile(hfile, lpbuffer, len, amp;dwbytesread, NULL) amp;amp; dwbytesread==len; ::CloseHandle(hfile); ::GlobalUnlock(hglobal); if (bret) { // don't delete memory on object's release IStream* pstream = NULL; if ( ::CreateStreamOnHGlobal(hglobal,FALSE,amp;pstream) != S_OK ) { ::GlobalFree(hglobal); return FALSE; } // create memory file and load it bret = Load(pstream); pstream-gt;Release(); } ::GlobalFree(hglobal); return bret; } ////////////////// // Load from stream (IStream). This is the one that really does it: call // OleLoadPicture to do the work. // BOOL CPicture::Load(IStream* pstm) { Free(); HRESULT hr = OleLoadPicture(pstm, 0, FALSE, IID_IPicture, (void**)amp;m_spIPicture); return hr == S_OK; }
Комментарии:
1. Какая программа использовалась для создания растрового файла? Очень немногие программы создают допустимые BMP-файлы. Можете ли вы предоставить минимальный растровый файл в виде шестнадцатеричного дампа или версию в кодировке base64 в вопросе?
2. Черт возьми, я не помню, но так как OleLoadPicture не мог обрабатывать bmp RLE, я просто изменил код, чтобы даже не использовать эти процедуры, и просто загрузил растровое изображение сам. Но этот вопрос может помочь кому-то совершить ту же ошибку по той же причине.