MADbI4 |
опубликован 01-05-2001 16:23 MSK
Люди добры подскажите, вот сделал чтоб отображалась красивая шкала показывая скорость соединения. Но в ней присутствует утечка памяти, я грешу на кисть Так как при отключении уничтожения -создавания разноцветных кистей утечка прикращается. Делаю я так 1. CBrush br; Создаю обьект 2. br.CreateSolidBrush(RGB(224,227,228)); создаю кисть опред. цвета 3. ...Пользуюсь 4. br.DeleteObject(); Удаляю кисть чтобы еа ее основе создать новую далее на наг 2. Подскажите что не так.вот функция где применяется этот код. void <какойто класс>::_DrawDiagram(CDC *dc, int pos, int left, int top) {//Параметры где рисовать(CDC),значение графы(макс 10),поз. слева, поз справа CRect rc2;//Размеры CBrush br;//Кисть , на нее все подозрения br.CreateSolidBrush(RGB(224,227,228)); //кисть для заливкм фона ограничевающего прямоугольника (серо-фиолет) CBrush *pBr=dc->SelectObject(&br); //Выбираю свою кисть ,сохраняя дескр. на старую rc2.left =left;//10; rc2.right =left+4;//14; rc2.top =top;//10; rc2.bottom =top+9;//19; //Задаю координаты dc->Rectangle(left-2,top-2,left+51,top+11); //Обрамляющий прямоугольник for(int i=0;i<pos;i++) {//В цикле рисую столько полосок скока передано в pos br.DeleteObject(); //Уничтожаю свою кисть чтобы создать новую др. цвета if(i<=5) {//Выбираю цвет заполнение //До 5 с красного до желтого br.CreateSolidBrush(RGB(255,(i*51),0)); }else {//После 5 с жёлтого до зеленого br.CreateSolidBrush(RGB(255-(i*51),255,0)); } dc->SelectObject(&br); //Выбираю созданую кисть и рисую ей прямоуголники (шкалу) dc->Rectangle(rc2); rc2.left +=5; rc2.right +=5; //Передвигаюсь на след поз. и рисую след прямоуголник } dc->SelectObject(pBr); //Выход из цикла выбираю кисть ранее сохраненую,выход }
|
MADbI4
|
опубликован 02-05-2001 10:42 MSK
Коша спасибо,именно этот оператор я и пропустил. А так как рисование вызывалось часто (список с OWNERDRAW) ресурсы поедались очень быстро. Если кому нада много-кратно использовать графический обьект вот ПРАВИЛЬНЫЙ синтаксис: 1. CBrush *pbr,br; 2. br.CreateSolidBrush(Какойлибо цвет); 3. pBr=dc.Selectobject(&br); 4. ...Рисуем новой кистью 5. dc.Selectobject(pBr); 6. br.DeleteObject(); Идем на шаг 2 Также подобный "алгоритм" можно применять и к другим граф. обьектам, таким как CPen,CBrush,CFont,CBitmap итк.
|