Подтвердить что ты не робот

Как исправить цвет фона TPageControl без потери системной темы?

В приложении Delphi 2010 с включенными темами у меня есть два TPageControls (один внутри другого) в форме с фоном clMoneyGreen:

enter image description here

Элемент управления внешней страницы правильно рисует свой фон с цветом родительского компонента, однако внутренний элемент управления страницей рисует его фон с помощью clBtnFace (красный эллипс на изображении) вместо его родительского элемента управления (TTabSheet) белого цвета. Есть ли способ исправить это, не возвращая элемент управления страницы в свой классический внешний вид (потерять тему Windows)?

Все исправления, которые я нашел в Google, и здесь, в Stack Overflow, входит OwnerDraw, которые заставляют элемент управления страницы терять свою тематику.

Я попытался создать новый компонент управления страницей, унаследованный от TPageControl, с помощью метода обработки сообщения Windows WM_ERASEBKGND:

procedure TMyPageControl.WMEraseBkGnd(var Msg: TWMEraseBkGnd);
begin
  if Parent is TCustomPageControl then
  begin
    Brush.Color := clWhite;
    Windows.FillRect(Msg.dc, ClientRect, Brush.Handle);
    Msg.Result := 1;
  end
  else
    inherited;
end;

Он окрашивает белый фон, но другой метод, вызванный после WM_ERASEBKGND (я предполагаю метод TWinControl WM_PAINT), перерисовывает серый цвет на белом фоне.

Примечание. Я изучаю это, потому что я реализую их в большом приложении, перенесенном с Delphi 7, поэтому я пытаюсь решить эту проблему через производный компонент: я могу легко найти и заменить все 207 TPageControl вхождения с моим новым классом, но размещение панелей за некоторыми из них потребует больше времени.

4b9b3361

Ответ 1

Это известная ошибка в Delphi 2010. Вы можете обойти ее, добавив панель, являющуюся дочерним элементом самого внешнего таблиц, и является родителем элемента управления внутренней страницы.

Я не знаю, почему это устраняет проблему. Я обнаружил обходное решение самостоятельно, потому что заметил, что в моем приложении единственные вложенные элементы управления вкладкой/страницей, которые отображались правильно, были те, у которых панель подходящим образом была вставлена.

Если я правильно помню, дефект отсутствует в последних версиях Delphi.