Форум: "WinAPI";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
ВнизКак уничтожать назначенный Brush? Найти похожие ветки
← →
Vemer © (2007-02-16 17:38) [0]Делаем:
Brush1 := CreateSolidBrush($2022);
SelectObject(MainDC,Brush1);
В справке написано, что назначенный Brush через
DeleteObject не удалить.
Вопрос: Как "отцепить" Brush от MainDC или что нужно сделать,
чтобы осуществитьDeleteObject(Brush1);
← →
Игорь Шевченко © (2007-02-16 17:44) [1]OldBrush := SelectObject (MainDC, Brush1);
> Вопрос: Как "отцепить" Brush от MainDC
SelectObject (MainDC, OldBrush);
DeleteObject (Brush1);
← →
Ricks © (2007-02-16 22:02) [2]А можно сделать еще проще?
OldBrush := SelectObject (MainDC, Brush1);
DeleteObject (SelectObject (MainDC, OldBrush));
Вроде бы тоже самое. Я у себя пользовался таким приемом!
← →
Vemer © (2007-02-17 15:28) [3]Спасибо.
В итоге сделал так (все равно все убить надо):FreeDC(Handle,MainDc);
DeleteObject(Brush1);
Нет DC, нет проблемы :).
Нет в таком решении никаких подвоных камней?
← →
homm © (2007-02-17 18:26) [4]тебе же в 2 сказали как правльно. вин98 с канвой работает плохо, потому лучше делать как првильно
← →
undr (2007-02-18 00:20) [5]
> Нет DC, нет проблемы :).
> Нет в таком решении никаких подвоных камней?
Ты не сможешь удалить контекст устройства, пока не восстановишь исходный Brush [SelectObject (MainDC, OldBrush)]. Так что делай, как написали в [1]/[2]
← →
Vemer © (2007-02-19 17:05) [6]Опять я.
Посмотрите окончательный вариант убийства объектов пожалуйста.var //Глобальный VAR, не весь )
Handle: HWND; //локальный хендл
Lb_Close:HWND;//"Контрол"
Pen: Array [0..PenCount] of HPen;
Brush: Array [0..BrushCount] of HBrush;
MainDC: HDC; //DC формы
LbcDC: HDC; // DC "Контрола"
I:Byte;
procedure ShutDown; //процедура выхода из программы
Var
D:Byte;
DelBrush:HBrush;
DelPen:HPen;
Begin
ReleaseMutex(hMutex);
KillTimer(Handle,1);
DelBrush := SelectObject (MainDC, Brush[0]);
DeleteObject(SelectObject (MainDC, DelBrush));
DelPen := SelectObject(MainDC, Pen[0]);
DeleteObject(SelectObject (MainDC, DelPen));
DelBrush := SelectObject (LbcDC, Brush[0]);
DeleteObject(SelectObject (LbcDC, DelBrush));
DelPen := SelectObject(LbcDC, Pen[0]);
DeleteObject(SelectObject (LbcDC, DelPen));
For D := 0 To PenCount do
DeleteObject(Pen[I]); //удаляем набор Pen..
For D := 0 To BrushCount do
DeleteObject(Brush[I]); //удаляем набор Brush..
ReleaseDC (Lb_Close, LbcDC); // освобождение ссыпки
DeleteDC (LbcDC); // удаление ссылки, освобождение памяти
ReleaseDC (Handle, MainDC); // освобождение ссыпки
DeleteDC (MainDc); // удаление ссылки, освобождение памяти
← →
Игорь Шевченко © (2007-02-19 22:14) [7]
> Посмотрите окончательный вариант убийства объектов пожалуйста.
Существует хорошая практика для программиста на API возвращать исходный объект в контекст устройства после работы с ним, например
OldObj := SelectObject (DC, WorkObj);
....что-то делаем с использованием WorkObj
SelectObject (DC, OldObj)
В этом случае при завершении работы достаточно просто выполнить DeleteObject на все созданные объекты.
← →
Vemer © (2007-02-20 14:22) [8]Извините, но я до сих пор не совсем врубаюсь, как это рабтает.
Насколько я понял, какой-то Brush изначально назначен DC.
Надо в начале сохранить этот Brush (OldBrush) , а в конце его назначить, так?
Хорошо, как тогда получить OldBrush в самом начале?
← →
Vemer © (2007-02-20 14:48) [9]Все, немного разобрался.
OldBrush := Select(MainDC,NewBrush);
Дает нам старый. Просто я смысл этой строки сначала понять не мог.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.08.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.046 c