Bagikan melalui


Menggunakan Bidang Panggilan Balik dalam Kontrol Pemilih Tanggal dan Waktu

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

Menginisialisasi String Format Kustom

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.

Menangani Pemberitahuan DTN_FORMATQUERY

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.

Menangani 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.

Baca juga

Menggunakan CDateTimeCtrl
Kontrol