HBITMAP hbm = LoadImage函数返回NULL

时间:2017-04-19 22:40:20

标签: c++ visual-c++ bitmap null loadimage

我在屏幕上显示位图时遇到问题。当我压缩并运行它没有显示任何东西,所以我尝试一步一步调试,发现下面的代码是问题。

HBITMAP hbm = (HBITMAP)LoadImage(hInstance, 
                        "C:\\Users\\Jemma\\Desktop\\Maze Game\\Assets\\TILE_01.bmp", 
                        IMAGE_BITMAP, 
                        SWidth, SHeight, 
                        LR_LOADFROMFILE | LR_CREATEDIBSECTION); 
    if (hbm == NULL || m_Surface == NULL)
{
    DWORD lastError = GetLastError();
    return 1;
}

当我在autos下首次使用此函数时,它会说hbm = 0xcccccccc {unused = ???}(我假设它没有被初始化,因为当我到达时它会出现因此我还没有进入它 - 只是在我进入这条线之后我只是想把它放进去就行了它说hbm = NULL,并且GetLastError函数返回0我读过的意思是功能成功了。我尝试传递NULL而不是hInstance,我尝试将文件名作为LPCSTR szFileName传递 - 我将其声明为LPCSTR szFileName(" C:\ Users \ Jemma \ Desktop \ Maze Game \资产\ TILE_01.bmp&#34)。 绝对不知道下一步该尝试什么。对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

首先,确保您的图像是真正的bmp文件,并且可以使用图像查看器打开。然后尝试使用LoadImage加载HBITMAP:

const char* filename = "C:\\Users\\Jemma\\Desktop\\Maze Game\\Assets\\TILE_01.bmp";
HBITMAP bmp = (HBITMAP)LoadImage(NULL, filename,
    IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
if (hbm == NULL)
{
    DWORD lastError = GetLastError();
    return 1;
}

注意,当您使用LR_DEFAULTSIZE时,需要使用0,0作为大小,同时,从文件加载时需要使用LR_LOADFROMFILE。所有这些都在documentation of LoadImage function中提到。

如果您遇到意外情况,在使用调试器时,需要检查GetLastError。如果您正在使用VS调试器,只需在监视窗口中添加@err,您将始终在不更改代码的情况下看到最后一个错误。您也可以将其添加为@err,hr,它会向您显示发生错误的可读描述。

答案 1 :(得分:0)

const char* filename = "C:\\Users\\Jemma\\Desktop\\Maze Game\\Assets\\TILE_01.bmp";
HBITMAP bmp = (HBITMAP)LoadImage(NULL, filename,
    IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
if (bmp== NULL)
{
    DWORD lastError = GetLastError();
    return 1;
}

I am using the same code as above mentioned but LoadImage() is returning NULL and getting lasterror =2 , even i am sure file is already there from belowcode:

string filePath = "D:\\ACC_car_Ego.bmp";
    if (boost::filesystem::exists(filePath))    // does filePath actually exist?
        DWORD lastError = GetLastError();
    else
        DWORD lastError1 = GetLastError();