DateTimePicker如何与Delphi自带Style同步
原文出处:DateTimePicker如何与Delphi自带Style同步 - 封三郎 - 博客园 (cnblogs.com)
Delphi 的 DateTimePicker 组件有一个CalColors属性,可以设置 DropDown 打开的日历节目的风格。但如果不使用 Delphi 自带的 Style,在这里设置属性看不到期望的效果。
而使用了 delphi 自带的style,效果又存在瑕疵——日历面板大小有问题。
如果把自带 style 的 client 项关闭,大小倒是对了,之前设置的MonthBackColor属性在边框上也体现出来了,但是和窗体的风格又不统一了。
网上一搜,Stack Overflow 给出了方案——去掉自动绘制 style,去提取 style 的相关元素来设置 CalColors 属性。
尝试一下,效果基本能接受了。记在这里备查。
http://stackoverflow.com/questions/10335310/style-properties-for-tdatetimepicker
unit Unit15; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ImgList, Vcl.StdCtrls, Vcl.ComCtrls; type TForm15 = class(TForm) DateTimePicker1: TDateTimePicker; procedure DateTimePicker1DropDown(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form15: TForm15; implementation {$R *.dfm} uses Winapi.CommCtrl, Vcl.Styles, Vcl.Themes, uxTheme; Procedure SetVclStylesColorsCalendar( DateTimePicker: TDateTimePicker); Var LTextColor, LBackColor : TColor; begin uxTheme.SetWindowTheme(DateTimePicker.Handle, '', '');//disable themes in the calendar //get the vcl styles colors LTextColor:=StyleServices.GetSystemColor(clWindowText); LBackColor:=StyleServices.GetSystemColor(clWindow); DateTimePicker.Color:=LBackColor; //set the colors of the calendar DateTimePicker.CalColors.BackColor:=LBackColor; DateTimePicker.CalColors.MonthBackColor:=LBackColor; DateTimePicker.CalColors.TextColor:=LTextColor; DateTimePicker.CalColors.TitleBackColor:=LBackColor; DateTimePicker.CalColors.TitleTextColor:=LTextColor; DateTimePicker.CalColors.TrailingTextColor:=LTextColor; end; procedure TForm15.DateTimePicker1DropDown(Sender: TObject); var hwnd: WinAPi.Windows.HWND; begin hwnd := SendMessage(TDateTimePicker(Sender).Handle, DTM_GETMONTHCAL, 0,0); uxTheme.SetWindowTheme(hwnd, '', '');//disable themes in the drop down window end; procedure TForm15.FormCreate(Sender: TObject); begin SetVclStylesColorsCalendar( DateTimePicker1); end; end.