날짜 및 시간 선택 컨트롤에서 콜백 필드 사용
날짜 및 시간 선택기 필드를 정의하는 표준 서식 문자 외에도 사용자 지정 형식 문자열의 특정 부분을 콜백 필드로 지정하여 출력을 사용자 지정할 수 있습니다. 콜백 필드를 선언하려면 형식 문자열의 본문에 하나 이상의 "X" 문자(ASCII Code 88)를 포함합니다. 예를 들어 다음 문자열 "'Today is: 'yy'/'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 구조체에 대한 포인터는 알림 처리기의 첫 번째 매개 변수를 적절한 형식으로 캐스팅하여 찾을 수 있습니다.