預設 Edit 控件無法限制「YYYY-MM-DD」格式。解決方案:衍生 CMyEdit 類別,透過子類化攔截 WM_CHAR、WM_KEYDOWN 訊息,過濾輸入字元並自動維護分隔符號。
SetLimitText(10)、SetWindowText(_T(" - - ")) 顯示範本。OnChar):
OnKeyDown):
void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
int pos = LOWORD(GetSel());
CString str; GetWindowText(str);
if (nChar >= '0' && nChar <= '9') {
if (pos < 4 || (pos > 4 && pos < 7) || pos > 7) {
str.Delete(pos, 1); SetWindowText(str);
SetSel(FormatPos(pos, pos));
CEdit::OnChar(nChar, nRepCnt, nFlags);
if (LOWORD(GetSel()) == 4 || LOWORD(GetSel()) == 7)
SetSel(FormatPos(pos+1, pos+1)); // 跳過分隔符
} else if (pos == 4 || pos == 7) { // 在分隔符位置
SetSel(FormatPos(pos+1, pos+1));
str.Delete(pos, 1); SetWindowText(str);
SetSel(FormatPos(pos, pos));
CEdit::OnChar(nChar, nRepCnt, nFlags);
}
} else if (nChar == VK_BACK) { /* 類似邏輯 */ }
}
int CMyEdit::FormatPos(int start, int end) { return MAKELONG(start, end); }
SubclassDlgItem(IDC_EDIT, this):對話框初始化時動態子類化。SubclassWindow(hWnd) / UnsubclassWindow():運行時切換。
同樣原理可實現 IP 位址、電話號碼、貨幣金額等固定格式輸入控件,核心在於 FormatPos 輔助函式管理游標位置與範本字元的對應關係。