转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
TPanel 在使用 Theme Service 时的 Bug         ★★★★

TPanel 在使用 Theme Service 时的 Bug

作者:闵涛 文章来源:闵涛的学习笔记 点击数:834 更新时间:2009/4/23 18:30:35
问题:
 
    Panel 控件在使用了 XPtheme 后背景色没了 ...

解决方法有四:
   
    1、使用 TShape 带颜色覆盖在 panel 的表面
 
    2、修改 ExtCtrls.pas 得 1778 行,忽略对 Themes 的判断
 
    3、先设置 panel 的 ParentBackground 为 True,再设置回去
 
    4、修改 ExtCtrls.pas 的 262 行为:
 
        property ParentBackground { stored FParentBackgroundSet };
 
总体的,方法 3 的改动最少,不过每次都要这样弄一下 ...
 
论述:
 
在设计期、运行期,没有使用 windows xp theme 样式(引用 XpMan 单元):
 
而使用了 xp 样式后的设计期、运行期:
 
使用 xp theme 后 panel 竟然变得透明了!
 
查看源码:
 
procedure TCustomPanel.Paint; 得实现:
 
其中 ExtCtrls.pas 得 1778 行决定背景得画法:
 
    if not ThemeServices.ThemesEnabled or not ParentBackground then
    begin
      Brush.Color := Color;
      FillRect(Rect);
    end; 
 
解决办法 1:直接把 not ThemeServices.ThemesEnabled 砍掉,定成 True,不过似乎暴力些
 
解决办法 2:设置 ParentBackground 属性为 False 就可以了,=^0^= so easy
 
可是查看属性,傻眼了:ParentBackground 属性已经是 False 了:
 
单步看 TCustomPanel.Paint 得运行,此时得 ParentBackground 却是 True!
 
查找 GetParentBackground  得实现代码:
 
function TWinControl.GetParentBackground: Boolean;
begin
  Result := csParentBackground in ControlStyle;
end;
而 csParentBackground 只有在
 
procedure TWinControl.SetParentBackground(Value: Boolean);
 
中才被设置:其中在 TCustomPanel 中被 override 了:
 
procedure TCustomPanel.SetParentBackground(Value: Boolean);
begin
  { TCustomPanel needs to not have csOpaque when painting
    with the ParentBackground in Themed applications }
  if Value then
    ControlStyle := ControlStyle - [csOpaque]
  else
    ControlStyle := ControlStyle + [csOpaque];
  FParentBackgroundSet := True;
  inherited;
end;
 
注意到那个 FParentBackgroundSet 变量,他标记用户是否设置了 ParentBackground,干什么用的?:
 
在 ExtCtrls.pas 的 262 行:
 
    property ParentBackground stored FParentBackgroundSet;
 
原来 ParentBackground 只有当用户设置了 ParentBackground 后才流化到 dfm 中的,为了验证,查看 dfm 流化:
 
原使的(没有流化 ParentBackground 属性,此时 ParentBackground 为 True,不过再设计器没有表现出来,而是默认的 False):
 
object Panel1: TPanel
  Left = 8
  Top = 8
  Width = 218
  Height = 245
  Caption = ''''Panel1''''
  Color = clGreen
  TabOrder = 0
end
 
设置 panel 的 ParentBackground 为 True,再设置回去,此时应该与上面的“一摸一样”,可是:
 
object Panel1: TPanel
  Left = 8
  Top = 8
  Width = 218
  Height = 245
  Caption = ''''Panel1''''
  Color = clGreen
  ParentBackground = False
  TabOrder = 0
end

此时运行,一切正常 :)


[常用软件]过期踢出域名服务(Expire Domain Service)  [VB.NET程序]vb.net控件、web service简述
[Delphi程序]李维:樂趣無窮,可能無限的新技術-Web Service  [Delphi程序]一步一步用Delphi6实现Web Service
[Delphi程序]什么是Web Service  [Delphi程序]编写一个单独的Web Service for Delphi7(步骤)
[Delphi程序]为Windows Service添加服务描述  [Delphi程序]如何在各种开发语言中调用web service
[Delphi程序]Delphi开发NT Service程序  [Delphi程序]关于C#下写的Web Service 服务在Delphi下调用时的…
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台