Я думаю, что вам нужен элемент управления, который может содержать другие элементы управления - например, TPanel
- и элемент управления, который может отображать содержимое окна под ним - как TImage
может сделать, когда установлено его свойство Transparent
, Похоже, у вас ошибочное впечатление, что если вы поместите один элемент управления поверх другого, вы получите поведение обоих вместе. Это что не так.
Первое, что вы должны сделать, это избавиться от TImage
элемента управления. Это просто делает вещи сложнее, чем они должны быть. Когда вам нужно нарисовать рисунок кисти на панели, нарисуйте его прямо на панели.
Далее, осознайте, что стиль окна ws_ex_Transparent
определяет, будут ли сначала окрашены родные окна. Это ничего не говорит о том, перекрашивается ли родитель окна. Если родительский элемент вашей панели имеет набор стилей ws_ClipChildren
, он не будет рисовать себя под тем местом, где ваша панель предположительно находится. Похоже, это помогло бы вам, если бы у родительского элемента управления панели был установлен стиль ws_ex_Composited
, но как средство записи компонентов вы не получаете контроль над родителями элементов управления.
TImage
может выглядеть прозрачным, потому что это не оконный элемент управления. У него нет дескриптора окна, поэтому правила ОС для рисования и отсечения не применяются к нему. С точки зрения Windows, TImage
вообще не существует. То, что мы в мире Delphi воспринимаем как картину TImage
, на самом деле является родительским окном, откладывающим отдельную подпрограмму для рисования определенной области родительского окна. Из-за этого TImage
код рисования может просто не закрасить часть родительской области.
Если бы я делал это, я бы спросил себя, действительно ли элемент управления с шаблоном кисти должен быть контейнерным элементом управления. Могу ли я вместо этого просто использовать обычный TImage
с повторяющимся рисунком кисти? Другие элементы управления все еще могут быть поверх него, но они не будут считаться потомками элемента управления шаблоном.