我一直在努力做一些据说很简单的事情,但是像往常一样,在可疑的情况下,它对我不起作用。我想要做的只是将位图加载到屏幕并保持在那里。 (弹出窗口)窗口没有控件,无法移动,只能通过它的泵处理WM_PAINT;像一个闪屏。
代码编译很好并且在调试模式下运行正常,但是当我切换到发布模式时LoadImage()
总是返回NULL
,其他一切都因此失败。这是我花在这一方法上的第四个小时,我认为是时候寻求帮助了。
我检查了未初始化的内存,并确保使用的每个类成员都初始化为0
,并且可以肯定这不是问题所在。
我将在下面发布以下代码,非常感谢您的帮助。
如果可能的话,我更愿意只使用WinAPI来执行此操作,因为在此应用程序的任何其他位置我都不会使用此功能。当然,我仍然对创意持开放态度,但很可能我只是犯了一个愚蠢的错误。再次,谢谢!
int CreateWindowWithUserFormat()
{
SIZE BMSize = {0};
LoadedBitmap = (HBITMAP) LoadImage(NULL,
L"Art\\Splash_Screens\\1.bmp", IMAGE_BITMAP,
NULL, NULL, LR_LOADFROMFILE);
if(!LoadedBitmap) {
MessageBox(NULL,
L"Error loading image to void * HBITMAP",
L"Error Loading Splash", NULL);
}
ScreenDevCtxt = CreateCompatibleDC(NULL);
if(!ScreenDevCtxt) {
//Failure
}
ReplacedObject = SelectObject(ScreenDevCtxt, (HGDIOBJ) LoadedBitmap);
if(ReplacedObject == NULL || ReplacedObject == HGDI_ERROR) {
//Failure
}
if( (!GetBitmapDimensionEx(LoadedBitmap, &BMSize) ) ||
BMSize.cx == 0 || BMSize.cy == 0) {
//Failure, try alternate:
BITMAP Bm = {0};
if( (!GetObject(LoadedBitmap, sizeof(Bm), &Bm) ) ||
Bm.bmWidth == 0 || Bm.bmHeight == 0) {
MessageBox(NULL,
L"Error getting bitmap size; loading aborted.",
L"Error Loading Splash Image", NULL);
}
// Alternate success; use these as size.
BMSize.cx = Bm.bmWidth;
BMSize.cy = Bm.bmHeight;
}
{
RECT WindowSize = {0};
WinHelper.CenterRectInScreen(WindowSize, BMSize.cx, BMSize.cy);
if(!Create(L"TitleName",
WS_POPUPWINDOW | WS_EX_TOPMOST,
WS_EX_TRANSPARENT,
WindowSize.left, WindowSize.top,
WindowSize.right, WindowSize.bottom,
NULL, NULL) )
{
return false;
}
return true;
}
}
值得一提的是,这是在它自己的线程上运行的。线程包装器负责在从应用程序收到信号并且经过一定时间后(5秒,我相信)销毁此窗口。我有理由相信这不是问题的根源,但谁知道;我没有想法。
问题只出现在发布模式中,是的,发布模式仍然可以访问文件(Art\\Splash_Screens\\1.bmp
)。我该怎么做才能解决这个问题?
更新
嗯,这之后只花了几分钟就意识到路径是错误的......
我仍然不知道为什么,但显然如果我们取出中间文件夹并将"1.bmp"
直接粘贴在可执行文件旁边,它就可以了。谢谢你们。
答案 0 :(得分:1)
我经常注意到这样的问题与路径有关。请注意,发布可执行文件的位置无关紧要,而是“当前working directory”是什么。
您可以使用getcwd
或(在Win32中)GetCurrentDirectory
函数调用获取当前工作目录。
作为一个额外的测试,为了确保文件确实在你相信它的位置(相对于你的CWD),我会抛出一个fopen(..., "r")
调用,并检查它是否成功。
答案 1 :(得分:0)
当您从IDE执行应用程序时,工作目录是您的项目目录。但是当您作为调试/发布版本发布时,您的IDE会将您的应用程序放入projectfolder / bin / debug(release)文件夹中。现在它的工作目录不是你的项目文件夹,而是projectfolder / bin / debug(release)。这就是为什么它在IDE中运行时找到你的位图,而不是在发布后作为调试/发布。
您可以执行以下操作:
位图的路径例如是" yourProjectFolder / image / bitmap1.bmp"。您可以在IDE中运行 - >没问题。 您的代码如下所示:
LoadedBitmap = (HBITMAP)LoadImage(NULL,
"image/bitmap1.bmp", IMAGE_BITMAP,
NULL, NULL, LR_LOADFROMFILE);
现在您想要作为调试发布。工作目录现在是projectfolder / bin / debug,因此将搜索路径更改为:
LoadedBitmap = (HBITMAP)LoadImage(NULL,
"../../image/bitmap1.bmp", IMAGE_BITMAP,
NULL, NULL, LR_LOADFROMFILE);
对于每个../,IDE将逐步升级一个文件夹。这意味着从这里:projectFolder / bin / debug到这里:projectfolder / image机器必须向上步骤两次,直到它到达项目文件夹加上/ image为你的图像文件夹。因此../../image会从bin / debug中导致项目文件夹/图像。
但这是一个解决方法!最好从资源加载图像。