1

現在、Delphi (Professional、バージョン 7.0、ビルド 4.453) でプログラムを作成しています。

もともと、私は TDateTimePicker ドロップダウン カレンダーでいくつかの日付を太字にしたいと考えていました。しかし、すぐにそれができないことがわかったので、TDateTimePicker ドロップダウン カレンダーの上に TMonthCalendar (太字の日付を指定できます) を重ねようとしています (単純ですよね?)。

しかし、それほど速くはありません。どういうわけか、TDateTimePicker ドロップダウン カレンダーは常に TMonthCalendar の上に表示されます。代わりに TMonthCalendar を一番上に表示したいと思います。

これが私ができると思ったことです:

  1. TMonthCalendar を TDateTimePicker の下に配置します (ドロップダウンが通常表示される場所)。
  2. TDateTimePicker の OnDropDown イベントで TMonthCalendar を可視化する
  3. TDateTimePicker の OnCloseUp イベントで TMonthCalendar を非表示にします

何が起こっているかは次のとおりです。

  1. TDateTimePicker のドロップダウン トライアングルをクリックすると、TMonthCalendar が表示されます (イェイ!)。
  2. ただし、TDateTimePicker ドロップダウン カレンダーが常に優先されます (TMonthCalendar は常にドロップダウンの下にあります)。
  3. したがって、TDateTimePicker ドロップダウンで日付を選択するまで、TMonthCalendar で何もできません (TMonthCalendar が下にあるため、太字の日付も表示されません)。

これが私が試したことです:

  • TDateTimePicker の OnDropDown イベントでの TMonthCalendar.Show (これにより、表示されたものはすべて一番上に表示されるはずです)。しかし、これは何もしません。
  • DateMode: dmDropDown -> DateMode: TDateTimePicker の OnDropDown で dmUpDown を実行します (したがって、ドロップダウン カレンダーを無効にします)。ただし、MonthCalendar の任意の場所 (上部の両側にある [月の変更] ボタンを含む) をクリックすると、MonthCalendar が非表示になるため、これには問題があります (MonthCalendarOnClick で "if MonthCalendar.Visible then visible := false" を実行しています)。

解決策はおそらく簡単だと思いますが、これを行う方法が思いつきません。これまでのところ、私が思いついたいくつかのアイデアは機能していません:(だから、私がやりたいことをする方法を思いつくことができれば、私を助けてください.

前もって感謝します!:)

4

1 に答える 1

2

あなたの質問の前提全体が間違っています。日時ピッカーに添付された月間カレンダーのフォーマットを変更することは完全に可能です。

MCN_GETDAYSTATE解決策は、通知に応答することです。MCS_DAYSTATEこの通知は、スタイルを持つコントロールのみに送信されます。ウィンドウを再作成する場合でも、このスタイルが確実に適用されるようにするには、オーバーライドされたCreateWndメソッドで適用する必要があります。

たとえば、ここではインターポーザーを使用してそれを行います。

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して、偶数日のみを太字にします。

ここに画像の説明を入力

于 2014-02-09T14:27:48.203 に答える