我一直在尝试做一些据说很简单的事情,但像往常一样,在可疑的情况下,它对我不起作用。我想要做的只是将位图加载到屏幕并保持在那里。(弹出)窗口将没有控件,无法移动,并且只会通过它的泵处理 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"
直接贴在可执行文件旁边,显然它工作正常。感谢你们。