(Windows) Когда удалять объект и контекст устройства? - PullRequest
1 голос
/ 21 июня 2011

Предположим, я создал функцию, которая обрабатывает растровое изображение в памяти постоянного тока и возвращает его

HBITMAP paint (HWND hwnd)
{

HDC windc = ::GetWindowDC(hwnd);
HDC memdc = ::CreateCompatibleDC(windc);
HBITMAP bitmap = ::CreateCompatibleBitmap(windc,100,100); //Don't bother with the height and width
::SelectObject(memdc,(HGDIOBJ)bitmap);

/* DeleteDC(windc) here? */

//do the painting
//...
//painting done

/*DeleteDC(memdc) here? */

return bitmap;

/* Code does not reach here */
/* So where do I put DeleteObject(bitmap)? */
}

Мой вопрос: где и когда удалить растровое изображение?Кроме того, удаление windc влияет на memdc?или memdc чисто создан (и не содержит информации, которая "указывает" на windc)?Если это так, тогда удаление windc после создания растрового изображения и memdc (до любой рисования) является целесообразным.

1 Ответ

1 голос
/ 21 июня 2011
DeleteDC(windc);

Никогда. Вам нужно позвонить ReleaseDC (windc); вместо этого.

После ::CreateCompatibleDC(windc); вам не нужно windc и все равно, что с ним происходит. HDC, возвращаемый CreateCompatibleDC, просто выводит некоторые параметры (зависящее от устройства представление пикселей и т. Д.), Но никак не ссылается на windc.

Вместо этого:

::SelectObject(memdc,(HGDIOBJ)bitmap);

//do the painting
//...
//painting done

/*DeleteDC(memdc) here? */

return bitmap;

Вы должны сделать что-то вроде этого:

HGDIOBJ prevBitmap = ::SelectObject(memdc,(HGDIOBJ)bitmap);

//do the painting
//...
//painting done

::SelectObject(memdc,prevBitmap);
DeleteDC(memdc);

return bitmap;
...