SelectObject возвращает NULL с hbitmap, созданным в конструкторе

У меня есть класс растрового изображения, который имеет функцию загрузки для загрузки растрового изображения из пути к файлу или ID ресурса. Эта часть отлично работает.

    void GtBitmap::Load()
{
LPTSTR szFileName;
szFileName = (LPTSTR)m_strPath.c_str();
// Check for valid .BMP file path
if (m_strPath.size() > 0)
{
// Open .BMP file
m_pFile = fopen(m_strPath.c_str(), ("rb"));
if (m_pFile != NULL)
{

m_hBitmap = (HBITMAP)LoadImage  (GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_SHARED | LR_LOADFROMFILE);

GetObject(m_hBitmap, sizeof(m_bmap), &m_bmap);
int i = 1;
}
}
else if (m_intResourceID != 0)
{
m_hBitmap = (HBITMAP)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(m_intResourceID), IMAGE_BITMAP, 0, 0, LR_SHARED);
GetObject(m_hBitmap, sizeof(m_bmap), &m_bmap);
int i = 1;
}
}

Однако, когда я пытаюсь отобразить его в своем блоке кода, SelectObject возвращает ноль. Вот код для этого раздела класса живописца.

    void  GtPainterGDI::GtDrawBitmap(GtRectI & target, GtBitmap & bitmap, bool blnOffset)
{
GtCanvas topCv = m_arrCanvas.back();
HDC hdcMem = CreateCompatibleDC(topCv.m_hdcParent);
HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.m_hBitmap);
DWORD lastError = GetLastError();

bool success = BitBlt(hdcMem, target.GetLeft(), target.GetTop(),
target.Width(), target.Height(), hdcMem, 0, 0, SRCCOPY);

SelectObject(hdcMem, bitmap.m_hBitmap);
DeleteDC(hdcMem);
};

SelectObject () возвращает ноль, и изображение не рисуется. Я могу получить изображение, только если я использую LoadImage () в этой функции рисования. Однако я не хочу загружать изображение каждый раз, когда хочу рисовать. Я должен быть в состоянии загрузить изображение один раз в функцию Load или конструктор растрового изображения, а затем использовать ручку в функции рисования.

Если кто-нибудь может предоставить пример загрузки изображения в конструктор, а затем нарисовать его в другом месте в кодах WM_PAINT или эквивалентной функции рисования, я был бы признателен. Код представляет собой новую версию библиотеки графического интерфейса пользователя GT. Я планирую опубликовать новую версию на codeproject в ближайшие несколько дней или около того. Я должен сделать некоторую очистку сначала …

Заранее спасибо.

1

Решение

HINSTANCE параметр в LoadImage должно быть NULL при загрузке изображения из файла. использование GetModuleHandle(NULL) только при загрузке с ресурса.

m_hBitmap = (HBITMAP)LoadImage(NULL, m_strPath.c_str(),
IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
if (!m_hBitmap)
{
//report error
}

Также LR_SHARED здесь не нужно

При проверке на наличие файлов, вы можете использовать std::ifstream, Пример:

#include <fstream>
...
bool test = std::ifstream(m_strPath).good();

Это проверит файл и сразу закроет дескриптор файла.

Обязательно выберите hbmOld перед удалением hdcMem:

HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMem, bitmap.m_hBitmap);
BitBlt(...)
//SelectObject(hdcMem, bitmap.m_hBitmap); <<= remove this
SelectObject(hdcMem, hbmOld);
DeleteDC(hdcMem);
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]