在DateTime Picker上设置Back Color

时间:2014-01-13 14:02:19

标签: delphi vcl delphi-xe3

如何在TDateTimePicker上创建Back Color功能。我只想设置控件的背景颜色。

3 个答案:

答案 0 :(得分:2)

日期时间选择器控件,在主题应用程序中显示时,具有由主题确定的颜色。您无法控制主题颜料使用的颜色。

您可以使用SetWindowTheme禁用控件的主题并实现您想要的效果。以下是使用插入器类的示例:

type
  TDateTimePicker = class(Vcl.ComCtrls.TDateTimePicker)
  protected
    procedure CreateWnd; override;
    procedure CNNotify(var Message: TWMNotifyDT); message CN_NOTIFY;
  end;

procedure TDateTimePicker.CreateWnd;
begin
  inherited;
  SetWindowTheme(WindowHandle, '', '');
  CalColors.BackColor := clFuchsia;
  CalColors.MonthBackColor := clFuchsia;
  CalColors.TitleBackColor := clFuchsia;
end;

procedure TDateTimePicker.CNNotify(var Message: TWMNotifyDT);
var
  DropDownHandle: HWND;
begin
  inherited;
  case Message.NMHdr.code of
  DTN_DROPDOWN:
    begin
      DropDownHandle := Perform(DTM_GETMONTHCAL, 0, 0);
      SetWindowTheme(DropDownHandle, '', '');
    end;
  end;
end;

enter image description here

请注意,我们还需要在日期/时间选择器的子月份日历控件上禁用主题。那是因为日历是使用与主控件分开的窗口绘制的。

您可以选择不禁用主控件的主题,在这种情况下控件如下所示:

enter image description here

但我觉得这看起来有点奇怪。

@RRUZ就日期时间选择器的VCL样式密切相关的主题写了一个很好的答案:Style properties for TDateTimePicker

答案 1 :(得分:0)

使用Win32 API SendMessage()函数或TDateTimePicker自己的Perform()方法向DTP发送DTM_SETMCCOLOR消息。

答案 2 :(得分:0)

您可以使用SendMessage()来禁用Windows主题

uses
Winapi.CommCtrl,Vcl.Styles,Vcl.Themes,uxTheme;
procedure TForm1.DateTimePicker1DropDown(Sender: TObject);
var hwnd: WinAPI.Windows.HWND;
begin
     hwnd:=SendMessage(TDateTimePicker(Sender).Handle,DTM_GETMONTHCAL,0,0);
     uxTheme.setWindowTheme(hwnd,'','');
end;

在CalColors工作之后

Result Image

Link Youtube Vidéo