1

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

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

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

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

4

2 回答 2

4

你是对也是错:-)

请参阅: 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

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

于 2010-11-19T19:58:53.917 回答
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;
于 2010-11-19T11:30:43.447 回答