Форум программистов, компьютерный форум CyberForum.ru

C++ и WinAPI

Войти
Регистрация
Восстановить пароль
 
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
#1

Обработка EDIT в реальном времени - C++ WinAPI

04.01.2017, 17:19. Просмотров 464. Ответов 16
Метки нет (Все метки)

Подскажите как сделать обработку двух окон EDIT с мгновенным выводом к примеру суммы чисел без использования кнопки.
То-есть как сделать событие без использования кнопки которая берет из буфера и выводит решение. Не пойму какое событие сделать в цикл для обработки каждый раз как вводится число в EDIT.

Хотел сделать три EDIT окна, но третье окно меняет стиль на DISABLE в зависимости от введенных данных в первые два окна.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2017, 17:19     Обработка EDIT в реальном времени
Посмотрите здесь:

Обработка сообщений от поля Edit, размещенного на GroupBox с полосами прокрутки C++ WinAPI
Редактирование имени кнопки в реальном времени C++ WinAPI
Обработка ввода edit C++ WinAPI
C++ WinAPI класс EDIT
C++ WinAPI Не работает таймер для показа в реальном времени оперативной памяти
C++ WinAPI Сохранение из Edit в массив, вывод из массива в Edit
C++ WinAPI Обработка события ввода в edit
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rao
845 / 398 / 118
Регистрация: 02.04.2014
Сообщений: 1,151
04.01.2017, 17:59     Обработка EDIT в реальном времени #2
Не надо делать цикла, просто добавь в диалоговую процедуру окна обработчик уведомления EN_CHANGE
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
04.01.2017, 19:16  [ТС]     Обработка EDIT в реальном времени #3
rao,

C++
1
2
3
4
5
6
7
case WM_COMMAND:
{
   if (IDC_EDIT1 == LOWORD(wparam) and EN_CHANGE == HIWORD(wparam))
   {
        // TODO:
   }
}
так?
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
17.01.2017, 06:15  [ТС]     Обработка EDIT в реальном времени #4
rao, не работает.

У меня окно, в нем дочерние окна по кнопкам.. в дочерних окнах поля для ввода.. нажимаешь на поле и он сбрасывает меня в главное окно.
Serg_o_Grey
59 / 59 / 22
Регистрация: 29.03.2016
Сообщений: 301
17.01.2017, 11:31     Обработка EDIT в реальном времени #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
//...
HWND htxt;
WNDPROC DefEditProc;
 
LRESULT CALLBACK EditProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam);
    
 
htxt = CreateWindowEx(0, 
        "edit",
        "", 
        WS_CHILD | WS_VISIBLE | WS_BORDER, 
        110, 
        10, 
        90, 
        25, 
        hwndgen, 
        (HMENU)ID_TEXTEDIT, 
        (HINSTANCE) GetWindowLong(hwndgen, GWL_HINSTANCE), 
        NULL);
// ...
 
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    switch(Message)
    {
        case WM_CREATE:
            DefEditProc = (WNDPROC)GetWindowLongPtr(htxt, GWLP_WNDPROC);
            SetWindowLongPtr(htxt, GWLP_WNDPROC, (LPARAM)EditProc);
        break;
        // ...
    }
    return 0;
}
 
LRESULT CALLBACK EditProc(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
    char str[20];
    switch(Message)
    {
        case WM_KEYUP:
            memset(str, 0, sizeof(str));
            GetWindowTextA(htxt, str, 20);
            // TODO:
            return 0;
        break;
    }
    return((LRESULT)CallWindowProc((WNDPROC)DefEditProc, hwnd, Message, wparam, lparam));
}
rao
845 / 398 / 118
Регистрация: 02.04.2014
Сообщений: 1,151
17.01.2017, 19:06     Обработка EDIT в реальном времени #6
NSXfl, тут надо смотреть иерархию окон и как им шлются оконные сообщения. Возьми Spy++ и погляди чо как. Про WM_COMMAND написано, что его посылает контрол своему родительскому окну. Значит, в твоем случае и ловить его надо не в главном окне а в дочернем. А раз ты его там не обрабатываешь, то сообщение уходит выше - в главное окно.

