Дескрипторы GDI имеют привязку к процессу - вы не можете STM_SETIMAGE к статическому элементу управления в другом процессе.
Далее: STM_SETIMAGE не гарантирует создание копииточечный рисунок - в основном он сохраняет переданный в дескрипторе HBITMAP.В строке, следующей за SendMessage, вы удаляете дескриптор hDDB, оставляя статический элемент управления с недопустимым растровым изображением.
Статический элемент управления ожидает управления временем жизни переданного растрового изображения - и попытаетсяDestroyObject дескриптор растрового изображения при его уничтожении - это означает, что вы должны:
- Уничтожить любой старый HBITMAP, возвращенный вызовом SendMessage - вызов STM_SETIMAGE передает владение (и ответственность за уничтожение) старого растрового изображения вызывающемукод. (1)
- Не передавайте одну HBITMAP нескольким элементам управления, так как закрытие первого уничтожит ее, разрушая группу для других элементов управления.
Примечание. Если вашПриложение использует общие элементы управления 6 для получения визуальных стилей , статический элемент управления никогда не уничтожает любой растровое изображение, переданное через STM_SETIMAGE, поэтому приложение должно уничтожить все возвращенные дескрипторы И переданные в дескрипторах.
Я думаю, что //Draw on DDB
вместо удаленного кода?В этом случае, глядя на пример кода, который присутствует, мои психические силы говорят, что проблема в том, что вы не выбираете OUT памяти DC.Вам нужно, чтобы это выглядело так (переупорядочено для очистки в обратном порядке создания):
HDC hDC = GetDC(hPB);
HBITMAP hDDB = ::CreateCompatibleBitmap(hDC, 17, 14);
HDC hMemDC = ::CreateCompatibleDC(hDC);
HGDIOBJ hOld = SelectObject(hMemDC, hDDB);
//Draw on DDB here...
SelectObject(hMemDC,hOld); // this releases the hDDB
DeleteDC(hMemDC);
ReleaseDC(hPB, hDC);
HBITMAP hbmPrev = (HBITMAP)SendMessage(hPB, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hDDB));
if(hbmPrev && hbmPrev != hDDB)
DeleteObject(hbmPrev);