如何在 Windows 主题下使用 Delphi 显示“灰色”只读复选框

Posted

技术标签:

【中文标题】如何在 Windows 主题下使用 Delphi 显示“灰色”只读复选框【英文标题】:How to display a "greyed-out" read-only checkbox using Delphi under windows themes 【发布时间】:2011-07-11 13:33:58 【问题描述】:

我希望只读复选框变灰,但在 Windows(XP 及更高版本)下显示它们的选中/未选中状态,但我遇到了一些问题。

注意 - 关于“只读”:似乎 Delphi 的 TCheckBox 甚至没有只读选项,这是通过将其放在 TPanel 上并禁用它而被“伪造”的......但是问题仍然有效,如何实现一个灰色的只读复选框,或者一个显示其状态的非活动复选框。

禁用的复选框显示为灰色,但不会显示选中或未选中状态。只读复选框可以,但是当 Windows 为它们设置主题时,它们看起来就像普通的可编辑复选框。只读框的值无法更改,但看起来可以。

在关闭主题的 XP 中(即在经典模式下),它可以正常工作。

由于大型应用程序的笨拙/不专业或其开发时间/现金比率而无法接受的解决方案包括: - 手动使文本变灰并显示复选框状态的图像。 - 禁用复选框上的主题,因为没有它们的外观很难看。 - 使用自定义复选框

问题的屏幕截图 - 这些是三个选中的复选框,一个禁用,一个只读和一个正常:

虽然只读和可编辑复选框看起来不同,但这只是因为第一张图片中的可编辑框具有焦点。如果它是具有焦点的那个,则只读的看起来是一样的,如第二张图片所示。

【问题讨论】:

如果 inactive 你的意思是 disabled,我不能在 XP 上复制你的问题,disabled 复选框显示它们的检查状态。而且我找不到控件的 只读 属性.. 对不起,是的,你是对的。活动和非活动是指启用和禁用。 好的。最好在您投反对票之前删除问题。 ;) 我不明白为什么这不是一个有效的问题@David。它询问如何获得仍显示其选中状态的禁用复选框。虽然对于如何实现只读复选框存在误解,但这对问题实际上并不重要。 @Rob 我不知道这些截图来自哪里,但我一直在使用禁用的香草复选框,显示选中状态,一直回到 Delphi 1! 【参考方案1】:

带有主题的复选框在禁用时会显示选中标记,如您在此屏幕截图中所见:

用于创建它的 dfm 如下所示:

object Form2: TForm2
  Left = 0
  Top = 0
  Caption = 'Form2'
  ClientHeight = 337
  ClientWidth = 635
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object CheckBox1: TCheckBox
    Left = 8
    Top = 8
    Width = 153
    Height = 17
    Caption = 'Disabled an checked'
    Checked = True
    Enabled = False
    State = cbChecked
    TabOrder = 0
  end
  object CheckBox2: TCheckBox
    Left = 8
    Top = 31
    Width = 153
    Height = 17
    Caption = 'Enabled and checked'
    Checked = True
    State = cbChecked
    TabOrder = 1
  end
  object CheckBox3: TCheckBox
    Left = 8
    Top = 54
    Width = 153
    Height = 17
    Caption = 'Disabled an un-checked'
    Enabled = False
    TabOrder = 2
  end
  object CheckBox4: TCheckBox
    Left = 8
    Top = 77
    Width = 153
    Height = 17
    Caption = 'Enabled and un-checked'
    TabOrder = 3
  end
end

【讨论】:

【参考方案2】:

Anonymous 要求提供演示禁用复选框以显示其选中状态的代码。

program Project28;

uses
  Forms, StdCtrls;

var
  Form: TForm;

procedure Initialise;
var
  cb1, cb2: TCheckBox;
begin
  cb1 := TCheckBox.Create(Form);
  cb2 := TCheckBox.Create(Form);
  cb1.Parent := Form;
  cb2.Parent := Form;
  cb1.Top := 0;
  cb2.Top := 16;
  cb1.Enabled := False;
  cb2.Enabled := False;
  cb1.Checked := False;
  cb2.Checked := True;
  cb1.Caption := 'Checkbox1';
  cb2.Caption := 'Checkbox2';
end;

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm, Form);
  Initialise;
  Application.Run;
end.

【讨论】:

“你的问题是找出你的代码中阻止他们这样做的原因!”你是对的,我打算这样做 :) 干杯!

以上是关于如何在 Windows 主题下使用 Delphi 显示“灰色”只读复选框的主要内容,如果未能解决你的问题,请参考以下文章

启用主题的 Windows XP/Vista 中的 TAnimate 将不起作用 [关闭]

如何使用Delphi在Win7防火墙中打开端口

delphi程序如何从任务栏及时还原、显示窗体?

如何使用 Delphi 在控制台应用程序中激活玻璃效果(Windows Vista/7)

delphi下如何制作纯dos下能够运行的程序,并非是控制台程序

如何使用 Delphi 10.3.3 检测 Windows 11