Serg_o_Grey, сабклассинг контролов это конечно хорошо, но не здесь. Потому что совершенно ни к чему городить огород и делать вручную ту работу, которая уже выполняется в самом API. Анализ WM_KEYUP это слишком низко и трудоемко.
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
17.01.2017, 20:54  [ТС]     Обработка EDIT в реальном времени #7
rao, и тут я понял что уровень моих знаний не дотягивает... хотя основное я усвоил и даже макет программы накатал...

Я пишу этот код в процедуре дочернего окна, нужно чтобы в этом дочернем окне в зависимости от ввода менялся стиль некоторых EDIT для интерактивности ввода.

вот как я это понимаю но конечно же не работает ))

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Процедура
LRESULT CALLBACK g2_r1_menu02_WindowProcedure(HWND hwnd, UINT Message, WPARAM wparam, LPARAM lparam)
{
 
HWND wk2;
HWND wSz;
HWND wSy;
 
    switch(Message)
    {
    case WM_CREATE:
        {
 
             
 
            HWND wk1=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "1.2",WS_TABSTOP | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
             80, 150, 100, 20, hwnd, (HMENU)MENU02_EDIT3, GetModuleHandle(NULL), NULL);
 
             wSz=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "15",WS_TABSTOP | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
             80, 200, 100, 20, hwnd, (HMENU)MENU02_EDIT4, GetModuleHandle(NULL), NULL);
 
             wSy=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "10",WS_TABSTOP | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
             80, 250, 100, 20, hwnd, (HMENU)MENU02_EDIT5, GetModuleHandle(NULL), NULL);
 
             wk2=CreateWindow(TEXT("button"), TEXT(" "),WS_VISIBLE | WS_CHILD | BS_CHECKBOX | WS_DISABLED,
             80, 300, 13, 13, hwnd, (HMENU) G2_R1_MENU02_CHECKBOX1, hThisInstance, NULL);
 
            HWND wk3=CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "0",WS_TABSTOP | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL,
             80, 350, 100, 20, hwnd, (HMENU)MENU02_EDIT6, GetModuleHandle(NULL), NULL);
 
             
 
        break;
        }
 
    case WM_COMMAND:
{
   if (MENU02_EDIT5 == LOWORD(wparam) and EN_CHANGE == HIWORD(wparam))
   {
 
            float Sz;
            float Sy;
            float xSzSy = 0.15;
            char buffer[256];
                      GetWindowText(wSz, buffer, sizeof(buffer));
                      Sz = atof(buffer);
                      GetWindowText(wSy, buffer, sizeof(buffer));
                      Sy = atof(buffer);
   if   (Sz/Sy<=xSzSy)
            {
            SetWindowPos(wk2, HWND_TOP,80, 300, 13, 13, SWP_FRAMECHANGED);
            SetWindowLong (wk2,GWL_STYLE,(LONG) WS_VISIBLE | WS_CHILD | BS_CHECKBOX);
            UpdateWindow(wk2);
            }
 
   }
}
g2_r1_menu02_WindowProcedure - g2_r1 это главное окно, g2_r1_menu02 - дочернее второе.. для каждого окна и главного и дочерних свои процедуры.
Alex5
1029 / 692 / 101
Регистрация: 12.04.2010
Сообщений: 1,750
17.01.2017, 21:48     Обработка EDIT в реальном времени #8
Цитата Сообщение от NSXfl Посмотреть сообщение
C++
1
2
3
4
5
6
7
case WM_COMMAND:
{
 if (IDC_EDIT1 == LOWORD(wparam) and EN_CHANGE == HIWORD(wparam))
 {
 // TODO:
 }
}
NSXfl, где IDC_EDIT1 создается? Какое для него родительское окно?
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
18.01.2017, 06:46  [ТС]     Обработка EDIT в реальном времени #9
Alex5, обязательно нужно делать префикс IDC_**** ?
rao
845 / 398 / 118
Регистрация: 02.04.2014
Сообщений: 1,151
18.01.2017, 18:58     Обработка EDIT в реальном времени #10
NSXfl, если сможешь, выложи архив проекта для Visual Studio не новее 2010
Лучше один раз в отладчике увидеть чем с твоим naming conventions разбираться.
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
18.01.2017, 19:50  [ТС]     Обработка EDIT в реальном времени #11
Обработка EDIT в реальном времени

