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;

注:ビスタマニフェストをファイルに追加してください。そうしないと機能しません。

定数は、更新された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 に答える