- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在写扫雷游戏的时候遇到了这个问题。我将位图用于数字、地雷和空白。我想我已经在资源文件中正确注册了它们
IDI_0 BITMAP "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\empty.bmp"
IDI_1 BITMAP "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\1.bmp"
IDI_2 BITMAP "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\2.bmp"
IDI_3 BITMAP "D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\3.bmp"
和头文件
#define IDI_0 200
#define IDI_1 201
#define IDI_2 202
#define IDI_3 203
然后我像这样加载它们
h0 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_0), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
h1 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_1), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
h2 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_2), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
h3 = (HBITMAP)LoadImage(hInst, MAKEINTRESOURCE(IDI_3), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION);
我还用 resourcehacker 检查了 exe 文件,发现里面所有的位图。
我不明白的是,只有在我运行游戏时才会偶尔(~50%)弹出
Error 1812: The specified image file did not contain a resource section.
或
Error 1813: The specified resource type cannot be found.
但是如果我从这样的文件中加载它们
h0 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\empty.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
h1 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
h2 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\2.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
h3 = (HBITMAP)LoadImage(NULL, L"D:\\User\\Mark\\Documents\\C++\\win32\\MineSweeper\\MineSweeper\\3.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION);
一切正常。
如有任何想法或建议,我们将不胜感激。谢谢!
最佳答案
我个人会考虑使用 GDI+ 加载您的图像。您仍然可以从磁盘文件或应用程序的资源部分加载。它还使您能够访问 Windows 原生支持的所有图像格式(BMP、GIF、JPEG、PNG、TIFF、Exif、WMF 和 EMF)
要使用它,您只需先初始化 GDI+,然后在程序退出前执行关闭。
这是我用于从磁盘文件加载的函数:
// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
HBITMAP mLoadImageFile(wchar_t *filename)
{
HBITMAP result = NULL;
Bitmap bitmap(filename, false);
bitmap.GetHBITMAP(0, &result);
return result;
}
如果我们有一个包含以下内容的资源文件:
IDR_PNG1 RT_PNG ".\\girl.png"
IDR_JPG1 RT_JPG ".\\rssLogo.jpg"
然后我们可以这样加载每个图像:
HBITMAP png = loadImgResource(IDR_PNG1, L"RT_PNG");
HBITMAP jpg = loadImgResource(IDR_JPG1, L"RT_JPG");
还有我用来从资源加载的两个函数。您会注意到,我已经在第二个函数的 GetModuleHandle(0) 中进行了硬编码 - 如果您想从当前模块以外的任何模块(dll、exe)中读取,请更改此设置。
// BMP, GIF, JPEG, PNG, TIFF, Exif, WMF, and EMF
HBITMAP loadImgResource(wchar_t *pName, wchar_t *pType, HMODULE hInst)
{
Gdiplus::Bitmap *m_pBitmap;
HBITMAP result=NULL;
HRSRC hResource = FindResource(hInst, pName, pType);
if (!hResource)
return NULL;
DWORD imgSize = SizeofResource(hInst, hResource);
if (!imgSize)
return NULL;
const void *pResourceData = LockResource(LoadResource(hInst, hResource));
if (!pResourceData)
return NULL;
HANDLE m_hBuffer = GlobalAlloc(GMEM_MOVEABLE, imgSize);
if (m_hBuffer)
{
void* pBuffer = GlobalLock(m_hBuffer);
if (pBuffer)
{
CopyMemory(pBuffer, pResourceData, imgSize);
IStream* pStream = NULL;
if (CreateStreamOnHGlobal(m_hBuffer, FALSE, &pStream) == S_OK)
{
m_pBitmap = Gdiplus::Bitmap::FromStream(pStream);
pStream->Release();
if (m_pBitmap)
{
if (m_pBitmap->GetLastStatus() == Gdiplus::Ok)
{
m_pBitmap->GetHBITMAP(0, &result);
delete m_pBitmap;
}
}
}
GlobalUnlock(m_hBuffer);
}
GlobalFree(m_hBuffer);
}
return result;
}
HBITMAP loadImgResource(WORD resNum, LPWSTR pType)
{
return loadImgResource(MAKEINTRESOURCE(resNum), pType, GetModuleHandle(0));//hInst);
}
关于c++ - Win32 Loadimage 生成错误 1812 和 1813,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31858522/
这个问题已经有答案了: why not to send WM_PAINT manually (4 个回答) 已关闭 5 年前。 如何获取LoadImage();使用可变文件路径?我在变量 bg 中有所
嗨, 我正在使用 loadImage 加载一个 24 位 bmp 文件,然后尝试获取 bmp 信息 hBitmap = (HBITMAP)LoadImage(NULL, "logo.bmp", IM
我想加载并显示 explorer.exe 的图标之一。 我使用以下代码(缩写): // resource id definition EXP_ICON = MAKEINTRESOURCE(
我有一个 Windows 8 应用程序,我正在尝试使用以下代码加载图像: private async Task LoadImage(IStorageFile storageFile)
抱歉,如果这是重复的,但我无法在其他地方找到答案。我只是想在运行时使用 WINAPI 的 LoadImage() 函数加载图像。我收到错误代码 (8),表明没有足够的存储空间(找到错误代码 here)
编辑:我在下面的代码片段中添加了几行程序。 我在程序中有如下一行代码 BITMAP BMP; HBITMAP hBMP; hBMP = (HBITMAP)LoadImage(GetModuleHand
void CCreateList::paintRowList(CDialogEx* CCurent, int wBeginX, int wBeginY) { CPaintDC dc(CCure
我试图通过 LoadImage 函数从 win32 中的相对文件路径加载文件。我使用的 URL 确实存在,出于测试目的,使用与资源文件中添加的位图相同的 URL。 Image = (HBITMAP)L
我正在尝试从我的浏览器 (Chrome) 运行这个用 Javascript 编写的简单游戏: Document 这是我的 javascript 文件
为什么使用 Unity 加载外部 1024x1024 RGBA32 .png(通过 PaintXP 或 Gimp 保存)并在中心有一个 (64,64,64) 像素的 Blob 时,底部的 Debug.
我正在尝试使用我的应用程序加载一些位图图像,以使用以下命令对使用 ImageMagick 创建的图像进行比较: C:\Program Files\ImageMagick-7.0.6-Q16>Conve
以下是我在类里面的代码: @Override public void displayImageAsync(ImageView iv, MyImageLoadingListener listener)
我正在使用 C++ 开发 Windows 应用程序。我使用 LoadImage 将 bmp 文件加载到 DC,它正确显示。但是,当我调用 DeleteObject 时,内存似乎并没有被释放。 (我使用
当我加载 8 位 BMP 文件时,这段代码有问题。 HBITMAP hbm = LoadImageW(NULL, L"C:\\Test.bmp", IMAGE_BITMAP, 0, 0,LR_LOAD
使用 LoadImage() 会导致段错误。回溯堆栈我发现最后调用了以下函数:AlpcMaxAllowedMessageLength() 这是我调用的函数: status = (HBITMAP) Lo
我正在编写一个小型 MFC 应用程序,并在启动时在我的可执行文件中加载这样的图标句柄: const HANDLE hIconLarge = ::LoadImage(AfxGetInstanceHand
通用图像加载器没有应用 imageLoader.loadImage 中的显示图像选项 这是我的代码 DisplayImageOptions options = new DisplayImageOpti
我正在尝试加载名为“border.bmp”的图像,以便我可以将其用作 WebGL 的纹理。这是我引用图像的方式。 var img; function preload() { img = loa
我正在尝试编写一个快速简单的 C++ 程序,将光标图标更改为目录中的自定义图像。 Windows 开发中心似乎有 some fairly straightforward documentation o
我们发现一个间歇性问题,即在 Windows XP 下使用位图作为背景的所有者绘制的按钮无法正确显示位图。将显示包含多个按钮的窗口,这些按钮对用于按钮背景的位图图像使用相同的位图文件,并且大多数按钮将
我是一名优秀的程序员,十分优秀!