Re[2]: Течет ручей, бежит ручей. И ты ничья и я ничей.
Hello Ischuk и Victor,
Sunday, April 23, 2006, 1:48:44 PM, you wrote:
IP> Попробуё сделать таким-вот образом:
IP> 1 Создай переменную СBitmap *pOldBmp;
IP> 2 Вызывай функцию pOldBmp=SetBitmap(твой_рисунок);
IP> 3 Затем, в конце цикла
IP> pDC->SelectObject( pOldBmp ); //где pDC- контекст рисования
// Получаем DC для рисования
HDC hDC = ::GetDC (GetSafeHwnd());
// Выбираем свой HBITMAP в DC, запоминаем старый HBITMAP
HBITMAP hOldBit = (HBITMAP)SelectObject(hDC, NewBmp);
// Выбираем старый BITMAP в DC (освобождаем свой BITMAP из DC)
SelectObject(hDC, hOldBit);
// Удаляем BITMAP
DeleteObject (NewBmp);
// Освобождаем DC
::ReleaseDC (GetSafeHwnd(), hDC);
Вот если таким образом, то никаких утечек нет. Осталось выяснить почему на кнопке
ничего не вырисовывается :) Может неправильно задаю какие свойства кнопок.
VVV> Эти переменные надо инициализировать, сохранять, пока ведется
VVV> работа (всякие SetBitmap-ы используются, и.т.д.)
VVV> Потом, когда битмапы больше не нужны, надо выбрать для кнопки
VVV> битмап SetBitmap(NULL) и уничтожить все битмапы при помощи DeleteObject.
VVV> Тогда не будет утечки ресурсов.
Добавление перед SetBitmap'om конструкции
HBITMAP NewBmp=GetBitmap();
SetBitmap(NULL);
DeleteObject(NewBmp);
увеличивает толщину ручья (утечки памяти) в 2 раза.
VVV> Вобщем, идеология работы с ресурсами GDI такая:
VVV> 1. создал
VVV> 2. выбрал куда то, при этом сохранив то, что там было ранее
VVV> Например, при выборе битмапа в совместимый контекст устройства,
VVV> надо сохранять дескриптор битмапа, который в нем уже выбран.
VVV> 3. попользоваться
VVV> 4. вернуть все обратно (старые битмапы выбрать туда, где они были раньше,
VVV> и.т.д.).
VVV> 5. убить все созданные ресурсы
Давай представим идеальный случай: в цикле крутятся 3 HBITMAP bit1, bit2, bit3
которые загружены при старте программы. Этот цикл надо прервать только перед
выходом программы. Какие шаманские действия с SetBitmap надо сделать, чтобы
не было утечек?
>> Подскажите, люди, где про них почитать можно.
VVV> В MSDN, наверно. Ну и всякие книжки по программированию в винде, где
VVV> про рисование упоминается.
Ага. Нашел книжонку (Дэвида Круглински). Начал по-немногу заставлять себя
сидеть с ней в обнимку. Пока не помогает. Наверно, надо ее попробовать
открыть :) Так что скоро сам все пойму. Всем спасибо за ответы.