Używanie pól wywołania zwrotnego w formancie selektora dat i godzin
Oprócz standardowych znaków formatu definiujących pola selektora daty i godziny można dostosować dane wyjściowe, określając niektóre części niestandardowego ciągu formatu jako pola wywołania zwrotnego. Aby zadeklarować pole wywołania zwrotnego, uwzględnij co najmniej jeden znak "X" (kod ASCII 88) w dowolnym miejscu w treści ciągu formatu. Na przykład następujący ciąg "'Today is: 'yy'/'MM'/'dd" (Day 'X')'" powoduje, że kontrolka selektora daty i godziny wyświetla bieżącą wartość jako rok, po którym następuje miesiąc, data i koniec dzień roku.
Uwaga
Liczba znaków X w polu wywołania zwrotnego nie odpowiada liczbie wyświetlanych znaków.
Można odróżnić wiele pól wywołania zwrotnego w ciągu niestandardowym, powtarzając znak "X". W związku z tym ciąg formatu "XXddddMMMddd", "yyyXXX" zawiera dwa unikatowe pola wywołania zwrotnego, "XX" i "XXX".
Uwaga
Pola wywołania zwrotnego są traktowane jako prawidłowe pola, dlatego aplikacja musi być przygotowana do obsługi DTN_WMKEYDOWN komunikatów powiadomień.
Implementowanie pól wywołania zwrotnego w kontrolce selektora daty i godziny składa się z trzech części:
Inicjowanie niestandardowego ciągu formatu
Obsługa powiadomienia DTN_FORMATQUERY
Obsługa powiadomienia DTN_FORMAT
Inicjowanie ciągu formatu niestandardowego
Zainicjuj ciąg niestandardowy za pomocą wywołania metody CDateTimeCtrl::SetFormat
. Aby uzyskać więcej informacji, zobacz Using Custom Format Strings in a Date and Time Picker Control (Używanie ciągów formatu niestandardowego w kontrolce selektora daty i godziny). Typowym miejscem ustawiania niestandardowego ciągu formatu jest OnInitDialog
funkcja zawierającej klasę okna dialogowego lub OnInitialUpdate
funkcję zawierającej klasę widoku.
Obsługa powiadomienia DTN_FORMATQUERY
Gdy kontrolka analizuje ciąg formatu i napotyka pole wywołania zwrotnego, aplikacja wysyła DTN_FORMAT i DTN_FORMATQUERY komunikatów powiadomień. Ciąg pola wywołania zwrotnego jest dołączany do powiadomień, dzięki czemu można określić, które pole wywołania zwrotnego jest wykonywane.
Powiadomienie DTN_FORMATQUERY jest wysyłane w celu pobrania maksymalnego dozwolonego rozmiaru w pikselach ciągu, który będzie wyświetlany w bieżącym polu wywołania zwrotnego.
Aby prawidłowo obliczyć tę wartość, należy obliczyć wysokość i szerokość ciągu, aby zastąpić pole czcionką wyświetlaną kontrolki. Rzeczywiste obliczenie ciągu można łatwo osiągnąć za pomocą wywołania funkcji GetTextExtentPoint32 Win32 . Po określeniu rozmiaru przekaż wartość z powrotem do aplikacji i zamknij funkcję obsługi.
Poniższy przykład to jedna z metod podawania rozmiaru ciągu wywołania zwrotnego:
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;
}
Po obliczeniu rozmiaru bieżącego pola wywołania zwrotnego należy podać wartość pola. Odbywa się to w procedurze obsługi powiadomienia DTN_FORMAT.
Obsługa powiadomienia DTN_FORMAT
Powiadomienie DTN_FORMAT jest używane przez aplikację do żądania ciągu znaków, który zostanie zastąpiony. W poniższym przykładzie pokazano jedną z możliwych 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;
}
Uwaga
Wskaźnik do struktury NMDATETIMEFORMAT znajduje się przez rzutowanie pierwszego parametru programu obsługi powiadomień do odpowiedniego typu.