gpt4 book ai didi

c++ - SelectObject 使用在构造函数中创建的 hbitmap 返回 NULL

转载 作者:太空宇宙 更新时间:2023-11-04 13:09:28 28 4
gpt4 key购买 nike

我有一个位图类,它有一个加载函数,用于从文件路径或资源 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 上发布一个新版本。我必须先做一些清理...

提前致谢。

最佳答案

从文件加载图像时,LoadImage 中的

HINSTANCE 参数应为 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();

这将测试文件并立即关闭文件句柄。

确保在删除 hdcMem 之前选择 hbmOld:

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

关于c++ - SelectObject 使用在构造函数中创建的 hbitmap 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40596786/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com