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

C++ и WinAPI

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

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

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

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

Хотел сделать три EDIT окна, но третье окно меняет стиль на DISABLE в зависимости от введенных данных в первые два окна.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2017, 17:19     Обработка EDIT в реальном времени
Посмотрите здесь:
C++ WinAPI Отображение графика в реальном времени
Редактирование имени кнопки в реальном времени C++ WinAPI
C++ WinAPI Не работает таймер для показа в реальном времени оперативной памяти
Обработка ввода edit C++ WinAPI
C++ WinAPI Обработка события ввода в edit
Обработка щелчка мыши в Edit-окошке C++ WinAPI
Обработка сообщений от поля Edit, размещенного на GroupBox с полосами прокрутки C++ WinAPI
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rao
852 / 405 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
04.01.2017, 17:59     Обработка EDIT в реальном времени #2
Не надо делать цикла, просто добавь в диалоговую процедуру окна обработчик уведомления EN_CHANGE
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
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
Сообщений: 48
17.01.2017, 06:15  [ТС]     Обработка EDIT в реальном времени #4
rao, не работает.

У меня окно, в нем дочерние окна по кнопкам.. в дочерних окнах поля для ввода.. нажимаешь на поле и он сбрасывает меня в главное окно.
Serg_o_Grey
66 / 66 / 24
Регистрация: 29.03.2016
Сообщений: 335
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
852 / 405 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
17.01.2017, 19:06     Обработка EDIT в реальном времени #6
NSXfl, тут надо смотреть иерархию окон и как им шлются оконные сообщения. Возьми Spy++ и погляди чо как. Про WM_COMMAND написано, что его посылает контрол своему родительскому окну. Значит, в твоем случае и ловить его надо не в главном окне а в дочернем. А раз ты его там не обрабатываешь, то сообщение уходит выше - в главное окно.

Serg_o_Grey, сабклассинг контролов это конечно хорошо, но не здесь. Потому что совершенно ни к чему городить огород и делать вручную ту работу, которая уже выполняется в самом API. Анализ WM_KEYUP это слишком низко и трудоемко.
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
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
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,793
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
Сообщений: 48
18.01.2017, 06:46  [ТС]     Обработка EDIT в реальном времени #9
Alex5, обязательно нужно делать префикс IDC_**** ?
rao
852 / 405 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
18.01.2017, 18:58     Обработка EDIT в реальном времени #10
NSXfl, если сможешь, выложи архив проекта для Visual Studio не новее 2010
Лучше один раз в отладчике увидеть чем с твоим naming conventions разбираться.
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
18.01.2017, 19:50  [ТС]     Обработка EDIT в реальном времени #11
Обработка EDIT в реальном времени

Оказывается все работает, просто код отправки нового стиля не работает! )) опять проблема хаха
Alex5
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,793
18.01.2017, 21:33     Обработка EDIT в реальном времени #12
NSXfl, чему равно значение переменной wk2, когда вызывается GetWindowLong ?
rao
852 / 405 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
18.01.2017, 22:15     Обработка EDIT в реальном времени #13
Да, Alex5 дело говорит. Переменные то локальные, поэтому при каждом выходе из диалоговой процедуры их значения не сохраняются. Делай их статическими или глобальными.
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
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)))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2017, 10:37     Обработка EDIT в реальном времени
Еще ссылки по теме:
C++ WinAPI Сохранение из Edit в массив, вывод из массива в Edit
Передача текста из edit в другой edit C++ WinAPI
Обработка сигнала микрофона в реальном времени C++
Обработка звука в реальном времени поэтапно Софт
Запись и обработка звукового сигнала в реальном времени

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

Или воспользуйтесь поиском по форуму:
Alex5
1049 / 712 / 105
Регистрация: 12.04.2010
Сообщений: 1,793
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;
}
Yandex
Объявления
19.01.2017, 10:37     Обработка EDIT в реальном времени
Ответ Создать тему
Опции темы

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