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

2023-12-28

我试图让 TActionMainMenuBar 像 TMainMenu 一样显示样式化的 MDI 按钮。

有什么建议么?我无法停止在这个项目中使用 MDI。


好的,首先这不是 Vcl 样式错误,这是一个 VCL 错误。即使禁用了 Vcl 样式,也会出现此问题。

该问题位于TCustomMDIMenuButton.Paint使用旧的方法DrawFrameControl http://msdn.microsoft.com/en-us/library/windows/desktop/dd162480%28v=vs.85%29.aspxWinAPi 方法绘制标题按钮。

procedure TCustomMDIMenuButton.Paint;
begin
  DrawFrameControl(Canvas.Handle, ClientRect, DFC_CAPTION,
    MouseStyles[MouseInControl] or ButtonStyles[ButtonStyle] or
    PushStyles[FState = bsDown]);
end;

作为解决方法,您可以使用以下方法修补此方法detour然后使用以下方法实现新的绘制方法StylesServices.

只需将此单元添加到您的项目中即可。

unit PatchMDIButtons;

interface

implementation

uses
  System.SysUtils,
  Winapi.Windows,
  Vcl.Themes,
  Vcl.Styles,
  Vcl.ActnMenus;

type
  TCustomMDIMenuButtonClass= class(TCustomMDIMenuButton);

  TJumpOfs = Integer;
  PPointer = ^Pointer;

  PXRedirCode = ^TXRedirCode;
  TXRedirCode = packed record
    Jump: Byte;
    Offset: TJumpOfs;
  end;

  PAbsoluteIndirectJmp = ^TAbsoluteIndirectJmp;
  TAbsoluteIndirectJmp = packed record
    OpCode: Word;
    Addr: PPointer;
  end;

var
  PaintMethodBackup   : TXRedirCode;

function GetActualAddr(Proc: Pointer): Pointer;
begin
  if Proc <> nil then
  begin
    if (Win32Platform = VER_PLATFORM_WIN32_NT) and (PAbsoluteIndirectJmp(Proc).OpCode = $25FF) then
      Result := PAbsoluteIndirectJmp(Proc).Addr^
    else
      Result := Proc;
  end
  else
    Result := nil;
end;

procedure HookProc(Proc, Dest: Pointer; var BackupCode: TXRedirCode);
var
  n: NativeUInt;
  Code: TXRedirCode;
begin
  Proc := GetActualAddr(Proc);
  Assert(Proc <> nil);
  if ReadProcessMemory(GetCurrentProcess, Proc, @BackupCode, SizeOf(BackupCode), n) then
  begin
    Code.Jump := $E9;
    Code.Offset := PAnsiChar(Dest) - PAnsiChar(Proc) - SizeOf(Code);
    WriteProcessMemory(GetCurrentProcess, Proc, @Code, SizeOf(Code), n);
  end;
end;

procedure UnhookProc(Proc: Pointer; var BackupCode: TXRedirCode);
var
  n: NativeUInt;
begin
  if (BackupCode.Jump <> 0) and (Proc <> nil) then
  begin
    Proc := GetActualAddr(Proc);
    Assert(Proc <> nil);
    WriteProcessMemory(GetCurrentProcess, Proc, @BackupCode, SizeOf(BackupCode), n);
    BackupCode.Jump := 0;
  end;
end;


procedure PaintPatch(Self: TObject);
const
  ButtonStyles: array[TMDIButtonStyle] of TThemedWindow = (twMDIMinButtonNormal, twMDIRestoreButtonNormal, twMDICloseButtonNormal);
var
  LButton : TCustomMDIMenuButtonClass;
  LDetails: TThemedElementDetails;
begin
  LButton:=TCustomMDIMenuButtonClass(Self);
  LDetails := StyleServices.GetElementDetails(ButtonStyles[LButton.ButtonStyle]);
  StyleServices.DrawElement(LButton.Canvas.Handle, LDetails, LButton.ClientRect);
