首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >适用于TDateTimePicker的BoldDays?

适用于TDateTimePicker的BoldDays?
EN

Stack Overflow用户
提问于 2010-11-19 16:29:09
回答 2查看 2.1K关注 0票数 1

我正在使用Delphi7,并且我想在一些日子里大胆使用TDateTimePicker控件。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-20 03:58:54

你是对的也是错的:-)

请参阅:http://www.experts-exchange.com/Programming/System/Windows__Programming/MFC/Q_23927552.html

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

修改后的代码如下:

代码语言:javascript
复制
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

谢谢你的帮助,你带我找到了解决方案!:-)

票数 4
EN

Stack Overflow用户

发布于 2010-11-19 19:30:43

您不能做您想做的事情,因为在DateTimePicker中按下dropDown按钮所显示的MonthCalendar是一个没有设置MCS_DAYSTATE样式的MonthCalendar。这是微软的决定。这不是VCL的限制,所以据我所知,您无法改变它。唯一要做的就是不使用它,而是实例化一个真正的MonthCalendar来响应用户按下的下拉按钮;或者使用一些已经可用的自定义组件。

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

代码语言:javascript
复制
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;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4223237

复制
相关文章

相似问题

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