В продолжение по теме WinAPI message box and layouts.
Как оказалось, еще понадобилось masked edit control. К моему удивлению такового нет в WinAPI.
Есть где готовое? Или велосипедить придется?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Как оказалось, еще понадобилось masked edit control. К моему удивлению такового нет в WinAPI.
Есть ES_NUMBER — edit, в который только целое неотрицательное число.
Есть специальный контрол для ввода IP-адресов (но только IPv4).
Вроде, всё на этом.
Вообще тренд сейчас таков:
дать пользователю вводить любые буквы и цифры,
но при выходе из edit (WM_KILLFOCUS либо вообще деактивация/закрытие top-level-parent окна) показывать Balloon Tooltip, почему именно пользователь дурак,
или показывать такой balloon tooltip по мере ввода.
Тогда пользователь может скопипастить любую ерунду, и уже в самом эдите её отредактировать, без дурацких ограничений вроде "сначала убери одну цифру, а потом вводи новую".
Тултип, в отличии от месседж босков не задалбывает, но при этом, в отличии от появляющейся статик лейбочки-"ты-не-прав", не занимает место на диалоге.
// в диалоговой процедуреcase WM_INITDIALOG:
// тут установил CUE banner
bResult = Edit_SetCueBannerText(GetDlgItem(hDlg, IDC_PHONE_NUMBER), TEXT("Input phone number..."));
...
// за сабклассил EDIT контрол
LRESULT CALLBACK MaskedEditProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
WNDPROC oldwndproc;
BOOL *mask = (BOOL *)GetWindowLong(hwnd, GWL_USERDATA);
oldwndproc = (WNDPROC)mask[256];
BOOL bResult = FALSE;
switch (uMsg)
{
// WM_NCDESTROY is the LAST message that a window will receive -
// therefore we must finally remove the old wndproc herecase WM_NCDESTROY:
HeapFree(GetProcessHeap(), 0, mask);
break;
case WM_CHAR:
if (mask[wParam & 0xff] == TRUE)
break;
else
return 0;
case WM_KILLFOCUS:
// если номер неверный то показываем балонif (!IsPhoneNumberValid())
{
EDITBALLOONTIP tip = { sizeof(EDITBALLOONTIP),
TEXT("Warning!"),
TEXT("That is not phone number!"),
TTI_WARNING };
bResult = Edit_ShowBalloonTip(GetDlgItem(g_hDlg, IDC_PHONE_NUMBER), &tip);
return 0;
}
return CallWindowProc(oldwndproc, hwnd, uMsg, wParam, lParam);
}
Таску закрыл. Но чую всё равно будет реквест на маску в EDIT контроле. Т.е. чтобы при вводе ее было видно, например такая: +7 (___) ___-__-__
Как ее сделать?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Здравствуйте, Мёртвый Даун, Вы писали:
МД>Да, спасибо, так и сделал...
Си без плюсов? Маньяки...
Кажется, можно и не было сабклассить было, EN_KILLFOCUS есть.
(Ещё, лучше бы GetWindowLongPtr использовать, на x86 это дефайн на GetWindowLong с кастом на LONG,
а на x64 — отдельная функция, то есть с GetWindowLongPtr не будет проблем при портировании на х64)
МД>Таску закрыл. Но чую всё равно будет реквест на маску в EDIT контроле. Т.е. чтобы при вводе ее было видно, например такая: +7 (___) ___-__-__
МД>Как ее сделать?
Не уверен, но я бы пробовал на основе эдита всё же, а не полностью самописный контрол.
Вариант: устанавливать текст. EN_CHANGE или EN_UPDATE ловить и менять текст.
Плюс, вставка из клипборда если не порождает эти нотификации, его отдельно ловить (вот тут, видимо, сабкласс пригодится для WM_PASTE).
Ещё вариант: ES_READONLY, самому обрабатывать всякие WM_CHAR и менять содержимое/двигать каретку.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!