Еще по WinAPI GUI: Masked Edit Control
От: Мёртвый Даун Россия  
Дата: 04.08.17 04:45
Оценка:
В продолжение по теме WinAPI message box and layouts.

Как оказалось, еще понадобилось masked edit control. К моему удивлению такового нет в WinAPI.

Есть где готовое? Или велосипедить придется?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
winapi masked edit
Re: Еще по WinAPI GUI: Masked Edit Control
От: Alexander G Украина  
Дата: 04.08.17 05:46
Оценка: 15 (3) +1
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Как оказалось, еще понадобилось masked edit control. К моему удивлению такового нет в WinAPI.


Есть ES_NUMBER — edit, в который только целое неотрицательное число.
Есть специальный контрол для ввода IP-адресов (но только IPv4).
Вроде, всё на этом.

Вообще тренд сейчас таков:
дать пользователю вводить любые буквы и цифры,
но при выходе из edit (WM_KILLFOCUS либо вообще деактивация/закрытие top-level-parent окна) показывать Balloon Tooltip, почему именно пользователь дурак,
или показывать такой balloon tooltip по мере ввода.

Тогда пользователь может скопипастить любую ерунду, и уже в самом эдите её отредактировать, без дурацких ограничений вроде "сначала убери одну цифру, а потом вводи новую".

Тултип, в отличии от месседж босков не задалбывает, но при этом, в отличии от появляющейся статик лейбочки-"ты-не-прав", не занимает место на диалоге.

Показать его можно через EM_SHOWBALLOONTIP.

Вот пример balloon у IPv6-эдитов (которые правопреемники IPv4 контролов):


И встроенный в ES_NUMBER эдит:
Русский военный корабль идёт ко дну!
Отредактировано 04.08.2017 5:47 Alexander G . Предыдущая версия .
Re[2]: Еще по WinAPI GUI: Masked Edit Control
От: Мёртвый Даун Россия  
Дата: 04.08.17 10:50
Оценка:
Здравствуйте, Alexander G, Вы писали:

Да, спасибо, так и сделал...


// в диалоговой процедуре
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 here
    case 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 (___) ___-__-__

Как ее сделать?
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Отредактировано 04.08.2017 10:51 Мёртвый Даун . Предыдущая версия . Еще …
Отредактировано 04.08.2017 10:51 Мёртвый Даун . Предыдущая версия .
Re[3]: Еще по WinAPI GUI: Masked Edit Control
От: Alexander G Украина  
Дата: 04.08.17 11:16
Оценка:
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Да, спасибо, так и сделал...


Си без плюсов? Маньяки...

Кажется, можно и не было сабклассить было, EN_KILLFOCUS есть.

(Ещё, лучше бы GetWindowLongPtr использовать, на x86 это дефайн на GetWindowLong с кастом на LONG,
а на x64 — отдельная функция, то есть с GetWindowLongPtr не будет проблем при портировании на х64)

МД>Таску закрыл. Но чую всё равно будет реквест на маску в EDIT контроле. Т.е. чтобы при вводе ее было видно, например такая: +7 (___) ___-__-__


МД>Как ее сделать?


Не уверен, но я бы пробовал на основе эдита всё же, а не полностью самописный контрол.

Вариант: устанавливать текст. EN_CHANGE или EN_UPDATE ловить и менять текст.
Плюс, вставка из клипборда если не порождает эти нотификации, его отдельно ловить (вот тут, видимо, сабкласс пригодится для WM_PASTE).

Ещё вариант: ES_READONLY, самому обрабатывать всякие WM_CHAR и менять содержимое/двигать каретку.
Русский военный корабль идёт ко дну!
Re[3]: Еще по WinAPI GUI: Masked Edit Control
От: SаNNy Россия  
Дата: 04.08.17 12:38
Оценка:
МД>Как ее сделать?

CMFCMaskedEdit Class
Re[4]: Еще по WinAPI GUI: Masked Edit Control
От: Мёртвый Даун Россия  
Дата: 04.08.17 17:50
Оценка:
Здравствуйте, SаNNy, Вы писали:


МД>>Как ее сделать?


SNN>CMFCMaskedEdit Class


No MFC. No ATL. Только WinAPI.
Только Путин, и никого кроме Путина! О Великий и Могучий Путин — царь на веки веков, навсегда!
Смотрю только Соловьева и Михеева, для меня это самые авторитетные эксперты.
КРЫМ НАШ! СКОРО И ВСЯ УКРАИНА БУДЕТ НАШЕЙ!
Re[5]: Еще по WinAPI GUI: Masked Edit Control
От: std.denis Россия  
Дата: 04.08.17 19:56
Оценка: +1
SNN>>CMFCMaskedEdit Class
МД>No MFC. No ATL. Только WinAPI.

Попробуй посмотреть вот это https://www.viksoe.dk/code/scanf.htm или вот это https://www.viksoe.dk/code/editvalidate.htm
Там конечно WTL, то он же не слишком далек от голого WinAPI, и может будет проще перетащить код на чистый WinAPI
Re: Еще по WinAPI GUI: Masked Edit Control
От: Evgeniy Skvortsov Россия  
Дата: 04.08.17 22:14
Оценка: 1 (1)
Здравствуйте, Мёртвый Даун, Вы писали:

МД>Есть где готовое? Или велосипедить придется?


Офтоп: где ты такую работу нашел?
Я тоже хочу такую, что-то последнее время меня прёт на хардкор на старом добром WINAPI
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.