날짜 및 시간 선택 컨트롤의 콜백 필드를 사용합니다.
날짜 및 시간 선택 필드를 정의 하는 표준 서식 문자 외에 사용자 지정 형식 문자열의 특정 부분을 콜백 필드로 지정 하 여 출력을 사용자 지정할 수 있습니다.콜백 필드를 선언 하려면 하나 이상의 "X" 문자 (ASCII 코드 88) 아무 곳 이나 형식 문자열의 본문에 포함 됩니다.예를 들어, 다음 문자열 "' 오늘입니다: '년' 'MM' / / 'dd' (Day 'X')'" 일년 월, 날짜 및 날짜의 연도에서 마지막으로 현재 값을 표시 하려면 날짜 및 시간 선택 컨트롤 하면 됩니다.
[!참고]
개수 X 콜백 필드에 표시 되는 문자 수가 일치 하지 않습니다.
여러 콜백 필드에 "X" 문자를 반복 하 여 사용자 지정 문자열을 구분할 수 있습니다.따라서, 형식 문자열 "XXddddMMMdd', ' yyyXXX" 두 고유 콜백 필드인 "XX" 및 "XXX" 포함 되어 있습니다.
[!참고]
콜백 필드 올바른 필드로 처리 응용 프로그램을 처리할 준비가 되어 있어야 하므로 DTN_WMKEYDOWN 알림 메시지입니다.
날짜 및 시간 선택 컨트롤에서 구현 하는 콜백 필드 세 부분으로 구성 되어 있습니다.
사용자 지정 형식 문자열 초기화
처리는 DTN_FORMATQUERY 알림
처리는 DTN_FORMAT 알림
사용자 지정 형식 문자열 초기화
사용자 지정 문자열에 대 한 호출을 초기화 CDateTimeCtrl::SetFormat.자세한 내용은 를 사용 하 여 사용자 지정 형식 문자열에 날짜 및 시간 선택 컨트롤.사용자 지정 형식 문자열을 설정 하는 공통 위치입니다의 OnInitDialog 함수를 포함 하는 대화 상자 클래스의 또는 OnInitialUpdate 함수를 포함 하는 뷰 클래스의.
DTN_FORMATQUERY 알림을 처리합니다.
컨트롤 서식 문자열을 구문 분석 하 고 콜백 필드를 발견 한 경우 응용 프로그램을 보냅니다 DTN_FORMAT 및 DTN_FORMATQUERY 알림 메시지입니다.쿼리할 콜백 필드를 결정할 수 있도록 콜백 필드 문자열을 사용 하 여 알림을 포함 되어 있습니다.
DTN_FORMATQUERY 알림 보냄의 최대 허용 크기를 픽셀 단위로 현재 콜백 필드에 표시 되는 문자열을 검색할 수 있습니다.
이 값을 제대로 계산 하려면 컨트롤의 표시 글꼴을 사용 하 여 높이 및 너비 필드에 대체 문자열의 계산 해야 합니다.문자열의 실제 계산은를 쉽게 얻을 수 있습니다의 GetTextExtentPoint32 Win32 함수입니다.크기 결정 되 면 값은 응용 프로그램에 다시 전달 하 고 처리기 함수를 끝냅니다.
다음 예제에서는 콜백 문자열의 크기를 제공 하는 한 가지 방법은 다음과 같습니다.
void CMyDialog::OnDtnFormatqueryDatetimepicker1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMDATETIMEFORMATQUERY pDTFormatQuery =
reinterpret_cast<LPNMDATETIMEFORMATQUERY>(pNMHDR);
CDC* pDC = NULL;
CFont* pFont = NULL;
CFont* pOrigFont = NULL;
// Prepare the device context for the GetTextExtentPoint32 call.
pDC = GetDC();
if (NULL == pDC)
{
return;
}
pFont = GetFont();
if(NULL == pFont)
{
pFont = new CFont();
VERIFY(pFont->CreateStockObject(DEFAULT_GUI_FONT));
}
pOrigFont = pDC->SelectObject(pFont);
// Check to see if this is the callback segment desired. If so,
// use the longest text segment to determine the maximum
// width of the callback field, and then place the information into
// the NMDATETIMEFORMATQUERY structure.
if(!_tcscmp(_T("X"), pDTFormatQuery->pszFormat))
{
::GetTextExtentPoint32(pDC->m_hDC, _T("366"), 3, &pDTFormatQuery->szMax);
}
// Reset the font in the device context then release the context.
pDC->SelectObject(pOrigFont);
ReleaseDC(pDC);
*pResult = 0;
}
현재 콜백 필드의 크기를 계산한 후에 필드의 값을 제공 해야 합니다.이 대 한 처리기에서 수행 됩니다를 DTN_FORMAT 알림.
DTN_FORMAT 알림 메시지 처리
DTN_FORMAT 알림 사용 응용 프로그램에 의해 대체 될 문자열을 요청 합니다.다음 예제에서는 여러 가능한 메서드를 보여 줍니다.
void CMyDialog::OnDtnFormatDatetimepicker1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMDATETIMEFORMAT pDTFormat = reinterpret_cast<LPNMDATETIMEFORMAT>(pNMHDR);
COleDateTime oCurTime;
m_DateTimeCtrl.GetTime(oCurTime);
_itot_s(oCurTime.GetDayOfYear(), pDTFormat->szDisplay,
sizeof(pDTFormat->szDisplay) / sizeof(TCHAR), 10);
*pResult = 0;
}
[!참고]
포인터에는 NMDATETIMEFORMAT 구조 발견 되는 첫 번째 알림 처리기를 적절 한 형식 매개 변수를 캐스팅 하 여.