Compartir a través de


Usar campos de devolución de llamada en un control de selector de fecha y hora

Además de los caracteres de formato estándar que definen los campos de selector de fecha y hora, puede personalizar la salida especificando determinadas partes de una cadena de formato personalizado como campos de devolución de llamada. Para declarar un campo de devolución de llamada, incluya uno o más caracteres “X” (código ASCII 88) en cualquier parte del cuerpo de la cadena de formato. Por ejemplo, la siguiente cadena ““Today is: “/“de” yy/“MM DD” (Day “X ")” “hace que el control de selector de fecha y hora para mostrar el valor actual como el año seguido del mes, fecha y, finalmente el día del año.

Nota

El número de X en un campo de devolución de llamada no corresponde al número de caracteres que se mostrará.

Puede distinguir entre varios campos de devolución de llamada en una cadena personalizada repitiendo el carácter “X”. Así, la cadena de formato “XXddddMMMdd, 'yyyXXX” contiene dos campos únicos de devolución de llamada, “XX” y “XXX”.

Nota

Los campos de devolución de llamada se tratan como campos válidos, por lo que la aplicación se debe preparar para controlar los mensajes de notificación de DTN_WMKEYDOWN .

Implementar campos de devolución de llamada en el control selector de fecha y hora consta de tres partes:

  • Inicializar la cadena de formato personalizado

  • Administrar la notificación de DTN_FORMATQUERY

  • Administrar la notificación de DTN_FORMAT

Inicializar la cadena de formato personalizado

Inicializa la cadena personalizada con una llamada a CDateTimeCtrl::SetFormat. Para obtener más información, vea Usar cadenas de formato personalizadas en un Control del selector de fecha y hora. Un lugar común para definir la cadena de formato personalizado es la función de OnInitDialog de la clase de diálogo o la función de OnInitialUpdate que contiene de la clase de vista que contiene.

Administrar la notificación de DTN_FORMATQUERY

Cuando el control analiza la cadena de formato y encuentra un campo de devolución de llamada, la aplicación envía los mensajes de notificación de DTN_FORMAT y de DTN_FORMATQUERY . La cadena del campo de devolución de llamada se incluye con las notificaciones para que pueda determinar que el campo de devolución de llamada se está consultando.

La notificación de DTN_FORMATQUERY se envía para recuperar el tamaño máximo permitido en píxeles de la cadena que se mostrará en el campo actual de devolución de llamada.

Para calcular correctamente este valor, debe calcular el alto y el ancho de la cadena, se sustituirá para el campo, con la fuente de presentación del control. El cálculo real de la cadena con facilidad se logra con una llamada a la función de GetTextExtentPoint32 Win32. Una vez que se determina el tamaño, devuelva el valor a la aplicación y salga de la función controladora.

El ejemplo siguiente es un método de proporcionar el tamaño de la cadena de devolución de llamada:

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;
}

El tamaño del campo actual de devolución de llamada se ha calculado una vez, debe proporcionar un valor para el campo. Esto se hace en el controlador para la notificación de DTN_FORMAT .

Administrar la notificación de DTN_FORMAT

La notificación de DTN_FORMAT es utilizada por la aplicación para solicitar la cadena de caracteres que se sustituido. El ejemplo siguiente muestra un método posible:

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;
}

Nota

El puntero a la estructura de NMDATETIMEFORMAT se con lo que el primer parámetro del controlador de notificación al tipo adecuado.

Vea también

Referencia

Usar CDateTimeCtrl

Conceptos

Controles (MFC)