1

我目前正在使用 Delphi (Professional, Version 7.0; Build 4.453) 创建一个程序。

最初,我想在 TDateTimePicker 下拉日历中加粗一些日期;但我很快发现我做不到 - 所以我试图在 TDateTimePicker 下拉日历(简单,对吗?)

但不是那么快:不知何故,TDateTimePicker 下拉日历总是显示在我的 TMonthCalendar 的顶部。我想让 TMonthCalendar 显示在顶部。

这是我认为我可以做的:

  1. 将 TMonthCalendar 定位在 TDateTimePicker 下(通常会显示其下拉菜单)
  2. 在 TDateTimePicker 的 OnDropDown 事件中显示 TMonthCalendar
  3. 在 TDateTimePicker 的 OnCloseUp 事件中隐藏 TMonthCalendar

这是正在发生的事情:

  1. 当我单击 TDateTimePicker 上的下拉三角形时,TMonthCalendar 变得可见(耶!)
  2. 但 TDateTimePicker 下拉日历始终优先(TMonthCalendar 始终位于下拉列表下方)
  3. 因此,在我在 TDateTimePicker 下拉列表中选择日期之前,我无法对 TMonthCalendar 执行任何操作(我什至看不到粗体日期,因为 TMonthCalendar 在下方)。

这是我尝试过的:

  • TDateTimePicker 的 OnDropDown 事件上的 TMonthCalendar.Show(这应该将 Show-ed 的内容带到顶部)。但这无济于事。
  • 在 TDateTimePicker 的 OnDropDown 上执行 DateMode: dmDropDown -> DateMode: dmUpDown(从而禁用下拉日历)。但这有问题,因为单击 MonthCalendar 上的任何位置(包括顶部任一侧的更改月份按钮)将使 MonthCalendar 变得不可见(我在 MonthCalendarOnClick 中执行“如果 MonthCalendar.Visible 然后可见:= false”)

我知道解决方案可能很简单,但我想不出办法来做到这一点。到目前为止,我提出的几个想法都不起作用:(所以如果你能想到一种方法来做我想做的事,请帮助我。

先感谢您!:)

4

1 回答 1

2

你问题的整个前提是错误的。完全可以修改附加到日期时间选择器的月历格式。

解决方案是响应MCN_GETDAYSTATE通知。只有具有该MCS_DAYSTATE样式的控件才会发送此通知。为确保应用此样式,即使在重新创建窗口时,您也需要在覆盖的CreateWnd方法中应用它。

例如,这里我用一个插入器来做:

type
  TDateTimePicker = class(Vcl.ComCtrls.TDateTimePicker)
  protected
    procedure CreateWnd; override;
    procedure WMNotify(var Message: TWMNotify); message WM_NOTIFY;
  end;

procedure TDateTimePicker.CreateWnd;
begin
  inherited;
  DateTime_SetMonthCalStyle(WindowHandle, DateTime_GetMonthCalStyle(WindowHandle) or MCS_DAYSTATE);
end;

procedure TDateTimePicker.WMNotify(var Message: TWMNotify);
var
  i: integer;
  NMDayState: PNMDayState;
begin
  inherited;
  case Message.NMHdr.code of
  MCN_GETDAYSTATE:
    begin
      NMDayState := PNMDayState(Message.NMHdr);
      for i := 0 to NMDayState.cDayState-1 do begin
        NMDayState.prgDayState[i] := $FFFFFFFF; // every day is bold
      end;
    end;
  end;
end;

在此处输入图像描述

或者带有一个位掩码,$AAAAAAAA只有偶数天粗体:

在此处输入图像描述

于 2014-02-09T14:27:48.203 回答