Sdílet prostřednictvím


Použití polí zpětného volání v ovládacím prvku pro výběr data a času

Kromě standardního formátu znaků, které definují výběr pole Datum a čas můžete přizpůsobit výstup zadáním určité části vlastní řetězec formátu jako pole zpětné volání.Deklarovat pole zpětné volání, obsahovat nejméně jeden znak "X" (ASCII kód 88) kdekoli v textu formátovací řetězec.Například následující řetězec "" Dnes je: "rr" / "MM" nebo "dd" (den "X") ""způsobí, že ovládací prvek Výběr data a času pro zobrazení aktuální hodnoty jako rok, měsíc, datum a nakonec den v roce.

[!POZNÁMKA]

Počet značkou ve zpětném volání neodpovídá pole počet znaků, které se zobrazí.

Lze rozlišit více polí zpětného volání ve vlastní řetězec opakováním znaku "X".Tedy formátovací řetězec "XXddddMMMdd", "yyyXXX" obsahuje dvě pole jedinečný zpětné volání "XX" a "XXX".

[!POZNÁMKA]

Pole zpětné volání jsou považovány za platné pole, tak vaše aplikace musí být připraveny pro zpracování DTN_WMKEYDOWN zprávy s oznámením.

Pole zpětné volání implementace ve vaší prvek pro výběr data a času se skládá ze tří částí:

  • Vlastní formátovací řetězec inicializace

  • Manipulace DTN_FORMATQUERY oznámení

  • Manipulace DTN_FORMAT oznámení

Vlastní formátovací řetězec inicializace

Inicializovat vlastní řetězec pomocí volání CDateTimeCtrl::SetFormat.Další informace naleznete v tématu Pomocí vlastní formátovací řetězce data a času ovládací prvek Výběr.Společné místo, chcete-li nastavit vlastní řetězec formátu OnInitDialog funkce třídy obsahující dialogové okno nebo OnInitialUpdate funkce třídy obsahující zobrazení.

Zpracování oznámení DTN_FORMATQUERY

Když ovládací prvek analyzuje řetězec formátu, dojde pole zpětné volání aplikace odesílá DTN_FORMAT a DTN_FORMATQUERY zprávy s oznámením.Řetězec pole zpětné volání je součástí oznámení, takže můžete určit, které pole zpětné volání dotazovaný.

DTN_FORMATQUERY k získání maximální povolenou velikost v pixelech řetězec, který se zobrazí v poli aktuální zpětného volání je odesláno oznámení.

Chcete-li tuto hodnotu správně vypočítat, je nutné vypočítat výšku a šířku řetězec do pole nahradit pomocí ovládacího prvku zobrazení písma.Výpočet skutečné řetězce lze snadno dosáhnout pomocí volání GetTextExtentPoint32 Win32 funkci.Jakmile se třídí předat hodnotu aplikace a ukončení funkce obslužné rutiny.

Následující příklad je jedním ze způsobů zásobování velikost řetězce zpětného volání:

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

Jakmile byla vypočtena velikost aktuálního pole zpětné volání, je nutné zadat hodnotu pro pole.To se provádí v obslužné rutině DTN_FORMAT oznámení.

Zpracování oznámení DTN_FORMAT

DTN_FORMAT oznámení aplikace slouží k vyžádání znakový řetězec, který bude nahrazen.Následující příklad ukazuje jeden možný způsob:

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

[!POZNÁMKA]

Ukazatel NMDATETIMEFORMAT strukturu zjistí, že první parametr obslužné rutiny oznámení na správný typ. obsazení.

Viz také

Referenční dokumentace

Používání atributu CDateTimeCtrl

Koncepty

Ovládací prvky (MFC)