CheckListBox项目样式

时间:2018-12-04 15:10:57

标签: delphi

我在启动时添加了项目(给定文件夹名称中的文件名),并且我正在使用此过程来完成单击项目时的操作:

procedure TForm1.CheckListBoxClickCheck(Sender: TObject);

如何使选中的项目更改其颜色或样式?换句话说,我单击一个项目,然后检查后将加粗

2 个答案:

答案 0 :(得分:3)

您需要将Style属性设置为lbOwnerDrawFixed,并在OnDrawItem事件中自己绘制项目。

例如

procedure TForm1.CheckListBox1DrawItem(Control: TWinControl;
  Index: Integer; Rect: TRect; State: TOwnerDrawState);
var
  Flags: Longint;
begin
  with TCheckListBox(Control) do
  begin
    if Checked[Index] then
    begin
      Canvas.Font.Style := Canvas.Font.Style + [fsBold];
      Canvas.Font.Color := clRed;
    end;
    Canvas.FillRect(Rect);
    if Index < Items.Count then
    begin
      Flags := DrawTextBiDiModeFlags(DT_SINGLELINE or DT_VCENTER or DT_NOPREFIX);
      if not UseRightToLeftAlignment then
        Inc(Rect.Left, 2)
      else
        Dec(Rect.Right, 2);
      DrawText(Canvas.Handle, PChar(Items[Index]), Length(Items[Index]), Rect,
        Flags);
    end;
  end;
end;

procedure TForm1.CheckListBox1ClickCheck(Sender: TObject);
begin
  TCheckListBox(Sender).Invalidate;
end;

请注意,Invalidate中的OnClickCheck也是必需的,因为在选中/取消选中某项时控件不会失效(至少在我当前的Delphi版本中不是)。

答案 1 :(得分:0)

@Felix
Kobik的答案是最好的。我对此无可奉告。

但是,如果您对创建这样的“复杂”自定义绘图代码不熟悉,则还有一种类似黑客的选择:编写自己的CheckListBox:将多个复选框放在TPanel或TScrollBox中,然后将它们对齐到顶部。这样,您可以访问每个复选框属性(字体,大小,样式等)。
可以通过复合控件以这种方式创建许多新控件。

请记住,这只是一种替代/ 肮脏的黑客行为。是。它将与Delphi样式(vsf)一起使用。