首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi TDateTime Bold days with TMonthCalendar

Delphi TDateTime Bold days with TMonthCalendar
EN

Stack Overflow用户
提问于 2014-02-09 13:36:12
回答 1查看 2.7K关注 0票数 1

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

最初,我想在TDateTimePicker下拉日历中添加一些日期;但是我很快发现我做不到--所以我试图在TDateTimePicker下拉日历的顶部重叠一个TMonthCalendar (您可以用它做粗体日期)(简单,对吗?)

但不要太快:不知怎么的,TDateTimePicker下拉日历总是出现在我的TMonthCalendar上。我想让TMonthCalendar出现在顶部。

我想我能做的是:

  1. 将TMonthCalendar放置在TDateTimePicker下(其下拉列表通常显示在该位置)
  2. 使TDateTimePicker的TMonthCalendar事件可见
  3. 隐藏TDateTimePicker的TMonthCalendar事件

下面是正在发生的事情:

  1. 当我单击TDateTimePicker上的下拉三角形时,TMonthCalendar变得可见(耶!)
  2. 但是TDateTimePicker下拉日历总是有先例(TMonthCalendar总是在下拉列表下面)
  3. 因此,在选择了TMonthCalendar下拉列表中的日期之前,我不能对TDateTimePicker做任何事情(甚至看不到粗体的日期,因为TMonthCalendar在下面)。

以下是我尝试过的:

  • TMonthCalendar.Show的OnDropDown事件的TDateTimePicker (这应该是带来什么是显示到顶部)。但这没什么用。
  • Do DateMode: dmDropDown -> DateMode: dmUpDown on TDateTimePicker的OnDropDown (因此禁用下拉日历)。但是这是有问题的,因为单击MonthCalendar上的任何地方(包括顶部两边的change Month按钮)都会使MonthCalendar变得不可见(我在MonthCalendarOnClick中执行"if MonthCalendar.Visible然后:= false“)。

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

(预先多谢!)

EN

回答 1

Stack Overflow用户

发布于 2014-02-09 14:27:48

你问题的全部前提都是错误的。完全可以修改附在日期时间选择器上的月份日历的格式。

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

例如,在这里,我用一个插入者来完成这个任务:

代码语言:javascript
复制
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的掩码,只有偶数天的粗体:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21659683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档