Menggunakan Bidang Panggilan Balik dalam Kontrol Pemilih Tanggal dan Waktu
Dalam artikel ini
Selain karakter format standar yang menentukan bidang pemilih tanggal dan waktu, Anda dapat menyesuaikan output dengan menentukan bagian tertentu dari string format kustom sebagai bidang panggilan balik. Untuk mendeklarasikan bidang panggilan balik, sertakan satu atau beberapa karakter "X" (Kode ASCII 88) di mana saja dalam isi string format. Misalnya, string berikut "'Hari ini adalah: 'yy'/'MM'/'dd' (Hari 'X')'"menyebabkan kontrol pemilih tanggal dan waktu menampilkan nilai saat ini karena tahun diikuti oleh bulan, tanggal, dan akhirnya hari dalam setahun.
Catatan
Jumlah X dalam bidang panggilan balik tidak sesuai dengan jumlah karakter yang akan ditampilkan.
Anda dapat membedakan antara beberapa bidang panggilan balik dalam string kustom dengan mengulangi karakter "X". Dengan demikian, string format "XXddddMMMdd', 'yyyXXXX" berisi dua bidang panggilan balik unik, "XX" dan "XXX".
Catatan
Bidang panggilan balik diperlakukan sebagai bidang yang valid, sehingga aplikasi Anda harus siap untuk menangani pesan pemberitahuan DTN_WMKEYDOWN.
Menerapkan bidang panggilan balik di kontrol pemilih tanggal dan waktu Anda terdiri dari tiga bagian:
Menginisialisasi string format kustom
Menangani pemberitahuan DTN_FORMATQUERY
Menangani pemberitahuan DTN_FORMAT
Inisialisasi string kustom dengan panggilan ke CDateTimeCtrl::SetFormat
. Untuk informasi selengkapnya, lihat Menggunakan String Format Kustom dalam Kontrol Pemilih Tanggal dan Waktu. Tempat umum untuk mengatur string format kustom ada dalam OnInitDialog
fungsi kelas dialog atau OnInitialUpdate
fungsi anda yang berisi kelas tampilan.
Saat kontrol mengurai string format dan menemukan bidang panggilan balik, aplikasi mengirim pesan pemberitahuan DTN_FORMAT dan DTN_FORMATQUERY. String bidang panggilan balik disertakan dengan pemberitahuan sehingga Anda dapat menentukan bidang panggilan balik mana yang sedang dikueri.
Pemberitahuan DTN_FORMATQUERY dikirim untuk mengambil ukuran maksimum yang diizinkan dalam piksel string yang akan ditampilkan di bidang panggilan balik saat ini.
Untuk menghitung nilai ini dengan benar, Anda harus menghitung tinggi dan lebar string, yang akan digantikan untuk bidang tersebut, menggunakan font tampilan kontrol. Perhitungan aktual string mudah dicapai dengan panggilan ke fungsi GetTextExtentPoint32 Win32. Setelah ukuran ditentukan, teruskan nilai kembali ke aplikasi dan keluar dari fungsi handler.
Contoh berikut adalah salah satu metode untuk menyediakan ukuran string panggilan balik:
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;
}
Setelah ukuran bidang panggilan balik saat ini dihitung, Anda harus menyediakan nilai untuk bidang tersebut. Ini dilakukan di handler untuk pemberitahuan DTN_FORMAT.
Pemberitahuan DTN_FORMAT digunakan oleh aplikasi untuk meminta string karakter yang akan diganti. Contoh berikut menunjukkan satu metode yang mungkin:
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;
}
Catatan
Penunjuk ke struktur NMDATETIMEFORMAT ditemukan dengan mentransmisikan parameter pertama handler pemberitahuan ke jenis yang tepat.