다음을 통해 공유


날짜 및 시간 선택 컨트롤에서 콜백 필드 사용

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

참고 항목

CDateTimeCtrl 사용
컨트롤