end;

procedure HookPaint;
begin
  HookProc(@TCustomMDIMenuButtonClass.Paint, @PaintPatch, PaintMethodBackup);
end;

procedure UnHookPaint;
begin
  UnhookProc(@TCustomMDIMenuButtonClass.Paint, PaintMethodBackup);
end;


initialization
 HookPaint;
finalization
 UnHookPaint;
end. 

结果将是

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

TActionMainMenuBar、VCL 样式和 MDI 按钮(最小化、关闭等)未设置样式。 的相关文章

  • DELPHI win32 的 ORM [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道 Delphi Win32 的 ORM 或类似的东西吗 Marco Cantu 是 Insta
  • 为什么Delphi打开时间越长编译速度就越慢,我该怎么办?

    我的公司十多年来一直在德尔福上运行一个大型项目 我们的代码库多年来一直在增长 目前代码数量约为 400 万行 编译速度正在成为一个问题 我们花了时间清除单元循环引用 编译缓慢的已知原因 并检查了设置的各个方面 已经到了我们无法通过我们所能控
  • 如何修复 Delphi Prism ASP.NET 错误:“解析器错误消息:‘Oxygene’不是受支持的语言”

    我在 Delphi Prism 中编写了一个 ASP NET Web 应用程序 不是网站 在我的开发机器上一切正常 但是当我将其安装在测试服务器上时 出现以下错误 Server Error in MyApp Application Pars
  • 使用 GdiPlus 卸载 DLL 时程序挂起

    我有一个加载 DLL 的应用程序 它使用德尔福 GDI 库 http sourceforge net projects delphigdiplus 该应用程序在卸载 DLL 时挂起 调用免费图书馆 https msdn microsoft
  • 调用泛型类型的方法?

    为什么下面的代码在 Delphi XE 中会产生错误 unit UTest interface type TTest class public procedure Foo
  • 从单个应用程序中的多个线程调用 dll 函数是否安全?

    我正在 Delphi 2009 中编写一个服务器应用程序 它实现了多种类型的身份验证 每种身份验证方法都存储在单独的 dll 中 第一次使用身份验证方法时 会加载适当的 dll 仅当应用程序关闭时 DLL 才会被释放 在服务器线程 连接 之
  • 如何使用用户输入来寻址 Pascal 中的特定变量(Eval/Exec?)

    我正在尝试在分形程序中做一些非常具体的事情隆起7X http apophysis 7x org 使用的脚本语言是Pascal 该项目是用德尔福写的 https svn code sf net p apophysis7x svn trunk
  • Delphi - 将物理路径(设备文件句柄)转换为虚拟路径

    我怎样才能转换像这样的路径 设备 HarddiskVolume3 Windows 进入其相应的虚拟路径 如本例中的 c Windows 我个人更喜欢原生方式 function GetHDDDevicesWithDOSPath TString
  • 如何将FireMonkey表单无缝嵌入VCL表单中?

    我使用了中描述的技巧这个问题 https stackoverflow com questions 7315050 delphi xe2 possible to instantiate a firemonkey form in vcl app
  • Delphi 2007 中的 HelpInsight 文档

    我正在使用 D2007 并尝试使用 HelpInsight 功能 自 D2005 起提供 来记录我的源代码 我主要对让 HelpInsight 工具提示正常工作感兴趣 通过各种网上冲浪和实验 我发现了以下内容 使用三斜杠 注释样式比其他记录
  • 在 Delphi 2007 中将具有透明度的位图保存为 PNG

    我有一个包含透明度信息的 Delphi 位图 32 位 我需要将其转换并保存为 PNG 文件 同时保留透明度 我目前拥有的工具是graphics32 Library GR32 PNG 由Christian Budde 提供 和PNGImag
  • 在TImageViewer中,如何获取用户点击图片的位置?

    在TImageViewer控件中 用户可以缩放或平移图片 我的问题是 当用户点击图片时 如何获取用户在图片上的点击位置 尤其是用户可以对图片进行放大 缩小或平移之后 如何获取对应的图片点击位置呢 As shown below How to
  • 当 Delphi 处于覆盖模式时,如何更改它的光标形状?

    当使用 Delphi 的任何版本时 我有时会碰巧按下插入键并打开覆盖模式 这通常是一个很大的麻烦 并且您进入覆盖模式的唯一指示是编辑器底部的小文本 当使用其他程序 首先想到的是 Notepad 时 当您处于插入模式时 文本光标是 当您处于覆
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • 如何从 Delphi 中的函数返回对象而不导致访问冲突?

    我有一个返回 TStringList 的 delphi 函数 但是当我返回一个值并尝试使用它时 我收到一个访问冲突错误 即 myStringList FuncStringList myStringList Items Count lt Th
  • Delphi 流畅的界面

    使用上有什么优点和缺点流畅的界面 http en wikipedia org wiki Fluent interface在德尔福 流畅的界面应该会增加可读性 但我对此有点怀疑one包含很多链式方法的长 LOC 是否存在编译器问题 是否存在任
  • 是否可以声明长度受限且不从 0/1 开始的字符串类型?

    在 Delphi 中 可以声明整数值的子范围 例如 type myInt 2 150 它将 myInt 类型的值限制为 2 到 150 之间的值 但是如果我想限制字符串的长度怎么办 如果我写 type myString string 150
  • 对象的引用计数

    在我的代码中 我使用一个小的数据存储类 它是在不同的地方创建的 为了避免内存泄漏并简化事情 我想使用引用计数 所以我这样做了 type TFileInfo class TInterfacedObject IInterface 并删除了我对
  • 如何用不同的颜色绘制选定的列表框项目?

    是否可以更改 TListBox 中的项目选择焦点颜色和文本颜色 当项目中未启用主题或列表框样式设置为所有者绘制时 项目周围的选择将被涂成蓝色 我相信这是由系统的外观设置全局定义的 我想将所选项目的颜色更改为自定义颜色 举个例子 结果会是这样
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍

随机推荐

  • 垂直错开 div

    有没有办法像这张图片一样以交错的垂直排列方式显示 div 到目前为止 我已经使用 Flexbox 来接近 但无法交错行 因为我不想预先确定每行有多少个圆圈 我希望用户的浏览器宽度来控制每行有多少个圆圈 因此圆圈 div 上没有类或子项 随着
  • Play框架 路由不区分大小写

    我们目前正在开发 Play 2 5 x 我们希望实现不区分大小写的路由 比如说 GET via v1 organizations http organizationApi 在我们想要实现的URL中 http localhost 9000 a
  • MFC不支持小于0x0501的WINVER

    我有一个 C 项目引用了许多其他项目 库 这是针对多年前创建的应用程序 大约每年更新一次并完成新版本 我多年来一直使用 Visual Studio 6 更新和构建此应用程序的新版本 没有出现任何问题 我正在尝试切换到 Visual Stud
  • Python NLTK 多线程

    我正在编写一个算法 它可以识别给定文本中的句子 将每个句子拆分成单词并在经过一些验证后返回这些单词 我想在多线程的帮助下实现同样的功能 我正在调用处理每个句子的函数threading thread 它会抛出一个错误 AttributeErr
  • 如何在javascript中获取最高的输入字段值

    我想获得这个领域的最高价值 我怎样才能做到这一点
  • “始终开启”设置会阻止idleTimeout 和periodicRestart 吗?

    您可能知道 Microsoft Azure 网站服务下托管的网站默认配置为空闲 20 分钟后超时 idleTimeout 并且应用程序池每 29 小时重新启动一次 periodicRestart 这会导致第一个用户访问网站时速度很慢 我想知
  • 将 Recaptcha 与 EPiServer XForms 结合使用

    有人有在 EPiServer 中使用 Recaptcha 和 XForms 的经验吗 我不知道将 Recaptcha 控件放在哪里以及如何使其工作 ASP NET 的示例代码如下 我应该把它放在哪里 我的猜测是在FormControl Be
  • 多态推理

    我正在学习 Haskell 在互联网上我发现的是paper https people mpi sws org dreyer tor papers wadler pdf来自菲利普 瓦德勒 我读了它 但根本不明白 但它以某种方式与多态函数联系起
  • Internet Explorer CSS 问题

    This page http a accioly 7rtc com p tecnologia htmlIE 9 也可能是旧版本 无法正确呈现 右侧菜单浮动到页面底部 Firefox Chrome 和 Safari 可以正确渲染它 所有浏览器
  • DispatchQueue :无法在非主线程上使用 asCopy = NO 进行调用

    我正在介绍的是UIAlertController在主线程上为 class HelperMethodClass NSObject class func showAlertMessage message String viewControlle
  • java中使用wait()和notify()的简单场景

    我可以获得一个完整的简单场景 即建议如何使用它的教程 特别是使用队列 The wait and notify 方法旨在提供一种机制 允许线程阻塞直到满足特定条件 为此 我假设您想要编写一个阻塞队列实现 其中有一些固定大小的元素后备存储 您要
  • 如何从谷歌地图API获取导航持续时间和流量?

    我想通过 http 请求从 google 地图 api 获取导航持续时间 但我得到了没有流量的持续时间 我如何获得流量持续时间 您现在可以获得duration in traffic没有高级帐户 只需来自的标准 API 密钥开发者控制台 ht
  • 创建两个列表中所有可能的项目组合的元组,而不在元组中重复项目

    我希望能够获取一系列数字并返回一个包含三元组且不重复的列表 x 的每个元素应该在三元组的每个位置出现一次 目标是得到如下内容 get combinations without duplicates 3 0 1 2 1 2 0 2 0 1 对
  • 从无符号字符到整数类型转换的背景中发生了什么?

    今天我从开关块中得到了一些奇怪的行为 特别是我从文件中读取一个字节并将其与某些十六进制值进行比较 文本文件编码问题 没什么大不了的 代码看起来像这样 char BOM 3 0 b error ReadFile iNCfile BOM 3 l
  • 在 python 中创建元组集

    如何创建一组元组 每个元组包含两个元素 每个元组都会有一个x and y value x y 我有数字 1 到 50 并且想要分配x为所有值 1 到 50 以及y也是 1 到 50 S 1 1 1 2 1 3 1 4 1 50 2 1 50
  • Android 设备上的渲染 webview 与同一父级的先前兄弟姐妹重叠

    反应本机 0 57 集成 RN webview 或 email protected cdn cgi l email protection 在模拟器上 所有同级都会被渲染 文本组件 1 3 在真实设备上 webview 与之前的同级视图重叠
  • codeigniter 中未定义的常量 JSON_UNESCAPED_UNICODE

    我创建一个 Json 文件 json array Add gt array context gt context date gt date Version gt array version gt version And context是波斯
  • JavaScript foreach 关联数组对象上的循环

    为什么我的 for each 循环没有迭代我的 JavaScript 关联数组对象 Defining an array var array Assigning values to corresponding keys array Main
  • Java在MySQL数据库中创建表

    首先感谢之前帮助过我的人 我目前遇到的问题是这行代码 statement executeUpdate myTableName 或者用这些代码行 String myTableName CREATE TABLE AgentDetail idNo
  • TActionMainMenuBar、VCL 样式和 MDI 按钮(最小化、关闭等)未设置样式。

    我试图让 TActionMainMenuBar 像 TMainMenu 一样显示样式化的 MDI 按钮 有什么建议么 我无法停止在这个项目中使用 MDI 好的 首先这不是 Vcl 样式错误 这是一个 VCL 错误 即使禁用了 Vcl 样式