Как отобразить "неактивный" флажок только для чтения с использованием Delphi под темами Windows
Я хочу, чтобы флажки "только для чтения" были неактивными, но отображают их статус отмеченных / не отмеченных в Windows (XP и выше), но у меня есть некоторые проблемы.
ПРИМЕЧАНИЕ. - Относительно "только для чтения". Похоже, что в Delphi TCheckBox даже нет опции "только для чтения", это было "подделано" путем помещения его в TPanel и отключения этого... Однако вопрос по-прежнему остается в силе как можно сделать неактивным флажок только для чтения, ИЛИ неактивный флажок, отображающий его состояние.
Отключенные флажки выделены серым цветом, но они не отображают проверенное или непроверенное состояние. Флажки только для чтения могут, но когда Windows создает их, они просто выглядят как обычные редактируемые флажки. Поле, доступное только для чтения, не может изменить свое значение, но, похоже, оно может.
В XP с отключенными темами (т.е. в классическом режиме) все работает правильно.
К неприемлемым решениям из-за того, насколько они неуклюжи / непрофессиональны для большого приложения или соотношения времени и средств его разработки, относятся следующие: - Ручная серая текст и отображение изображения статуса флажка. - Отключение тем на флажках, так как смотреть без них некрасиво. - Использование пользовательских флажков
Снимки экрана: это три флажка, один из которых отключен, один только для чтения и один обычный:
http://i51.tinypic.com/263g128.png http://i53.tinypic.com/m7co4x.png
Хотя флажки "только для чтения" и "редактируемый" выглядят по-разному, это объясняется тем, что фокусировочный элемент в первом изображении имеет фокус. Только для чтения будет выглядеть так же, если он с фокусом, как видно на втором изображении.
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.
Флажки с темами показывают отключенную отметку, когда отключены, как вы можете видеть на этом скриншоте:
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