程序运行一段时间后,LoadBitmap返回NULL

时间:2014-09-17 11:18:55

标签: c++ visual-studio winapi

我正在开发一个具有反映系统状态的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;
    }

1 个答案:

答案 0 :(得分:0)

回答这个问题所以它不会保持开放状态:由于你没有释放位图,看起来你的程序中有资源泄漏。使用后释放位图。