【问题标题】:BoldDays for TDateTimePicker?TDateTimePicker 的 BoldDays?
【发布时间】:2023-03-22 01:25:01
【问题描述】:

我正在使用 Delphi7,我想加粗一些日期 TDateTimePicker 控件。

我读过,原来它是TMonthCalendar的后代,因此应该是可能的。

我还找到了一些示例代码,但它是用 C# 编写的: http://social.msdn.microsoft.com/Forums/en/winforms/thread/03527023-694d-41ab-bffb-18c59fca1fda

请注意,我不想使用任何第三方DateTimePicker 控件,我想使用标准控件。

【问题讨论】:

    标签: delphi delphi-7 datetimepicker typography monthcalendar


    【解决方案1】:

    你是对的,也是错的:-)

    见: http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_23927552.html

    你是对的,你不能在 XP 下设置 BoldDays。 但是你错了,因为在Vista/Win7下你可以!

    这里是修改后的代码:

    procedure TForm1.DateTimePicker1DropDown(Sender: TObject);
    const
      DTM_GETMCSTYLE = (DTM_FIRST + 12);
      DTM_SETMCSTYLE = (DTM_FIRST + 11);
      MCS_NOTRAILINGDATES = $0040;
      MCS_SHORTDAYSOFWEEK = $0080;
      MCS_NOSELCHANGEONNAV = $0100;
    var
      monthCalHandle: THandle;
      boldDates: array[0..2] of integer;
      style, prevstyle: LResult;
    begin
      style := SendMessage(DateTimePicker1.Handle, DTM_GETMCSTYLE, 0, 0);
      style := style or MCS_DAYSTATE; //or MCS_NOSELCHANGEONNAV or MCS_WEEKNUMBERS;
      prevstyle := SendMessage(DateTimePicker1.Handle, DTM_SETMCSTYLE, 0, style);
    
      monthCalHandle := SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, 0, 0);
    
      boldDates[0]:=$5a5a5a;
      boldDates[1]:=$5a5a5a;
      boldDates[2]:=$5a5a5a;
      SendMessage(monthCalHandle, MCM_SETDAYSTATE, 3, integer(@boldDates));
    end;
    

    注意:请务必在文件中添加 vista 清单,否则将无法正常工作!

    常量来自更新的 commctrl.h 文件,可在此处找到: http://www.koders.com/cpp/fid6A6537D52B537D0920D7A760D2073F7B65ADE310.aspx?s=WM_CAP_DRIVER_CONNECT

    感谢您的帮助,您引导我找到解决方案! :-)

    【讨论】:

    • 不幸的是,这个解决方案不能也不起作用。一旦您更改视图,例如选择不同的月份等,您就会丢失粗体信息。月历会在需要时请求该信息。正如MCM_SETDAYSTATEdocumentation 中所述:应用程序可以通过发送此消息显式设置日期状态信息,但是当日历的不同部分滚动到视图中时,该状态将不会持续
    【解决方案2】:

    你不能做你想做的事,因为在 DateTimePicker 中按下下拉按钮时显示的 MonthCalendar 是一个没有 MCS_DAYSTATE 样式集的 MonthCalendar。这是微软的决定。这不是 VCL 限制,所以据我所知,您可以做任何更改。唯一的做法是不使用它并实例化您自己的真实 MonthCalendar 以响应用户按下下拉按钮;或使用一些已经可用的自定义组件。

    为了证明这一点,这里是您发布的相同 C# 代码的 Pascal 版本。它不起作用,据我所知,它永远不会。如果你想测试它,把它挂在 DateTimePicker 的 DropDown 事件中。

    procedure TForm1.DateTimePicker1DropDown(Sender: TObject);
     var
       monthCalHandle: THandle;
       boldDates: array[0..2] of integer;
    
     begin
      { obtain the MonthCalendar handle using the DTM_GETMONTHCAL message
        note that the handle returned changes for every time the
        drop down calendar is displayed. }
      monthCalHandle := SendMessage(dateTimePicker1.Handle, DTM_GETMONTHCAL, 0, 0);
    
      { Send the MCM_SETDAYSTATE message. This message takes an array of
        3 MONTHDAYSTATEs. Every MONTHDAYSTATE is a bit set that represents a month.
        Each bit (0 through 30) represents the state of a day. Whan a bit is on,
        its corresponding day is emphasized in the MonthCalendar }
      boldDates[0]:=$5a5a5a;
      boldDates[1]:=$5a5a5a;
      boldDates[2]:=$5a5a5a;
      SendMessage(monthCalHandle, MCM_SETDAYSTATE, 3, integer(@boldDates));
     end;
    

    【讨论】:

    • 玩了一段时间+1,相信你是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2015-02-15
    相关资源
    最近更新 更多