Delphi XE2 VCL 样式、从 TLabel 删除样式或禁用类换肤

2024-01-03

使用 XE2 VCL 样式,我想禁用 TLabel(或属性 sfTextLabelNormal)的换肤

我已经尝试了其他问题的各种解决方案,例如使用 Engine.UnRegisterStyleHook,但它没有效果。


The TLabel http://docwiki.embarcadero.com/Libraries/en/Vcl.StdCtrls.TLabel组件不使用样式钩子,因为它不是双控 http://docwiki.embarcadero.com/Libraries/en/Vcl.Controls.TWinControl后代,所以你不能使用UnRegisterStyleHook http://docwiki.embarcadero.com/Libraries/en/Vcl.Themes.TCustomStyleEngine.UnRegisterStyleHook功能。相反,您必须覆盖 PaintDoDrawText http://docwiki.embarcadero.com/Libraries/en/Vcl.StdCtrls.TCustomLabel.DoDrawText方法。

UPDATE

这里有一个关于如何覆盖 TLabel 的绘制过程的示例。

//declare this code in the implementation part 
uses
 Vcl.Themes,
 Vcl.Styles;

type
  TLabelHelper= class helper for TCustomLabel
    procedure DrawNormalText(DC: HDC; const Text: UnicodeString; var TextRect: TRect; TextFlags: Cardinal);
  end;

{ TLabelHelper }

procedure TLabelHelper.DrawNormalText(DC: HDC; const Text: UnicodeString;
  var TextRect: TRect; TextFlags: Cardinal);
begin
  Self.DoDrawNormalText(DC, Text, TextRect, TextFlags);
end;


{ TLabel }

procedure TLabel.DoDrawText(var Rect: TRect; Flags: Integer);
const
  EllipsisStr = '...';
  Ellipsis: array[TEllipsisPosition] of Longint = (0, DT_PATH_ELLIPSIS, DT_END_ELLIPSIS, DT_WORD_ELLIPSIS);
var
  Text, DText: string;
  NewRect: TRect;
  Height, Delim: Integer;
