【发布时间】:2014-01-13 14:02:19
【问题描述】:
如何使背景颜色功能在 TDateTimePicker 上工作。我只想设置控件的背景颜色。
【问题讨论】:
标签: delphi vcl delphi-xe3
如何使背景颜色功能在 TDateTimePicker 上工作。我只想设置控件的背景颜色。
【问题讨论】:
标签: delphi vcl delphi-xe3
日期时间选择器控件在主题应用程序中显示时,具有由主题确定的颜色。您无法控制主题涂料使用的颜色。
您可以使用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;
请注意,我们还需要在日期/时间选择器的子月历控件上禁用主题。这是因为日历是使用与主控件不同的窗口绘制的。
您可以选择不禁用主控件的主题,在这种情况下,控件如下所示:
但我觉得这看起来有点奇怪。
@RRUZ 为日期时间选择器写了一个关于 VCL 样式密切相关主题的出色答案:Style properties for TDateTimePicker
【讨论】:
使用 Win32 API SendMessage() 函数或 TDateTimePicker 自己的 Perform() 方法向 DTP 发送 DTM_SETMCCOLOR 消息。
【讨论】:
您可以使用 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 之后它起作用了
结果图片
【讨论】: