我制作了一个新组件,在其中截获了MCN_GETDAYSTATE
消息,并从消息信息中提取了年份……一直存在,但是Delphi认为年份没有用。
TOnGetMonthInfoExEvent = procedure(Sender: TObject; Year,Month: Word;
var MonthBoldInfo: LongWord) of object;
TNewMonthCalendar = class(TMonthCalendar)
private
FOnGetMonthInfoEx: TOnGetMonthInfoExEvent;
procedure CNNotify(var Msg: TWMNotifyMC); message CN_NOTIFY;
published
property OnGetMonthInfoEx: TOnGetMonthInfoExEvent read FOnGetMonthInfoEx write FOnGetMonthInfoEx;
end;
procedure TNewMonthCalendar.CNNotify(var Msg: TWMNotifyMC);
var
I: Integer;
Month,Year: Word;
DS: PNMDayState;
CurState: PMonthDayState;
begin
if (Msg.NMHdr.code = MCN_GETDAYSTATE) and Assigned(FOnGetMonthInfoEx) then begin
DS:= Msg.NMDayState;
FillChar(DS.prgDayState^,DS.cDayState * SizeOf(TMonthDayState),0);
CurState:= DS.prgDayState;
for I:= 0 to DS.cDayState - 1 do begin
Year:= DS.stStart.wYear;
Month:= DS.stStart.wMonth + I;
if Month > 12 then begin Inc(Year); Dec(Month,12); end;
FOnGetMonthInfoEx(Self,Year,Month,CurState^);
Inc(CurState);
end;
end
else inherited;
end;
奖励
此外,作为奖励,您需要使用它来更新对当前月份视图的粗体信息所做的更改...,因为它不适用于Invalidate
。
procedure TNewMonthCalendar.RefreshDayState;
var N: Cardinal;
Range: array[0..1] of TSystemTime;
Year,Month: Word;
States: array of TMonthDayState;
I: Integer;
begin
if not Assigned(FOnGetMonthInfoEx) then Exit;
N:= SendMessage(Handle,MCM_GETMONTHRANGE,GMR_DAYSTATE,LPARAM(@Range));
Year:= Range[0].wYear;
Month:= Range[0].wMonth;
SetLength(States,N);
FillChar(States[0],N * SizeOf(TMonthDayState),0);
for I:= 0 to N-1 do begin
FOnGetMonthInfoEx(Self,States[I]);
Inc(Month);
if Month > 12 then
begin Dec(Month,12); Inc(Year); end;
end;
SendMessage(Handle,MCM_SETDAYSTATE,N,LPARAM(@States[0]));
end;
本文链接:https://www.f2er.com/3092765.html