Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++ и WinAPI

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

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

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

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

Хотел сделать три EDIT окна, но третье окно меняет стиль на DISABLE в зависимости от введенных данных в первые два окна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2017, 17:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка EDIT в реальном времени (C++ WinAPI):

Отображение графика в реальном времени - C++ WinAPI
Здравствуйте. Нужно в реальном времени строить график по информации, поступающей с COM-порта. (Наподобие кардиограммы) Данные на...

Редактирование имени кнопки в реальном времени - C++ WinAPI
Здравствуйте. У меня есть массив кнопок, при нажатие на одну из них в кэпшене показывается ее имя. Нужно сделать так, чтобы при измене...

Не работает таймер для показа в реальном времени оперативной памяти - C++ WinAPI
Это моя первая программа на API не ругайте очень строго.Вот моё задание:Привести исходный код программы, отображающей на экране информацию...

Быстрая прорисовка виртуального окна в реальном времени - C++
Описание задачи: Есть приложение работающее в реальном времени и требующее обновление области экрана "попиксельно" со скоростью не хуже...

Отобразить на экране информацию о загрузке ЦП компьютера в реальном времени - C++
Добрый день ! Помогите пожалуйста с кодом на с++. Привести исходный код программы, отображающей на экране информацию о загрузке ЦП ...

Обработка ввода edit - C++ WinAPI
помогите разобрать вот если делаю так то с Edit все нормално обрабатываеться сразу как я ввожу case WM_COMMAND: if...

16
rao
853 / 406 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
04.01.2017, 17:59 #2
Не надо делать цикла, просто добавь в диалоговую процедуру окна обработчик уведомления EN_CHANGE
1
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
04.01.2017, 19:16  [ТС] #3
rao,

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

У меня окно, в нем дочерние окна по кнопкам.. в дочерних окнах поля для ввода.. нажимаешь на поле и он сбрасывает меня в главное окно.
0
Serg_o_Grey
76 / 76 / 27
Регистрация: 29.03.2016
Сообщений: 348
17.01.2017, 11:31 #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));
}
1
rao
853 / 406 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
17.01.2017, 19:06 #6
NSXfl, тут надо смотреть иерархию окон и как им шлются оконные сообщения. Возьми Spy++ и погляди чо как. Про WM_COMMAND написано, что его посылает контрол своему родительскому окну. Значит, в твоем случае и ловить его надо не в главном окне а в дочернем. А раз ты его там не обрабатываешь, то сообщение уходит выше - в главное окно.

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

Оказывается все работает, просто код отправки нового стиля не работает! )) опять проблема хаха
0
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,907
18.01.2017, 21:33 #12
NSXfl, чему равно значение переменной wk2, когда вызывается GetWindowLong ?
1
rao
853 / 406 / 119
Регистрация: 02.04.2014
Сообщений: 1,171
18.01.2017, 22:15 #13
Да, Alex5 дело говорит. Переменные то локальные, поэтому при каждом выходе из диалоговой процедуры их значения не сохраняются. Делай их статическими или глобальными.
1
NSXfl
2 / 2 / 0
Регистрация: 27.10.2016
Сообщений: 48
19.01.2017, 06:53  [ТС] #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)))
0
Alex5
1086 / 747 / 116
Регистрация: 12.04.2010
Сообщений: 1,907
19.01.2017, 10:37 #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;
}
1
19.01.2017, 10:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.01.2017, 10:37
Привет! Вот еще темы с ответами:

Обработка события ввода в edit - C++ WinAPI
Как сделать обработку события ввода в едит? То есть когда я вожу текст в едит, при каждом нажатии вызывается какая-то функция. Было бы...

Обработка щелчка мыши в Edit-окошке - C++ WinAPI
Здравия желаю. Начал изучать WinAPI и столкнулся с проблемой: не знаю, как обработать сообщения окон стандартных классов. Например,...

Обработка сообщений от поля Edit, размещенного на GroupBox с полосами прокрутки - C++ WinAPI
Здравствуйте. Я недавно начал изучать Win API. Пока в интернете не могу найти решение моей проблемы или хотя бы зацепку для решения....

Как при вводе текста в один Edit загружать те же символы во второй Edit? - C++ WinAPI
помогите есть 2 mdi окна в них эдиты. как при вводе текста в 1 эдит загружать теже символы во второй эдит? как хотя бы получить информацию...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

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