我有一个位图类,它有一个加载函数,用于从文件路径或资源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返回null。这是画家类的那部分的代码。
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()返回null并且不绘制图像。如果我在该绘图函数中使用LoadImage(),我只能显示图像。但是,每次我想要绘画时,我都不想加载图像。我应该能够在位图的Load函数或构造函数中加载一次图像,然后使用paint函数中的句柄。
如果有人可以提供一个在构造函数中加载图像然后在代码WM_PAINT或等效绘画函数中将其绘制到其他地方的示例,我将不胜感激。该代码是GT图形用户界面库的新版本。我计划在接下来的几天左右在codeproject上发布一个新版本。我必须先做一些清理......
提前致谢。
答案 0 :(得分:0)
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);