如何修改Delphi TDateTimePicker控件的日历字体大小?
调整Delphi TDateTimePicker弹出日历的字体大小
TDateTimePicker的Font属性仅作用于编辑区域,弹出的日历控件属于系统底层的SysMonthCal32窗口,需要通过Windows API捕获并修改它的字体。具体步骤如下:
1. 捕获日历弹出事件
当TDateTimePicker弹出日历时,会向父窗口发送DTN_DROPDOWN通知,我们可以通过处理WM_NOTIFY消息来捕获这个时机。
2. 获取日历控件句柄
使用DateTime_GetMonthCal API(需引用CommCtrl单元)获取弹出日历的窗口句柄,这个API专门用于从TDateTimePicker获取其关联的月历控件句柄。
3. 设置日历字体
创建目标字体,通过WM_SETFONT消息将字体应用到日历控件上。
完整代码示例
unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Winapi.CommCtrl; type TForm1 = class(TForm) DateTimePicker1: TDateTimePicker; private procedure WMNNotify(var Msg: TWMNotify); message WM_NOTIFY; public { Public declarations } end; const DTN_FIRST = $FFFFFD00; DTN_DROPDOWN = DTN_FIRST + 0; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WMNNotify(var Msg: TWMNotify); var CalHandle: HWND; NewFont: HFONT; begin // 检查是否是目标DateTimePicker的日历弹出通知 if (Msg.NMHdr.code = DTN_DROPDOWN) and (Msg.NMHdr.hwndFrom = DateTimePicker1.Handle) then begin // 获取弹出日历的句柄 CalHandle := DateTime_GetMonthCal(DateTimePicker1.Handle); if CalHandle <> 0 then begin // 创建12px的字体(高度为负数表示像素单位) NewFont := CreateFont( -12, 0, 0, 0, FW_NORMAL, False, False, False, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH or FF_DONTCARE, '微软雅黑' ); // 给日历控件设置字体并立即重绘 SendMessage(CalHandle, WM_SETFONT, WPARAM(NewFont), 1); end; end; inherited; end; end.
关键说明
- 确保引用
Winapi.CommCtrl单元,否则DateTime_GetMonthCal无法识别 CreateFont的高度参数使用负数,代表以像素为单位设置字体大小(-12对应12px)- 字体名称可根据需求修改,比如替换为
'宋体'等系统字体 - 不需要手动释放创建的字体,日历控件会自动管理其生命周期
内容的提问来源于stack exchange,提问作者gene b.
相关产品推荐
相关产品推荐

