Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477

Долгое нажатие (зажатие) на созданную кнопку

11.11.2016, 11:39. Показов 2245. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ.

Как-то давно пытался найти, потерпел неудачу и забил, а тут смерть как понадобилось, всё перерыл, но составить запрос в поисковике чтоб найти то что нужно не смог.

Вот есть у меня кнопка, пускай
C++
1
CreateWindow("BUTTON", "Кнопка", WS_CHILD | WS_VISIBLE, 5, 5, 100, 20, hWnd, (HMENU)1, (HINSTANCE)GetModuleHandle(NULL), 0);
при нажатии на неё пусть некая переменная будет инкрементироваться
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
switch (msg)
{
case WM_COMMAND:
    switch (LOWORD(wParam))
    {
    case 1:
        CreateThread(NULL, 0, THREADS::tAnim, NULL, 0, NULL);
        break;
    }
    break;
default:
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
Но сообщение WM_COMMAND посылается только при отпускании клавиши, а если мне надо зажать её и чтоб значения побежали вверх пока я её держу нажатой?

Беда в том, что через поиск показываются только зажатие клавиш мыши и клавиатуры, даже через clickhold пытался искать.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.11.2016, 11:39
Ответы с готовыми решениями:

Как удалить с экрана кнопку созданную через CreateWindowEx(.)?
Через вектор мне необходимо сначала создать несколько кнопок таким образом, а потом как то их удалить из окна, но как они удаляются то......

Долгое нажатие на кнопку с прогресс-баром
Как сделать, чтобы при нажатию на кнопку появился на экране прогресс бар, который двигался от 100% заполненности к нулю, пока пользователь...

Заблокировать долгое нажатие на кнопку HOME
Здравствуйте! Как заблокировать долгое нажатие на кнопку HOME в своем приложении? P.S. Android 4.2.2 На версиях 5.0+ меню недавних...

14
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.11.2016, 11:52
Цитата Сообщение от KokosSPb Посмотреть сообщение
составить запрос в поисковике чтоб найти то что нужно не смог.
скорее всего так: https://www.google.ru/#newwind... 20messages
BN_PUSHED+CreateTimer+BN_UNPUSHED
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
11.11.2016, 11:58  [ТС]
Цитата Сообщение от Max Dark Посмотреть сообщение
BN_PUSHED
Тоже подумал, что как-то так
Спасибо, попробую.
А примера нет никакого?

Добавлено через 2 минуты
C++
1
BN_CLICKED
ещё, вот его не увидел, а сейчас нашел
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.11.2016, 12:07
Цитата Сообщение от KokosSPb Посмотреть сообщение
А примера нет никакого?
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
CreateWindow("BUTTON", "Кнопка",
    WS_CHILD | BS_NOTIFY | WS_VISIBLE,
    5, 5, 100, 20,
    hWnd, (HMENU)1,
    (HINSTANCE)GetModuleHandle(NULL), 0
);
 
//...
 
switch (msg)
{
case WM_COMMAND: {
        switch (HIWORD(wParam)) {
        case BN_PUSHED: {
            switch (LOWORD(wParam))
            {
            case 1:
                // начало осчета
                break;
            }
        }
        break;
        case BN_UNPUSHED: {
            switch (LOWORD(wParam))
            {
            case 1:
                // конец отсчета
                break;
            }
        }
        break;
        }
    }
    break;
default:
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
как то так
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
11.11.2016, 13:13  [ТС]
Цитата Сообщение от KokosSPb Посмотреть сообщение
BN_CLICKED
ещё, вот его не увидел, а сейчас нашел
Так не подходит, срабатывает при отпускании.

Цитата Сообщение от Max Dark Посмотреть сообщение
как то так
Нет, так снова не работает, но скорее всего из-за того, что это всё-таки уведомления, а не команды, сейчас докопаю

Добавлено через 6 минут
Через
C++
1
case WM_NOTIFY:
тоже не обработал
C++
1
BN_PUSHED:
Добавлено через 27 минут
Note This notification code is provided only for compatibility with 16-bit versions of Windows earlier than version 3.0. Applications should use the BS_OWNERDRAW button style and the DRAWITEMSTRUCT structure for this task.
Судя по всему это не вариант
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.11.2016, 13:14
Цитата Сообщение от KokosSPb Посмотреть сообщение
Нет, так снова не работает
тогда остается Subclassing Controls:
  1. создаете кнопку
  2. получаете указатель на обработчик по умолчанию(GetWindowLongPtr+GWLP_WNDPROC)
  3. устанавливаете новый(SetWindowLongPtr+GWLP_WNDPROC)
в обработчике пересылаете сообщения(SendMessage) о нажатии/отпускании родительскому окну(GetParent) и вызываете стандартный обработчик(CallWindowProc)
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
11.11.2016, 13:46  [ТС]
Так, ну с сабклассингом я работал, предлагаешь в нем WM_LBUTTONDOWN и WM_LBUTTONUP ретранслировать?

Добавлено через 11 минут
По WM_LBUTTONDOWN создавать таймер и ставить флаг, в таймере выполнять приращение и, если нужно, высылать в главное окно, по WM_LBUTTONUP обнулять флаг и таймер будет умирать, верно?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.11.2016, 13:57
KokosSPb, да, примерно так.

Добавлено через 1 минуту
по таймеру можно тот же WM_COMMAND передавать
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
11.11.2016, 14:02  [ТС]
Цитата Сообщение от Max Dark Посмотреть сообщение
по таймеру можно тот же WM_COMMAND передавать
это и имел в виду
Цитата Сообщение от KokosSPb Посмотреть сообщение
высылать в главное окно,
. Спасибо
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
11.11.2016, 15:04
Если кнопка не имеет стиля WS_EX_NOPARENTNOTIFY, то родительское окно получает сообщение WM_PARENTNOTIFY.
Миниатюры
Долгое нажатие (зажатие) на созданную кнопку  
2
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
11.11.2016, 15:08  [ТС]
Цитата Сообщение от Alex5 Посмотреть сообщение
Если кнопка не имеет стиля WS_EX_NOPARENTNOTIFY, то родительское окно получает сообщение WM_PARENTNOTIFY.
Спасибо, если я делаю сабклассинг, и при этом блокирую стандартную отправку при совпадении со своими командами - тогда же не будет уведомлений и так? Или я что-то путаю?
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.11.2016, 15:12
Цитата Сообщение от KokosSPb Посмотреть сообщение
тогда же не будет уведомлений и так?
Просто вызывайте оригинальный обработчик для всех сообщений.
Тогда ваши команды будут дополнять его.
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
11.11.2016, 15:16  [ТС]
Цитата Сообщение от Max Dark Посмотреть сообщение
Просто вызывайте оригинальный обработчик для всех сообщений.
Тогда ваши команды будут дополнять его.
Так в результате "WS_EX_NOPARENTNOTIFY" использовать или нет? Я просто не понял...
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
11.11.2016, 15:32
Цитата Сообщение от KokosSPb Посмотреть сообщение
использовать или нет?
не обязательно.
На сколько я понял, в вашем случае обработка WM_PARENTNOTIFY ничего не даст.
1
128 / 86 / 10
Регистрация: 03.02.2011
Сообщений: 477
14.11.2016, 15:37  [ТС]
Кому интересно, сделал так
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
.................
int i;
WNDPROC ButtonProc;
.................
LRESULT CALLBACK ButtonHoldProc(HWND, UINT, WPARAM, LPARAM);    // Процедура обработки зажатия кнопки
.................
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hDC;
    switch (msg)
case WM_CREATE:
    i = 0;
    {
        HWND hWndTmp;
        hWndTmp = CreateWindow("BUTTON", "Кнопка", WS_CHILD | WS_VISIBLE, 5, 5, 100, 20, hWnd, (HMENU)1, (HINSTANCE)GetModuleHandle(NULL), 0);
        ButtonProc = (WNDPROC)GetWindowLongPtr(hWndTmp, GWLP_WNDPROC);
        SetWindowLongPtr(hWndTmp, GWLP_WNDPROC, (LONG_PTR)ButtonHoldProc);
    }
......
case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case 1:
            break;
 
        case 1001:
        {
            char ch[256];
            sprintf_s(ch, "%i", i);
            TextOut(hDCMain, 150, 5, ch, strlen(ch));
        }
            break;
......
}
..........
LRESULT CALLBACK ButtonHoldProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static bool flag = false;
    switch (uMsg)
    {
    case WM_LBUTTONDOWN:
        flag = true;
        SetTimer(hWnd, 1, 500, NULL);
        break;
 
    case WM_LBUTTONUP:
        flag = false;
        KillTimer(hWnd, 1);
        break;
 
    case WM_TIMER:
        i++;
        SendMessage(hMainWnd, WM_COMMAND, 1001, 0);
        break;
    }
    return CallWindowProc(ButtonProc, hWnd, uMsg, wParam, lParam);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2016, 15:37
Помогаю со студенческими работами здесь

Как на динамически созданную панель добавить динамически созданную кнопку?
Добрый день, у меня вопрос как на динамически созданную панель добавить динамически созданную кнопку. private void...

Долгое нажатие кнопки
Нужно выполнять действие по зажатию клавиши: есть кнопка увеличения громкости, при её зажатии звук увеличивается. Пробовал longClick -...

Нажатие на ссылку созданную Ajax.ActionLink() вызывает множество запросов
Пишу форму по заполнению медицинского осмотра. Для заполнения поля с Id пациента есть ссылка на метод действия, который аяксом возвращает...

Определить динамически созданную кнопку
Есть класс, унаследованный от кнопки. Создан массив этих кнопок и динамически выведен на форму. Событие каждой унаследовано, тоесть одно на...

Удалить динамически созданную кнопку
Visual C++ 2008 экспресс-выпуск Простейшее дело. Легко удаётся удалить динамически созданный текстбокс или обычную кнопку с формы...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru