ActionBar 中的 XP 样式字形烦恼

2024-02-05

我不想问太多与组件外观相关的问题,但如今应用程序中的外观似乎同样重要。

无论如何,请看下面的图片:

两者都使用 TActionManager 和 TActionMainMenuBar 来创建我的主菜单。图像左侧的菜单使用平台默认样式,右侧的菜单使用我的 TActionManager 定义的 XP 样式。

请注意,当左侧菜单突出显示时,字形保持不变,这是完美的。

现在看看右侧的XP样式菜单,字形绘制了阴影,稍微弹出,您可以看到透明度使字形显得有点奇怪。

我想为我的 UI 启用 XP 风格,但我不喜欢绘制字形的方式。我还想将 TToolbar 更改为 TActionToolBar 并应用相同的 XP 样式,但这也会呈现相同的字形。

如何制作在 TAc​​tionManager 中定义的 XP 样式菜单,而不是像这样渲染字形?

Thanks.

EDIT

这就是应用了以下答案中的一些技术后的结果:

Craig.


下面是一些覆盖 XP STYLE 的示例代码,创建了一个您可以根据需要进行调整的派生类。这里的第一步是替换您自己的派生菜单项类,并更改其 DrawGlyph 代码,正如 David 告诉您的那样。我想你也许可以使用一些示例代码。

这只是一个快速演示。它不会在带有字形的选中项周围绘制一个框,因此此自定义样式与选中项不兼容,除非它们没有字形。您必须弄清楚要如何绘制选中的字形项(如果设置了 Action.Checked 属性,那么我编写 DrawGlyphFrame 的地方将是添加一些内容以在字形周围绘制选中状态矩形的好地方)。

unit MyActionControlStyle;

// Using this unit: Add it to your project. In your project set your
// style at runtime, add the unit to your uses clause and then set the style
// in that form's formcreate event:
//   ActionManager1.Style := MyActionControlStyle.MyStyle;

interface

uses Forms,
     Types,
     Controls,
     XPActnCtrls,
     XPStyleActnCtrls,
     ActnMan,
     ActnList,
     ActnMenus,
     ActnCtrls;

type

 TMyStyleMenuItem = class(TXPStyleMenuItem)
  protected
      procedure DrawGlyph(const Location: TPoint); override;

//      procedure DrawGlyphFrame(const Location:TPoint);

 end;
 TMyStyleMenuButton = class(TXPStyleMenuButton)
 end;

 TMyStyleActionBars = class(TXPStyleActionBars)
   // override the stuff that I want different than XP Style:
    function GetControlClass(ActionBar: TCustomActionBar;
      AnItem: TActionClientItem): TCustomActionControlClass; override;

 end;

var
 MyStyle:TMyStyleActionBars;

implementation


uses ToolWin, Classes, Windows, Graphics, GraphUtil, ImgList;
{ TMyStyleActionBars }

function TMyStyleActionBars.GetControlClass(ActionBar: TCustomActionBar;
  AnItem: TActionClientItem): TCustomActionControlClass;
begin
 if ActionBar is TCustomActionPopupMenu then
    Result := TMyStyleMenuItem
  else
  if ActionBar is TCustomActionMainMenuBar then
    Result := TMyStyleMenuButton
  else
    Result := inherited GetControlClass(ActionBar,AnItem);

end;

{ TMyStyleMenuItem }

procedure TMyStyleMenuItem.DrawGlyph(const Location: TPoint);
var
  ImageList: TCustomImageList;
  DrawEnabled: Boolean;
begin
//  DrawGlyphFrame(Location);
  if not HasGlyph and IsChecked then
  begin
    Canvas.Pen.Color := ActionBar.ColorMap.FontColor;
    DrawCheck(Canvas, Point((TextBounds.Left - 5) div 2, Height div 2), 2);
  end;

  if not HasGlyph then exit;
  if Assigned(Action) then
    ImageList := ActionClient.Action.ActionList.Images
  else
    ImageList := ActionClient.OwningCollection.ActionManager.Images;
  if not Assigned(ImageList) then exit;
  DrawEnabled := Enabled and (ActionClient.ImageIndex <> -1) or
    (csDesigning in ComponentState);
  ImageList.Draw(Canvas, Location.X, Location.Y, ActionClient.ImageIndex,
    dsTransparent, itImage, DrawEnabled);

