Как я могу повторно использовать дескриптор HBITMAP? - PullRequest
1 голос
/ 05 июня 2011

Мне нужно рисовать растровое изображение несколько раз.Он загружен из файла.Я могу перезагрузить его каждый раз, когда мне нужно использовать его в SelectObject следующим образом:

void drawBitmap(HWND hWnd, int xPos, int yPos) {
    HBITMAP hBmp = (HBITMAP) LoadImage(NULL, "image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
    HDC hDC = GetDC(hWnd);
    HDC hdcMem = CreateCompatibleDC(hDC);
    SelectObject(hdcMem, hBmp);
    BitBlt(hDC, xPos, yPos, 7, 7, hdcMem, 0, 0, SRCCOPY);
}
drawBitmap(hMainWnd, 0, 0);
drawBitmap(hMainWnd, 14, 0);
drawBitmap(hMainWnd, 28, 0);

Но возможно ли сделать что-то подобное?

HBITMAP hBmp = (HBITMAP) LoadImage(NULL, "image.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
void drawBitmap(HWND hWnd, int xPos, int yPos) {
    HBITMAP hBmp2 = hBmp;
    HDC hDC = GetDC(hWnd);
    HDC hdcMem = CreateCompatibleDC(hDC);
    SelectObject(hdcMem, hBmp2);
    BitBlt(hDC, xPos, yPos, 7, 7, hdcMem, 0, 0, SRCCOPY);
}
drawBitmap(hMainWnd, 0, 0);
drawBitmap(hMainWnd, 14, 0);
drawBitmap(hMainWnd, 28, 0);

Но эторисует только одно растровое изображение ...

MSDN говорит:

Функция SelectObject выбирает объект в указанном контексте устройства (DC).Новый объект заменяет предыдущий объект того же типа.

Так что, возможно, мой hBmp потрачен впустую после вызова SelectObject.Но я сначала скопировал его в hBmp2, тогда в чем проблема?

1 Ответ

5 голосов
/ 05 июня 2011

Вы не удаляете DC памяти, когда закончите с ним. Это означает, что DC пропущен, и растровое изображение все еще выбрано в этом просочившемся DC. И согласно документации SelectObject: «Приложение не может выбрать одно растровое изображение в более чем один DC одновременно».

Таким образом, вторая SelectObject завершается ошибкой, поскольку растровое изображение все еще выбирается в первой HDC.

Очистите себя, вызвав DeleteDC в конце функции drawBitmap (а также вызовите DeleteObject в hBmp, когда вы закончите с ней).

Кроме того, строка HBITMAP hBmp2 = hBmp; ничего не дает. Вы просто назначаете дескриптор другой переменной. Это все тот же дескриптор того же растрового изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...