![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сделать компонент поверх всех. [D5, D6, Win95/98, Win2k]
avr555 © (2001-12-21 16:50:00)Как в RunTime перевести компонент поверх всех других?
MBo (2001-12-22 07:18:00) [1]Спасибо, в общих чертах понятно, с деталями надо самому разбираться.
Юрий Зотов (2001-12-21 20:50:00) [2]Z-оrder здесь ни при чем.
Дело в том, что графические контролы - это расширение Delphi, а в Windows существуют только оконные контролы. Поэтому в терминах Windows графические контролы Delphi - это просто рисунки, о которых сама Windows, естественно, ничего не знает (действительно, мало ли что там нарисовала какая-то программа, откуда системе об этом знать?).
Когда Windows обновляет окно, то сначала она шлет сообщения о перерисовке родительскому окну, а потом его дочерним окнам (что и понятно, ведь в противном случае родительское окно затирало бы свои контролы). Получив сообщение, родительское окно перерисовывается и при этом перерисовываются его графические контролы (а когда же им еще перерисовываться? ведь это не окна, хэндлов они не имеют и сообщений не получают - а поэтому могут перерисовываться только вместе с родительским окном). Причем ВСЕ дочерние контролы (и оконные, и графические) ВСЕГДА рисуются на канве родительского окна (а где же еще им рисоваться?).
После родительского окна сообщения о перерисовке получают его оконные контролы и тоже начинают перерисовываться - естественно, НА ТОЙ ЖЕ САМОЙ КАНВЕ родительского окна, вот что важно! Понятно, что при этом они неизбежно будут затирать то, что ранее на этой же канве было нарисовано - то есть, те графические контролы, с которыми они перекрываются.
Вот и оказывается, что ОКОННЫЙ контрол ВСЕГДА будет поверх ГРАФИЧЕСКОГО. Если сравнить форму с крышкой стола, то графические контролы можно сравнить с рисунками на этой крышке, а оконные - с предметами, лежащими на этом столе. Ясно, что предмет всегда закроет рисунок.
MBo (2001-12-21 18:23:00) [3]>Юрий Зотов
не подскажете, чем это обусловлено? Судя по исходникам,
TWinСontrol перекрывает SetZOrderPosition TControl, а TGraphicControl нет.
Позиция первого устанавливается в списке FWinControls родителя,
а второго в списке FControls, подмножеством которого, как я понимаю, является FWinControls.
Что же тогда не дает TGraphicControl встать перед оконным?
Юрий Зотов (2001-12-21 17:10:00) [4]Добавление - графический контрол НИКОГДА не ляжет поверх оконных на том же Parent"е.
MBo (2001-12-21 17:01:00) [5]BringToFront