![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как уничтожать назначенный Brush? [D6, WinXP]
Vemer © (2007-02-16 17:38:00)Делаем:
Brush1 := CreateSolidBrush($2022);
SelectObject(MainDC,Brush1);
В справке написано, что назначенный Brushчерез
DeleteObjectне удалить.
Вопрос: Как "отцепить" Brushот MainDCили что нужно сделать,
чтобы осуществитьDeleteObject(Brush1);
Vemer (2007-02-20 14:48:00) [1]Все, немного разобрался.
OldBrush := Select(MainDC,NewBrush);
Дает нам старый. Просто я смысл этой строки сначала понять не мог.
Vemer (2007-02-20 14:22:00) [2]Извините, но я до сих пор не совсем врубаюсь, как это рабтает.
Насколько я понял, какой-то Brush изначально назначен DC.
Надо в начале сохранить этот Brush (OldBrush) , а в конце его назначить, так?
Хорошо, как тогда получить OldBrush в самом начале?
Игорь Шевченко (2007-02-19 22:14:00) [3]
> Посмотрите окончательный вариант убийства объектов пожалуйста.
Существует хорошая практика для программиста на API возвращать исходный объект в контекст устройства после работы с ним, например
OldObj := SelectObject (DC, WorkObj);
....что-то делаем с использованием WorkObj
SelectObject (DC, OldObj)
В этом случае при завершении работы достаточно просто выполнить DeleteObject на все созданные объекты.
Vemer (2007-02-19 17:05:00) [4]Опять я.
Посмотрите окончательный вариант убийства объектов пожалуйста.
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); // удаление ссылки, освобождение памяти
undr (2007-02-18 00:20:00) [5]
> Нет DC, нет проблемы :).
> Нет в таком решении никаких подвоных камней?
Ты не сможешь удалить контекст устройства, пока не восстановишь исходный Brush [SelectObject (MainDC, OldBrush)]. Так что делай, как написали в [1]/[2]
homm (2007-02-17 18:26:00) [6]тебе же в 2 сказали как правльно. вин98 с канвой работает плохо, потому лучше делать как првильно
Vemer (2007-02-17 15:28:00) [7]Спасибо.
В итоге сделал так (все равно все убить надо):
FreeDC(Handle,MainDc);
DeleteObject(Brush1);
Нет DC, нет проблемы :).
Нет в таком решении никаких подвоных камней?
Ricks (2007-02-16 22:02:00) [8]А можно сделать еще проще?
OldBrush := SelectObject (MainDC, Brush1);
DeleteObject (SelectObject (MainDC, OldBrush));
Вроде бы тоже самое. Я у себя пользовался таким приемом!
Игорь Шевченко (2007-02-16 17:44:00) [9]OldBrush := SelectObject (MainDC, Brush1);
> Вопрос: Как "отцепить" Brush от MainDC
SelectObject (MainDC, OldBrush);
DeleteObject (Brush1);