Dela via


Använda återuppringningsfält i en kontroll för datum- och tidsväljare

Förutom standardformattecken som definierar fält för datum- och tidsväljare kan du anpassa dina utdata genom att ange vissa delar av en anpassad formatsträng som motringningsfält. Om du vill deklarera ett callback-fält ska du inkludera ett eller flera "X"-tecken (ASCII Code 88) var som helst i formatsträngens text. Till exempel gör följande sträng "'Today is: 'yy'/'MM'/'dd' (Day 'X')'" att kontrollen för datum- och tidsväljare visar det aktuella värdet som året följt av månaden, datumet och slutligen dagen på året.

Anmärkning

Antalet X i ett motringningsfält motsvarar inte det antal tecken som ska visas.

Du kan skilja mellan flera återuppringningsfält i en anpassad sträng genom att upprepa tecknet "X". Formatsträngen "XXddddMMMdd', 'yyyXXX" innehåller två unika återanropsfält: "XX" och "XXX".

Anmärkning

Motringningsfält behandlas som giltiga fält, så programmet måste vara förberett för att hantera DTN_WMKEYDOWN meddelanden.

Implementering av motringningsfält i din datum- och tidsväljare består av tre delar:

  • Initiera strängen för anpassat format

  • Hantera DTN_FORMATQUERY-meddelandet

  • Hantera DTN_FORMAT-meddelandet

Initierar anpassad formatsträng

Initiera den anpassade strängen med ett anrop till CDateTimeCtrl::SetFormat. Mer information finns i Använda anpassade formatsträngar i en datum- och tidsväljare. En vanlig plats för att ange den anpassade formatsträngen OnInitDialog är i funktionen för din innehållande dialogklass eller i OnInitialUpdate-funktionen för din innehållande visningsklass.

Hantera DTN_FORMATQUERY-meddelandet

När kontrollen tolkar formatsträngen och stöter på ett återanropsfält skickar programmet meddelanden av typerna DTN_FORMAT och DTN_FORMATQUERY. Fältsträngen för motringning ingår i meddelandena så att du kan avgöra vilket motringningsfält som efterfrågas.

Meddelandet DTN_FORMATQUERY skickas för att hämta den maximalt tillåtna storleken i bildpunkter för strängen som kommer att visas i det aktuella callback-fältet.

Om du vill beräkna det här värdet korrekt måste du beräkna strängens höjd och bredd för att ersättas med fältet med hjälp av kontrollens visningsteckensnitt. Den faktiska beräkningen av strängen uppnås enkelt med ett anrop till funktionen GetTextExtentPoint32 Win32. När storleken har bestämts skickar du tillbaka värdet till programmet och avslutar hanteringsfunktionen.

Följande exempel är en metod för att specificera storleken på återkopplingssträngen:

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

Så snart storleken på det aktuella återuppringningsfältet har beräknats måste du ange ett värde för fältet. Detta görs i hanteraren för DTN_FORMAT-meddelandet.

Hantera DTN_FORMAT-meddelandet

DTN_FORMAT-meddelandet används av programmet för att begära den teckensträng som ska ersättas. I följande exempel visas en möjlig metod:

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

Anmärkning

Pekaren till NMDATETIMEFORMAT-strukturen hittas genom att den första parametern för meddelandehanteraren återställs till rätt typ.

Se även

Att använda CDateTimeCtrl
Kontroller