end;

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

ActionBar 中的 XP 样式字形烦恼 的相关文章

  • 如何在显示表单之前强制将焦点集中在组件上

    我必须展示 与ShowModal 一个有很多的表格TEdit但我想把注意力集中在TEdit 但并不总是相同 具体取决于上下文 我不能使用SetFocus之前ShowModal 因为表单未激活 并使用该组件Name or Tag在我的应用程序
  • 如何在以管理员身份运行模式下部署应用程序?

    如何部署应用程序 使其需要管理员权限 而无需最终用户手动执行此操作 我使用 Delphi 2009 来构建该应用程序 您可以使用以下命令通知 Windows 您的应用程序需要以管理员身份运行requestedExecutionLevel应用
  • 在 Delphi 中,我的 DLL 中是否必须分配函数的返回 pchar

    我有一个 DLL 其中有一个返回 pchar 的函数 以避免必须使用 borlndmm 我最初所做的是将字符串转换为 pchar 并返回 Result pChar SomeFuncThatReturnsString 但 90 的情况下我都能
  • delphi检查ini文件是否存在

    如何检查 INI 文件是否存在 在特定路径和特定名称下 比如这样 if FileExists c yourinifile ini then ShowMessage c yourinifile ini exists
  • 有什么办法可以将2个数组添加到一个数组中吗?

    有没有一种简单通用的方法可以将两个数组添加到一个数组中 在下面的情况下 不可能简单地使用C A B陈述 我想避免每次都为它制定算法 TPerson record Birthday Tdate Name Surname string end
  • 无法通过Delphi替换Word应用程序中的页脚文本

    我正在尝试替换页脚中的文本 我使用以下代码 通过它我可以替换正常内容 正文 但不能替换页脚 页眉中的内容 myWinWordApp CreateOLEObject Word Application myWinWordApp visible
  • ComboBox.Sorted 发生了什么:= True;在德尔福 10.2 中?

    最近我的最后一个问题获得了 风滚草 徽章 我不确定是否应该问更多问题 但这里是 我正在填充一个TComboBox使用 sqlite 表中的项目 效果很好 在我以前的 Delphi 版本中 我能够使用ComboBox1 Sorted True
  • 如何更改 Delphi 2010 IDE 中编辑器选项卡的字体大小?

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

    当我从另一个控件切换到组合框时 它会显示文本周围带有虚线的框 但是当我以编程方式将控件设置为活动状态时 它不会显示相同的焦点指示器 这种行为有解决方法吗 我有德尔福XE6 MCVE unit Unit27 interface uses Wi
  • Delphi 7,加载PNG到TImage

    只是想加载 PNG 尝试使用适用于其他格式的 OleGraphic 来使用我的 LoadPic 但在 PNG 上失败 目标是将图像复制到隐藏位图 然后将其屏蔽并复制到可见的工作图像画布 如果 CopyRect 不这样做 请随意提出其他建议
  • ADODB 组件导致 Win7/Server 2008 上的访问冲突

    我有一段用 Delphi 2005 编写的代码 用于在 LDAP 中搜索用户的特定属性 当在 Windows 7 或 Server 2008 上运行时 我遇到访问冲突 但在 XP 或 2003 上则没有 Function IsSSOUser
  • 我可以在“Delphi 2007 for Win32”中使用.NET DLL吗?

    是否可以在 Delphi 2007 for Win32 中使用 NET DLL 我尝试以与 ActiveX 组件相同的方式导入 DLL 但它似乎不起作用 组件菜单 gt 导入组件 gt 导入 NET 程序集 是否可能 如果可以 步骤是什么
  • 获取 TransactSql 批处理中的语句数计数

    对于不使用 Delphi 的读者 虽然以下内容是根据 Delphi 编码来表达的 但我的实际技术问题不是特定于 Delphi 的 而是关于如何找出 Sql Server 如何 理解 TransactSql 批处理提交给它 TAdoQuery
  • Delphi线程死锁

    我有时会在销毁某些线程时遇到死锁问题 我尝试过调试该问题 但在 IDE 中调试时似乎从未存在死锁 可能是因为 IDE 中的事件速度较低 问题 当应用程序启动时 主线程会创建多个线程 线程始终处于活动状态并与主线程同步 完全没有问题 当应用程
  • 在运行时按需更改组件类

    我的问题与这里的想法类似 替换delphi中的组件类 https stackoverflow com q 4685863 937125 但我需要改变一个specific按需组件类 这是一些伪演示代码 unit Unit1 TForm1 cl
  • Async InputQuery 不处理“取消”按钮

    我正在使用一个简单的调用TDialogServiceAsync InputQuery 使用单个输入 它只是忽略了Cancel按钮和窗口的X关闭按钮 But the Ok按钮工作正常 这是我的代码 uses FMX DialogService
  • 德尔福数据结构

    我可能需要在 Delphi 中做一个项目 并且是该领域的初学者 目前 我正在网上搜索资源 但由于资源站点太少而感到困惑 首先 你能给我一些好的网站 其中包含我迄今为止错过的 Delphi 资源吗 我也在 Delphi 中搜索数据结构 想知道
  • 如何遍历任意给定集合中的枚举?

    我有很多枚举类型 它们与相应的集合相结合 例如 type TMyEnum meOne meTwo meThree TMyEnums set of TMyEnum 我正在尝试提出一组可以运行的函数any枚举集 而不是为每个枚举编写单独的函数
  • 如何在 Delphi DBLookupComboBox 中选择正确的项目

    我有一个数据库查找组合框连接到数据库查询 那部分工作正常 当我运行程序时数据库查找组合框填充有查询的结果 我想看看数据库查找组合框填充第一项 请选择 当 的时候程序第一次运行或者当一个新项目行动已启动 见下图 另外 如果我正在加载以前保存的
  • 每次 TDbGrid 的选定位置更改时都会触发什么事件?

    我的项目中有一个 TDbGrid 每次更改所选行时我都试图触发一个事件 行中的任何更改都已经更新了链接到同一数据源的所有数据感知控件 但还需要进行其他更改 我需要一个事件处理程序 我认为 OnColEnter 会起作用 根据帮助文件 它在以

