更改 Delphi 中 TMonthCalendar 的 state/format

Changing the state/format of a TMonthCalendar in Delphi

使用 Delphi XE6,我正在创建一个 TdateTimePicker-like 控件,但由于一些原因,我使用了一个 TButtonedEdit,其中有一个 TMonthCalendar "embedded"。这些是这样定义的:

  TMyMonthCalendar = class(TMonthCalendar)
    procedure DoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure DoCloseUp(Sender: TObject);
  private
    FDroppedDown: boolean;
    procedure CNNotify(var Message: TWMNotify); message CN_NOTIFY;
  protected
  end;

  TMyDateEdit = class(TButtonedEdit)
  private
    FMonthCalendar: TMyMonthCalendar;

    procedure DoRightButtonClick(Sender: TObject);
  protected
    procedure CreateWnd; override;
  public
    constructor Create(AOwner:TComponent); override;
    destructor Destroy; override;
  end;

单击右键时显示​​月历,我几乎可以按预期进行操作,而在进行选择、用户导航离开、ESCapes 等时隐藏它。

让我感到困惑的是:使用日历 "dropped down",如果用户单击或双击标题,日历会相应地更改为月或年的网格。例如,如果此时用户 ESCapes,当我下一次将日历向下 returns 到那个 months/years 状态时,我希望它恢复显示其日期的当前月份 属性(就像 TDateTimePicker 所做的那样)。

如何将月历的显示恢复到显示之前的单月状态?

编辑:我相信我已经找到了答案:隐藏 MonthCalendar 后,我只需调用 RecreateWnd,底层屏幕 object 将被销毁并在下次调用时从头开始重新创建。当它以单月格式出现时,这就是我想要的,不需要做任何进一步的事情。

您可以致电MonthCal_SetCurrentView设置月历视图(或发送MCM_SETCURRENTVIEW)。

uses commctrl;

MonthCal_SetCurrentView(FMonthCalendar.Handle, MCMV_MONTH);

如果您需要检索当前视图,可以使用 MonthCal_GetCurrentView(或 MCM_GETCURRENTVIEW)。