begin
  Text := GetLabelText;
  if (Flags and DT_CALCRECT <> 0) and
     ((Text = '') or ShowAccelChar and (Text[1] = '&') and (Length(Text) = 1)) then
    Text := Text + ' ';

  if Text <> '' then
  begin
    if not ShowAccelChar then Flags := Flags or DT_NOPREFIX;
    Flags := DrawTextBiDiModeFlags(Flags);
    Canvas.Font := Font;
    if (EllipsisPosition <> epNone) and not AutoSize then
    begin
      DText := Text;
      Flags := Flags and not DT_EXPANDTABS;
      Flags := Flags or Ellipsis[EllipsisPosition];
      if WordWrap and (EllipsisPosition in [epEndEllipsis, epWordEllipsis]) then
      begin
        repeat
          NewRect := Rect;
          Dec(NewRect.Right, Canvas.TextWidth(EllipsisStr));
          DrawNormalText(Canvas.Handle, DText, NewRect, Flags or DT_CALCRECT);
          Height := NewRect.Bottom - NewRect.Top;
          if (Height > ClientHeight) and (Height > Canvas.Font.Height) then
          begin
            Delim := LastDelimiter(' '#9, Text);
            if Delim = 0 then
              Delim := Length(Text);
            Dec(Delim);
            if ByteType(Text, Delim) = mbLeadByte then
              Dec(Delim);
            Text := Copy(Text, 1, Delim);
            DText := Text + EllipsisStr;
            if Text = '' then
              Break;
          end else
            Break;
        until False;
      end;
      if Text <> '' then
        Text := DText;
    end;

    if Enabled or StyleServices.Enabled then
      DrawNormalText(Canvas.Handle, Text, Rect, Flags)
    else
    begin
      OffsetRect(Rect, 1, 1);
      Canvas.Font.Color := clBtnHighlight;
      DrawNormalText(Canvas.Handle, Text, Rect, Flags);
      OffsetRect(Rect, -1, -1);
      Canvas.Font.Color := clBtnShadow;
      DrawNormalText(Canvas.Handle, Text, Rect, Flags);
    end;
  end;
end;

在使用它之前声明一个中介层类这样

  TLabel = class (Vcl.StdCtrls.TLabel)
    procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
  end;

这就是结果

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi XE2 VCL 样式、从 TLabel 删除样式或禁用类换肤 的相关文章

  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible
  • Delphi - 通过 ADO 查询获取 Excel 行

    我有以下 Excel 文件 我将 AdoConnection ConnectionString 设置为 AdoConnection ConnectionString Provider Microsoft Jet OLEDB 4 0 Data
  • 如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小?

    有谁知道如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小 我的 1080p 22 显示器的字体太小 无法阅读 而且会导致眼睛疼痛 一些笔记 它不尊重系统的 DPI 设置 因此更改系统设置没有帮助 而且 我现在已经使用 14
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议
  • 如何将我的图标添加到组件选项板页面中的组件? [复制]

    这个问题在这里已经有答案了 可能的重复 Delphi非可视化组件图像 https stackoverflow com questions 3319276 delphi non visual component image 如何将我的图标添加
  • 如何从具有管理员权限的应用程序接收键盘输入到非管理员应用程序?

    我编写了一个应用程序 该应用程序具有覆盖类型的窗口 可以通过热键显示和隐藏该窗口 而另一个应用程序具有焦点 所述另一个应用程序是一个以管理员权限运行的 DirectX 游戏 我已经尝试了 3 种可能的解决方案 以便在其他应用程序中按下我的热
  • 如何以编程方式安排任务

    如何使用 delphi 7 像 Google updater 一样安排任务 我没有使用注册表 因为它被卡巴斯基防病毒软件检测为误报 我在注册表中作为启动项添加的任何内容都会被检测为特洛伊木马 因此我决定使用任务计划 下面的代码展示了如何删除
  • VCL.位图到 FMX.位图

    我在网上找到了这段代码 但 FMX Bitmap 没有扫描线 是否可以以某种方式将 VCL TBitmap 复制或绘制到 FMX Bitmap IFDEF MSWINDOWS type TBitmap FMX Types TBitmap T
  • Firemonkey 编辑/组合自动完成/打字时自动建议

    实施方式是什么Autocomplete or Autosuggest适用于 Windows Android 平台以及 MacOS 和 iOS 的 Delphi Firemonkey Example 当用户在 Google 搜索框中输入文本时
  • Delphi - 自XE8以来如何正确注册图形类?

    我正在编写一个 Delphi 包 它提供了一个新的自定义 TGraphic 对象 允许读取 VCL 组件 如 TImage 中的新图像格式 我最初使用 RAD Studio XE7 开发了这个包 并且运行良好 然而 我最近迁移到了较新的 R
  • 使用Delphi检查HTML代码中是否有对象属性值

    如何使用Delphi检查HTML代码中是否有输入对象属性值 there isn t value attribute
  • 当显示对话框时淡出应用程序的所有其他窗口?

    如何在 Delphi 2009 中调暗 淡出应用程序的所有其他窗口 Form 有一个 AlphaBlend 属性 但它仅控制透明度级别 但如果我们能有这样的东西那就太好了 集中窗口 http www anappaday com downlo
  • 如何根据输入的内容过滤组合框的内容?

    我们有一个包含 100 多个项目的组合框 当我们在组合框中输入字符时 我们想要过滤掉项目 例如 如果我们输入 ac 并单击下拉选项 那么我们希望它仅显示以 ac 开头的项目 我怎样才能做到这一点 也许您会更喜欢使用操作系统内置的自动完成功能
  • 我如何在Delphi中处理事件?

    例如 我有一个程序 在单击 Button1 后执行某些操作 如果没有 Button1Click 中的代码 如何处理按钮的 onclick 事件 我需要为 Button1 动态添加事件 unit Unit1 interface uses Wi
  • 如何在Delphi中下载一个非常简单的HTTPS页面?

    我尝试了在这里看到的代码 但它不适用于 HTTPS 我需要将此页面作为字符串下载 并在其上添加一些换行符 以便将信息按顺序放入 TMemo 中 怎么做 我尝试使用 Indy 但由于 SSL 问题而失败 我尝试了此页面的解决方案 如何将网页下
  • 如何在调试器中显示 TStringList 的内容?

    我想在调试应用程序时显示 TStringList 的全部内容 相反 我只是得到指示 Flist 仅显示地址 如果您使用的是 Delphi 2010 或更高版本 调试器允许使用调试可视化工具 http docwiki embarcadero
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • Delphi IDE导致CPU过热

    我正在使用 Delphi 7 但我已经尝试过 Delphi 2005 2010 版本 在所有这些新版本中 当 Delphi IDE 在屏幕上可见时 我的 CPU 利用率为 50 一个核心为 100 另一个核心为 宽松 当 IDE 最小化时
  • 如何在运行时(Delphi/Windows)程序中添加代码?

    我正在Windows XP Delphi 7上工作 我需要在正在运行的程序中添加一些过程 或函数 并且我不想在完成后再次重新编译它 我只有一个具有 5 个功能的主机应用程序来发送不同类型的警报 但是还有其他新的警报类型 所以我必须执行新的功
  • Mac 上的 Delphi - 可能吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我负责一个 Delphi Win32 项目管理应用程序 我刚刚完成了向 Delphi 2009 的迁移

随机推荐

  • peewee - 动态修改数据库模型元(例如模式)

    为了将相同的数据插入到不同架构中的同一组表中 有关移动应用程序的数据 其中应用程序 ID 是主键 但应用程序是跨平台的并且存在于不同平台上 每个平台的架构 因此 pp id 不会干扰具有它作为fk 我已经拥有了一些基础设施 但我没想到会有这
  • 为什么使用 AT 命令从 Arduino GPRS 连接到 xively 时 TCP 连接不断关闭?

    我正在尝试使用 AT 命令将数据从蜂窝连接的 arduino 温度传感器发送到 xively com 我可以打开 TCP 连接 但随后它立即关闭 为什么TCP连接总是关闭 设置 阿尔杜伊诺乌诺 MacBook Seed Studio GPR
  • 解析 JSON 对象时出现 NoClassDefFoundError JsonAutoDetect

    我正在使用 Amazon 的云服务开发一个 Web 应用程序 我需要使用 JSON 对象 我的项目是如何设置的 我有一个 HTML 表单 用户将在其中填写他们的信息并提交 提交后 数据将被放入在线数据库中 并向他们发送确认电子邮件 在将数据
  • .NET 中本地可继承线程

    NET 4 0 推出ThreadLocal
  • 为什么 PostgreSQL 认为范围类型中的 NULL 边界与无限边界不同?

    只是前言 我不是在问what区别在于 NULL 边界和无限边界 这就是在另一个问题中涵盖 https stackoverflow com questions 15578050 null vs infinity in postgresql r
  • Chrome - Font Awesome 5 某些图标无法正常工作

    我正在使用 Font Awesome 5 某些图标在 Chrome 中未显示 例如 fa facebook f 当我将图标类更改为 fa facebook 时 它就可以工作了 有办法解决吗 这是我在 chrome 中看到的 a href t
  • 是否可以创建指向目录中最新文件的符号链接?

    我的 UNIX 盒子里有一个主目录 我想在其中设置一个数字或快捷方式以指向另一个目录中的最新文件 如果创建了新文件 链接将更新 这可能吗 到目前为止我可以获得最新的文件 ls lrt tail n1 Thanks EDIT 也许我什至可以创
  • ReactiveCocoa 4:如何在不中断信号的情况下向观察者发送错误

    let signal sink Signal lt CLBeacon BeaconManagerError gt pipe 当我调用此方法时 因为用户禁用了蓝牙 sendError self sink error the Signal被中断
  • 如何检测哪个被点击

    我有以下案例 我有一个 和 我需要检测哪个被点击 最终得到Id 我已经构建了以下内容JSFiddle https jsfiddle net paul2903 zknfsasm 作为参考 jQuery document ready funct
  • Flex/ActionScript - 围绕其中心旋转 Sprite

    我在 Actionscript 中创建了一个 Sprite 并将其渲染到 Flex Canvas 上 认为 var fooShape Sprite new FooSpriteSubclass fooCanvas rawChildren ad
  • Android - 翻转动画不平滑翻转

    我想让我的图像水平翻转4次 同时缩小 我有以下用于翻转的代码 ObjectAnimator flipAnimation ObjectAnimator ofFloat view rotationY 0 0f 1440f flipAnimati
  • Django 模板中的双循环

    我已经尝试做这个嵌套循环几个小时了 但到目前为止我的结果都不起作用 这是我到目前为止所拥有的 索引 html for category in categories div class col md 12 column category li
  • 如何确定哪个 Xlint 选项对应于编译器警告?

    我的软件构建使用 Xlint Werror所以我经常遇到破坏我的构建的编译器警告 每隔一段时间 我都会遇到需要抑制的警告 但总是很难弄清楚是哪个警告Xlint选项会抑制我看到的警告 我给你举一个具体的例子 我最近遇到过 WARNING mo
  • 特定计划任务运行失败时如何发送电子邮件

    我有一个 exe 文件 每天由 Windows 2008 上的任务计划程序执行 如果该脚本无法启动 或者脚本在执行过程中失败 我希望收到电子邮件通知 有许多让任务计划根据事件日志条目发送电子邮件的示例 但是 我只想在我的特定计划任务失败时收
  • 异步等待与elasticsearch搜索/滚动

    我在用着await作为我搜索的一部分 但作为我必须使用的 30000 项scroll 问题是搜索的初始部分在scroll是这样的await火灾和功能继续进行 我应该做什么来阻止这种情况 var allTitles try await cli
  • 错误:必须是数据库的所有者

    我想删除一个名为 mysitedb 的特定数据库 所以我所做的是打开终端并输入命令 dropdb mysitedb 然后弹出错误 错误 必须是数据库 mysitedb 的所有者 我知道特定数据库的用户名和密码 但不知道删除它 我是 post
  • 将图像写入本地服务器

    Update 去年接受的答案很好 但今天我会使用其他人都使用的包 https github com mikeal request https github com mikeal request Original 我正在尝试获取 google
  • Swift 3 UIView 动画

    自从将我的项目升级到 swift 3 以来 我的自动布局约束动画不起作用 更具体地说 它们是捕捉到新位置而不是动画 UIView animate withDuration 0 1 delay 0 1 options UIViewAnimat
  • 如何在Eclipse中创建多个同名的项目?

    我是 Eclipse 新手 正在使用 Eclipse Indigo JAVA EE IDE 版本学习 Eclipse 我想在同一个工作区中创建多个同名的项目 可以吗 如果是 如何创建多个同名项目 谢谢 约格什 不 这对于 Eclipse I
  • Delphi XE2 VCL 样式、从 TLabel 删除样式或禁用类换肤

    使用 XE2 VCL 样式 我想禁用 TLabel 或属性 sfTextLabelNormal 的换肤 我已经尝试了其他问题的各种解决方案 例如使用 Engine UnRegisterStyleHook 但它没有效果 The TLabel