我正在开发一个具有反映系统状态的bmp图像的程序(因此,这些灯可以根据状态而改变)。这些图像位于主窗口上,旁边是一个带有几个标签的标签窗口。当我第一次运行我的程序时,一切都很好。我可以更改标签和图像仍然在它们的右侧,正确反映状态。我让我的程序运行了一夜,发现当我回来时,程序仍然会正常运行(我的所有按钮和标签都工作)但我的图像消失了。
我调试了WM_PAINT
,注意到了这段代码
Light = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(LightSource[i]));
现在返回NULL
。
所以我的问题是,我怎样才能使这项工作始终正常?有什么想法吗?
int LightSource[12] = { IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1, IDB_BITMAP1 };
case WM_PAINT:
{
HBITMAP Light = NULL; //Bitmaps for the light indications
//Prepares for painting window
hdc = BeginPaint(hwnd, &ps);
//Retrieves the coordinates of the windows client area
GetClientRect(hwnd, &rc);
//creates a copy of the memory device context
HDC hdcDouble = CreateCompatibleDC(hdc);
HBITMAP bmOld;
for (int i = 0; i < 12; i++) //For all indicator lights
{
Light = LoadBitmap(GetModuleHandle(NULL), MAKEINTRESOURCE(LightSource[i])); //Get a bitmap of the picture to be updated
bmOld = (HBITMAP)SelectObject(hdcDouble, Light); //Get a handle to the image being replaced
BitBlt(hdc, xLight[i], yLight[i], rc.right, rc.bottom, hdcDouble, 0, 0, SRCCOPY); //Bit block transfer of the bitmap color data
}
SelectObject(hdcDouble, bmOld);
DeleteDC(hdcDouble);
EndPaint(hwnd, &ps);
//Set some window text, no need to show
DeleteObject(Light);
break;
}
答案 0 :(得分:0)
回答这个问题所以它不会保持开放状态:由于你没有释放位图,看起来你的程序中有资源泄漏。使用后释放位图。