如何修复TPageControl背景颜色而不丢失系统主题?

Dan*_*ula 10 delphi vcl delphi-2010

在启用了主题的Delphi 2010应用程序中,我在一个带有clMoneyGreen背景的表单中有两个TPageControl(一个在另一个内):

在此输入图像描述

外部页面控件正确地使用父组件的颜色绘制其背景,然而内部页面控件使用clBtnFace(图像中的红色省略号)而不是其父控件(TTabSheet)的白色绘制其背景.有没有办法解决这个问题,而无需将页面控件返回到其Windows经典外观(丢失Windows主题)?

我在Google和Stack Overflow中找到的所有修复都涉及OwnerDraw,这使得页面控件失去了主题.

我尝试使用一种方法来创建从TPageControl继承的新页面控件组件来处理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;
Run Code Online (Sandbox Code Playgroud)

它描绘了背景白色,但在WM_ERASEBKGND(我猜测TWinControl的WM_PAINT方法)之后调用的其他一些方法在白色背景上重新绘制灰色.

注意:我正在研究这个,因为我正在从Delphi 7移植的大型应用程序上实现主题,这就是我试图通过派生组件解决这个问题的原因:我可以轻松搜索和替换所有207 TPageControl事件与我的新课程,但在其中一些面板后面放置需要更多时间.

Dav*_*nan 12

这是Delphi 2010中的一个已知错误.您可以通过添加一个面板来解决它,该面板是最外层标签页的子项,并且是内部页面控件的父级.

我不知道为什么这可以解决这个问题.我自己才发现了解决方法,因为我注意到在我的应用程序中,唯一嵌套的选项卡/页面控件正确呈现的是那些面板适当插入的控件.

如果我没记错的话,最新的Delphi版本中没有这个缺陷.

  • 这个[embarcadero页面](http://qc.embarcadero.com/wc/qcmain.aspx?d=80381)仍然将错误报告为开放 (2认同)
  • 顺便说一句,请阅读此页面以了解接受答案:http://meta.stackexchange.com/questions/5234/谢谢 (2认同)