Оказывается все работает, просто код отправки нового стиля не работает! )) опять проблема хаха
Alex5
1029 / 692 / 101
Регистрация: 12.04.2010
Сообщений: 1,750
18.01.2017, 21:33     Обработка EDIT в реальном времени #12
NSXfl, чему равно значение переменной wk2, когда вызывается GetWindowLong ?
rao
845 / 398 / 118
Регистрация: 02.04.2014
Сообщений: 1,151
18.01.2017, 22:15     Обработка EDIT в реальном времени #13
Да, Alex5 дело говорит. Переменные то локальные, поэтому при каждом выходе из диалоговой процедуры их значения не сохраняются. Делай их статическими или глобальными.
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
19.01.2017, 06:53  [ТС]     Обработка EDIT в реальном времени #14
rao, Alex5, Так все же в пределах одной процедуры. К примеру если напишу

C++
1
2
3
SetWindowPos(wk2, HWND_TOP,80, 300, 13, 13, SWP_FRAMECHANGED);
            SetWindowLong (wk2,GWL_STYLE,(LONG) WS_VISIBLE | WS_CHILD | BS_CHECKBOX);
            UpdateWindow(wk2);
прямо под созданием окна

C++
1
2
wk2=CreateWindow(TEXT("button"), TEXT(" "),WS_VISIBLE | WS_CHILD | BS_CHECKBOX | WS_DISABLED,
             80, 300, 13, 13, hwnd, (HMENU) G2_R1_MENU02_CHECKBOX1, hThisInstance, NULL);
тоесть

C++
1
2
3
4
5
wk2=CreateWindow(TEXT("button"), TEXT(" "),WS_VISIBLE | WS_CHILD | BS_CHECKBOX | WS_DISABLED,
             80, 300, 13, 13, hwnd, (HMENU) G2_R1_MENU02_CHECKBOX1, hThisInstance, NULL);
SetWindowPos(wk2, HWND_TOP,80, 300, 13, 13, SWP_FRAMECHANGED);
            SetWindowLong (wk2,GWL_STYLE,(LONG) WS_VISIBLE | WS_CHILD | BS_CHECKBOX);
            UpdateWindow(wk2);
то стиль WS_DISABLED исчезнет и чекбокс запустится уже рабочий белый (на фото выше видно что он серый если смену стиля засунуть в if (MENU02_EDIT5 == LOWORD(wparam) and EN_CHANGE == HIWORD(wparam)))
Alex5
1029 / 692 / 101
Регистрация: 12.04.2010
Сообщений: 1,750
19.01.2017, 10:37     Обработка EDIT в реальном времени #15
NSXfl, что получится?
C++
1
2
3
4
5
6
7
8
9
10
11
int func(){
  int m = 8;
 
  {
      int m = 10;
 
  }
  cout << "  m == " << m << endl;
 
  return m;
}
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
19.01.2017, 12:42  [ТС]     Обработка EDIT в реальном времени #16
Alex5, все понял, сделал static HWND wk2, заработало.
Только визуально не перересовывается с серого на белый и наоборот, пока не начнешь тыкать в нее..а функционально работает.
UpdateWindow начиная от wk2 заканчивая дескриптором главного окна программы ничего не дает)

Добавлено через 4 минуты
InvalidateRect(wk2, NULL, TRUE);
UpdateWindow(wk2);

помогло! УРА! все работает как надо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2017, 15:04     Обработка EDIT в реальном времени
Еще ссылки по теме:

Обработка щелчка мыши в Edit-окошке C++ WinAPI
C++ WinAPI Сабклассинг Edit
Edit и Button C++ WinAPI
Передача текста из edit в другой edit C++ WinAPI
C++ WinAPI Отображение графика в реальном времени

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 45
21.01.2017, 15:04  [ТС]     Обработка EDIT в реальном времени #17
rao, Alex5, Подскажите применима ли InvalidateRect( ); к окнам EDIT ???

CHECKBOX перерисовывается в серый цвет при WS_DISABLED а поля EDIT не хотят! хотя функционально все работает.
Yandex
Объявления
21.01.2017, 15:04     Обработка EDIT в реальном времени
Ответ Создать тему
Опции темы

Текущее время: 11:44. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru