2010-11-19 2 views
1

저는 Delphi7을 사용하고 있습니다. 나는 언젠가 컨트롤을 TDateTimePicker으로 대담하게하고 싶습니다.TDateTimePicker의 BoldDays?

나는 원래는 TMonthCalendar의 자손이므로 읽을 수 있어야합니다.

는 또한 몇 가지 예제 코드를 발견했습니다,하지만 C#으로의 : http://social.msdn.microsoft.com/Forums/en/winforms/thread/03527023-694d-41ab-bffb-18c59fca1fda

가 나는 표준 하나 머무르고 싶은 것, 내가 제 3 자에게 DateTimePicker 컨트롤을 사용하지 않음을 유의하시기 바랍니다 .

답변

3

당신은 옳고 그름 :-) 모두

참조 : 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

감사합니다, 당신이 날은 솔루션으로 이어질! :-)

+0

+1, 업데이트는 thx입니다. –

2

DateTimePicker의 dropDown 단추 누르기에 대한 응답으로 표시된 MonthCalendar가 MCS_DAYSTATE 스타일이 설정되지 않은 MonthCalendar이기 때문에 원하는 것을 수행 할 수 없습니다. 이것은 Microsoft의 결정입니다. VCL 제한 사항이 아니므로, 내 지식으로는 변경할 수 없습니다. 유일한 방법은 그것을 사용하지 않고 드롭 다운 버튼을 누르는 것에 대한 응답으로 자신의 실제 MonthCalendar를 인스턴스화하는 것입니다. 이미 사용 가능한 맞춤 구성 요소 중 일부를 사용하십시오.

게시하려면 다음과 같이 게시 한 동일한 C# 코드의 파스칼 버전을 사용하십시오. 그것은 효과가 없으며 내 지식으로는 결코 실현되지 않습니다. 테스트하고 싶다면 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; 
+0

+1 잠시 동안 놀고 나면, 나는 당신이 옳다고 믿습니다. –