delphi - 如何在不丢失系统主题的情况下修复TPageControl背景颜色?

标签 delphi delphi-2010 vcl

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

enter image description here

外部页面控件正确地使用父组件的颜色绘制其背景,但是内部页面控件使用 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;

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

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

最佳答案

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

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

如果我没记错的话,最新的 Delphi 版本中不存在该缺陷。

关于delphi - 如何在不丢失系统主题的情况下修复TPageControl背景颜色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12074478/

相关文章:

database - Delphi 2010 Professional 远程数据库访问

delphi - 如何在组件中添加对操作的支持

delphi - TMainMenu 的丑陋 "disabled"图像

delphi - 我在哪里可以找到 Delphi 的 TPopupMenu 和 TMenuItem 组件编辑器?

delphi - 读取大型二进制文件

delphi - 如何使用单击按钮在绘图网格中绘制选定的单元格

multithreading - 中止线程?

delphi - 我可以使用 Delphi 将用户限制为 Windows 应用程序中的字体子集吗?

delphi - TActionMainMenuBar、VCL 样式和 MDI 按钮(最小化、关闭等)未设置样式。

delphi - 使用拆分器时如何保持控件在表单中可见?