在启用了主题的 Delphi 2010 应用程序中,我在一个带有 clMoneyGreen 背景的表单中有两个 TPageControls(一个在另一个里面):
外部页面控件正确地使用父组件的颜色绘制其背景,但是内部页面控件使用 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 移植的大型应用程序上实现主题,这就是为什么我试图通过派生组件解决这个问题:我可以轻松地搜索并用我的新课程,但在其中一些后面放置面板将需要更多时间。