随机推荐

  • 查找包含任意数量的嵌套哈希和数组的哈希深处的键/值对

    Web 服务返回的哈希值包含未知数量的嵌套哈希值 其中一些包含数组 而数组又包含未知数量的嵌套哈希值 有些键不是唯一的 即存在于多个嵌套哈希中 然而 我真正关心的所有键都是唯一的 有什么办法可以给顶级哈希提供一个键 并取回它的值 即使键值对
  • 如何在 Web 应用程序中控制 iPhone 的屏幕方向

    我有一个非常基本的网页 它使用 flot 来创建canvas基于图 类似于 SO 用于声誉图的图 对于 PC 显示器 它应该正常输出 宽度 x 轴 为高度的 1 6 倍 但对于 iPhone 我希望页面默认为横向 而不是让它以 纵向 方向溢
  • 从 Snowflake 中的字符串中删除非 ASCII 字符

    如何从 Snowflake SQL 中的字符串中删除所有非 ASCII 字符 我遇到过使用 T SQL 等的解决方案 但没有关于如何在雪花中执行此操作的文章 正则表达式应该足够了 除非您考虑其他情况 select regexp replac
  • 存储凭据以供自动使用

    我已经环顾四周 由于我不是安全或加密专家 所以我仍然对如何在程序中实现加密感到困惑 我需要一台服务器来登录其 gitHub 帐户 以更新具有特殊标头的代码文件 我现在遇到的唯一难题是如何存储 检索服务器的凭据 PushOptions pus
  • 使用 Jackson 将消息从 JSON 反序列化为 POJO

    如果您在不检查消息的情况下不知道要使用什么类型的 POJO 那么如何使用 Jackson 将 JSON 文档反序列化为 POJO 有没有办法向 Jackson 注册一组 POJO 以便它可以根据消息选择一个 我试图解决的场景是通过线路接收
  • 如何在 Laravel 中将集合或自定义查询分页到 API json 中?

    我有一个复杂的查询 该查询不基于我想要对其输出进行分页的任何特定模型表 然而 Laravel 的内置分页依赖于模型和表格 如何对集合进行分页并使输出与 laravel 内置的分页输出格式匹配 我将其保存在 app Core Helpers
  • Rails 3:延迟加载与急切加载

    在 Rails 3 中 这些是相同还是不同 它们有何不同 o Appointment find 297 o service o Appointment includes service find 297 o service 我不确定 但看起
  • Scala Option 对象位于另一个 Option 对象内

    我有一个模型 其中有一些选项字段 其中包含另一个选项字段 例如 case class First second Option Second name Option String case class Second third Option
  • WiX,如何防止文件卸载,尽管我们忘记设置永久=“是”

    我们有一个用 Wix 创建的产品安装程序 其中包含一个程序包 V1 和一些配置文件 现在 我们将使用新的产品代码进行重大升级 其中旧版本的产品被卸载并且 V2 已安装 我们想要的是保存其中一个配置文件以防止卸载 因为 V2 也需要它 不幸的
  • R:深度复制函数参数

    考虑下面的代码 i 3 j i i 4 j i 然而 我想要的是 i 3 f lt function x j i x j i 4 f 4 16 but i want it to be 12 如果您想知道为什么我要这样做 您可以考虑这段代码
  • Java反射:如何从对象获取字段值,而不知道它的类

    比如说 我有一个返回自定义的方法List与一些物体 它们返回为Object大部头书 我需要从这些对象中获取某个字段的值 但我不知道这些对象的类 有没有办法通过反射或其他方式来做到这一点 假设一个简单的情况 你的领域是public List
  • 字形未加载

    由于某种原因 当我使用 twitter bootstrap 2 3 2 时 图像的图标未加载 我有默认结构 CSS 图像 js 其他一切都有效 我也尝试添加一个简单的图标 例如 span class icon icon ok OK span
  • RabbitMq - ConversationId 与 CorrelationId - 哪个更适合跟踪特定请求?

    RabbitMQ 似乎有两个非常相似的属性 我并不完全理解其中的区别 ConversationId and CorrelationId 我的用例如下 我有一个网站 可以生成Guid 该网站调用 API 将该唯一标识符添加到HttpReque
  • 类型错误:“builtin_function_or_method”对象没有属性“__getitem__”

    我有简单的python功能 def readMainTemplate templateFile template open templateFile r data template read index1 data index origin
  • 类型错误:无法读取反应中未定义的属性“减少”

    我有一个表单 要求用户输入几个字段的字段值 将字段值存储在状态中并以自定义格式显示状态值 所以 我有几个输入字段和一个提交按钮
  • 如何使用 Bash 脚本自动添加用户帐户和密码?

    我需要能够在 Linux Fedora 10 上创建用户帐户 并通过 bash 脚本 或其他方式 如果需要的话 自动分配密码 通过 Bash 创建用户很容易 例如 whoever server usr sbin useradd newuse
  • Angular 2中的zip文件上传问题

    当我尝试上传 zip 文件时 不幸的是它没有上传到服务器上 它给了我错误 有些事情发生了 这是我的代码 const event this fileEvent console log FileEvent gt event const file
  • 在开发容器中运行 VSCode 时如何打开本地终端?

    我正在使用 VSCode 从内部编写代码VSCode 容器 https code visualstudio com docs remote containers 我可以在开发容器内打开终端 https code visualstudio c
  • SHA256 哈希值有多长?

    我要跑SHA256密码 盐 但我不知道要花多长时间VARCHAR设置 MySQL 数据库时 什么是好的长度 正如其名称所示 sha256 的长度为 256 位 由于 sha256 返回十六进制表示 4 位足以编码每个字符 而不是 8 位 如
  • ActionBar 中的 XP 样式字形烦恼

    我不想问太多与组件外观相关的问题 但如今应用程序中的外观似乎同样重要 无论如何 请看下面的图片 两者都使用 TActionManager 和 TActionMainMenuBar 来创建我的主菜单 图像左侧的菜单使用平台默认样式 右侧的菜单