Вы можете установить DDB на Static Picture Control - PullRequest
0 голосов
/ 01 сентября 2010

У меня есть элемент управления изображением, созданный в стиле SS_BITMAP, и растровое изображение, созданное на контроллере памяти.так можно или как вы можете установить HBITMAP DDB для элемента управления?Не работает с использованием:

Редактировать:

    HDC hDC = GetDC(hPB); //hPB, Handle to static control.
    HDC hMemDC = ::CreateCompatibleDC(hDC);
    HBITMAP hDDB = ::CreateCompatibleBitmap(hDC, 17, 14);
    SelectObject(hMemDC, hDDB);

    //Draw on DDB     

    SendMessage(hPB, STM_SETIMAGE, IMAGE_BITMAP, LPARAM(hDDB));

    DeleteObject(hDDB);
    DeleteObject(hBrush);
    ReleaseDC(hPB, hDC);

1 Ответ

1 голос
/ 01 сентября 2010
  1. Дескрипторы GDI имеют привязку к процессу - вы не можете STM_SETIMAGE к статическому элементу управления в другом процессе.

  2. Далее: STM_SETIMAGE не гарантирует создание копииточечный рисунок - в основном он сохраняет переданный в дескрипторе HBITMAP.В строке, следующей за SendMessage, вы удаляете дескриптор hDDB, оставляя статический элемент управления с недопустимым растровым изображением.

Статический элемент управления ожидает управления временем жизни переданного растрового изображения - и попытаетсяDestroyObject дескриптор растрового изображения при его уничтожении - это означает, что вы должны:

  1. Уничтожить любой старый HBITMAP, возвращенный вызовом SendMessage - вызов STM_SETIMAGE передает владение (и ответственность за уничтожение) старого растрового изображения вызывающемукод. (1)
  2. Не передавайте одну 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);
...