在Delphi中更改TMonthCalendar的状态/格式

时间:2016-12-17 23:01:57

标签: delphi delphi-xe6 monthcalendar

使用Delphi XE6,我正在创建一个类似TdateTimePicker的控件,但由于几个原因,我使用的是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;

当按下右键时,月份日历显示为SHOWn时,我已经按照需要进行了操作,当我做出选择时,我隐藏了它,用户导航,ESCapes等。

让我感到困惑的是:如果用户点击或双击标题,则日历"下拉"日历将相应地更改为数月或数年的网格。例如,如果用户ESCapes,那时,当我下一次放下日历时,它返回到那个月/年状态,而我希望它恢复显示其Date属性的当前月份(如TDateTimePicker那样)。

如何在显示月历之前将其显示为单月状态?

编辑:我相信我找到了答案:隐藏MonthCalendar后,我只需调用RecreateWnd,底层屏幕对象将被销毁,并在下次调用时从头开始重新创建。因为它以单月形式出现,这就是我想要的,没有什么需要做的了。

1 个答案:

答案 0 :(得分:2)

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

uses commctrl;

MonthCal_SetCurrentView(FMonthCalendar.Handle, MCMV_MONTH);

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