Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Манипуляция с HBITMAP


Автор: Count0 9.7.2016, 21:49
Доброго времени суток. У меня следующий вопрос: имеется 
Код
HBITMAP
, полученнный следующим образом: 
Код
hbmpFront = (HBITMAP) LoadImage( NULL, "Lenna.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);

Нужно реализовать функции его клонирования и доступа к пикселю. Я в курсе про функции 
Код

GetPixel
Код
GetDIBits
 и аналогичные set-теры, но они требуют 
Код
HDC
, который привязан к устройству и кроме того 
Код
GetPixel
 принимает x и у в логических единицах, связь которых с пикселями для меня не очевидна. Как можно реализовать требуемые методы.
PS: Использовать что-то отличное от WinAPI невозможно, в силу требования к компилятору, который даже gdi+ отказывается поддерживать.

Автор: GremlinProg 10.7.2016, 11:33
Код

hdc = ::CreateCompatibleDC(hScreenDC);
hSysBitmap = ::SelectObject(hdc, hbmpFront);
//  в этой точке, hdc связан с hbmpFront, т.е. вызов GetPixel(hdc, ...) вернет значение пиксела из hbmpFront
::SelectObject(hdc, hSysBitmap);
::DeleteDC(hdc);

hScreenDC - это либо HDC окна, либо HDC экрана.
Чтобы получить HDC экрана используется такой код:
Код

hScreenDC = ::GetDC(nullptr);
//  в этой точке, используем hScreenDC
::ReleaseDC(nullptr, hScreenDC);

Автор: Count0 10.7.2016, 12:12
А как долго можно удерживать контекст экрана? Если он больше нигде не используется можно получить его в начале и освободить перед завершением выполнения программы, сохраняя в статических данных класса обертки изображения?

Автор: GremlinProg 10.7.2016, 18:19
Цитата(Count0 @  10.7.2016,  14:12 Найти цитируемый пост)
А как долго можно удерживать контекст экрана? Если он больше нигде не используется можно получить его в начале и освободить перед завершением выполнения программы, сохраняя в статических данных класса обертки изображения?

Можно не пытаться оптимизировать на таких простых вызовах. Получение контекста экрана не требует каких-то дополнительных телодвижений, в отличии от получения того же контекста окна. В msdn нет каких-то конкретных рекомендаций по этому поводу. Но общие рекомендации касаются требований к памяти, которую будет потреблять при этом Ваше приложение:
Цитата(MSDN @ Display Device Context Cache)
There is no predetermined limit on the amount of device contexts that a cache can hold; the system creates a new display device context for the cache if none is available. Given this, an application can have more than five active device contexts from the cache at a time. However, the application must continue to release these device contexts after use. Because new display device contexts for the cache are allocated in the application's heap space, failing to release the device contexts eventually consumes all available heap space. The system indicates this failure by returning an error when it cannot allocate space for the new device context. Other functions unrelated to the cache may also return errors.

Источник: https://msdn.microsoft.com/ru-ru/library/windows/desktop/dd183572(v=vs.85).aspx
т.е., без необходимости задерживать HDC вообще не нужно

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)