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

时间:2011-03-09 02:03:44

标签: windows delphi themes readonly tcheckbox

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

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

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

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

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

问题的屏幕截图 - 这是三个选中的复选框,一个禁用,一个只读,一个普通:

http://i51.tinypic.com/263g128.png http://i53.tinypic.com/m7co4x.png

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

2 个答案:

答案 0 :(得分:1)

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

enter image description here

用于创建它的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

答案 1 :(得分:0)

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.

enter image description here