0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
1

Обработка нажатия кнопки win32

26.06.2013, 03:43. Показов 27044. Ответов 17
Метки нет (Все метки)

вообщем есть задан радиус шариков
Int h = 4;
R[i]=h;
как именно нужно описать нажатие кнопки, чтоб при нажатии радиус увеличивался, ну хотя бы в два раза.
хотел сначала увеличить на рандомное число до максимального,который бы сам устанавливал.
НО random подключить не могу, вот подключенные библиотеки:
#include "stdafx.h"
#include "winwin.h"
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include<time.h>
#include <math.h>
C++
1
2
HWND button = CreateWindow(L"button", L"Settings Speed", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
1100, 10, 120, 30, hWnd, (HMENU)10000, hInstance, NULL);
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.06.2013, 03:43
Ответы с готовыми решениями:

Обработка нажатия на Button и программное нажатие правой кнопки мыши
Здравствуйте! Разбираюсь в винапи, есть окно с кнопкой, которая должна включать/выключать...

Обработка сообщений в win32 api
Написал программу которая после ввода в поле edit текста exit и нажатия на кнопку выходит из...

Обработка изображения в Win32 c++ наложение фильтров
Доброго времени суток,пишу курсовой проект хочу сделать небольшой графический эдитор для изменения...

Счётчик нажатия кнопки
Здравствуйте! Никак не справлюсь с задачей счёта количества нажатий кнопки &quot;CreaFile&quot; с помощью...

17
Модератор
Эксперт С++
12639 / 10133 / 6102
Регистрация: 18.12.2011
Сообщений: 27,169
26.06.2013, 08:06 2
Кнопка будет посылать сообщение WM_COMMAND со значением
WPARAM равным 10000:
C++
1
2
3
4
5
6
7
case WM_COMMAND:
if (LOWORD(wparam)==10000)
{
    r*=2; // увеличиваем радиус вдвое, r- статическая переменная
    InvalidateRect(hwnd,NULL,true); // перерисовываем окно
    return 0;
}
1
9 / 9 / 0
Регистрация: 14.01.2013
Сообщений: 102
26.06.2013, 09:20 3
Цитата Сообщение от zss Посмотреть сообщение
Кнопка будет посылать сообщение WM_COMMAND со значением
WPARAM равным 10000:
C++
1
2
3
4
5
6
7
case WM_COMMAND:
if (LOWORD(wparam)==10000)
{
    r*=2; // увеличиваем радиус вдвое, r- статическая переменная
    InvalidateRect(hwnd,NULL,true); // перерисовываем окно
    return 0;
}
Не по теме...
Давно интересует просто...
А почему только младшее слово обрабатывается???
На сколько мне известно из msdn, то там сказано следующие:
- "В младшем слове хранится идентификатор управления, в старшем слове код уведомления"
Почему уведомление не обрабатывают???
Я не знаю вот почему, но обрабатываю уведомления после идентификатора, хотя везде где встречал никто не обрабатывает.
0
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
26.06.2013, 11:28  [ТС] 4
что-то не реагирует кнопка при нажатии,куда именно обработку нужно писать? сразу после объявления кнопки?
0
Заблокирован
26.06.2013, 14:29 5
Так это же два WORD'a на деле или что-то около того AFAIR, в одном WM_* собственно сообщение, в другом param.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32451 / 20945 / 8105
Регистрация: 22.10.2011
Сообщений: 36,213
Записей в блоге: 7
26.06.2013, 15:09 6
Цитата Сообщение от raaawr Посмотреть сообщение
куда именно обработку нужно писать?
В функцию окна, куда ж еще... Там, где у тебя уже есть switch (message), и перечислены остальные обрабатываемые сообщения.
Цитата Сообщение от IPavel Посмотреть сообщение
На сколько мне известно из msdn, то там сказано следующие:
- "В младшем слове хранится идентификатор управления, в старшем слове код уведомления"
Нет в MSDN ничего подобного.

Message SourcewParam (high word)wParam (low word)lParam
Menu0Menu identifier (IDM_*)0
Accelerator1Accelerator identifier (IDM_*)0
ControlControl-defined notification codeControl identifierHandle to the control window
Это есть... Нужно проверить, кто послал это сообщение (менюшка? клавиша-акселератор?) проверяешь HIWORD. Неважно, кто именно был источником (кнопка ли, меню, какая разница в большинстве случаев?) - получаешь идентификатор, и работаешь с ним...
1
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
26.06.2013, 16:02  [ТС] 7
разобрался,спасибо
ошибок не выдает, но радиус не увеличивается...

Добавлено через 3 минуты
мне в место стат переменной r указать свою h? или использовать r? Но где ее определить?
0
Модератор
Эксперт С++
12639 / 10133 / 6102
Регистрация: 18.12.2011
Сообщений: 27,169
26.06.2013, 16:55 8
Цитата Сообщение от raaawr Посмотреть сообщение
мне в место стат переменной r указать свою h? или использовать r? Но где ее определить?
сделайте ее глобальной:
C++
1
2
3
4
5
6
7
8
9
10
11
#include <windows.h>
int r=50;
int WINAPI fnObrabotchik(HWND hwnd,int msg,WPARAM wparam,LPARAM)
{
    switch(msg)
    {
          case WM_COMMAND:
          ....
          
    }
}
0
0 / 0 / 0
Регистрация: 20.09.2012
Сообщений: 40
26.06.2013, 18:19  [ТС] 9
так она и так у меня глобальная
но после клика кнопка никак не реагирует

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
HINSTANCE hInst;  
int h=5;
 
hInst=hInstance;
 srand((unsigned)time(NULL));
 int j=0;
 for(int i=0;i<N;i++)
 {
    R[i]=h;//радиусы шаров
 }
HWND hWnd_button3 = CreateWindow(L"button", L"Settings Size", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
1250, 170, 120, 30, hWnd, (HMENU)10000, hInstance, NULL);
 
WPARAM wParam, LPARAM lParam)
{
switch(message)
{
    case WM_COMMAND:
if (LOWORD(wParam)==1000)
{
   h*=2; // увеличиваем радиус вдвое, r- статическая переменная
    InvalidateRect(hWnd,NULL,true); // перерисовываем окно
    return 0;
}
вот примерно так,кусками из кода
0
9 / 9 / 0
Регистрация: 14.01.2013
Сообщений: 102
26.06.2013, 18:58 10
Цитата Сообщение от UI Посмотреть сообщение
Нет в MSDN ничего подобного.

Message SourcewParam (high word)wParam (low word)lParam
Menu0Menu identifier (IDM_*)0
Accelerator1Accelerator identifier (IDM_*)0
ControlControl-defined notification codeControl identifierHandle to the control window
Это есть... Нужно проверить, кто послал это сообщение (менюшка? клавиша-акселератор?) проверяешь HIWORD. Неважно, кто именно был источником (кнопка ли, меню, какая разница в большинстве случаев?) - получаешь идентификатор, и работаешь с ним...
А это не то же самое, что написал и я???
Только Вы таблицей, а я словами.
Разница на мой взгляд есть...
Например кнопка может посылать не только нажатия в WM_COMMAND.
http://msdn.microsoft.com/en-u... 85%29.aspx
И тогда если обрабатывается только идентификатор будет срабатывать код написанный под ним...

Добавлено через 2 минуты
Вот пример выше диманстрирует описанную ошибку...
case WM_COMMAND:
if (LOWORD(wparam)==10000)
{
* * r*=2; // увеличиваем радиус вдвое, r- статическая переменная
* * InvalidateRect(hwnd,NULL,true); // перерисовываем окно
* * return 0;
}

__________________
0
Модератор
Эксперт С++
12639 / 10133 / 6102
Регистрация: 18.12.2011
Сообщений: 27,169
26.06.2013, 18:59 11
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
#include <windows.h>
HINSTANCE hInst;
int h=5;
const int N=10;
int R[N];
int WINAPI MyObrab(HWND hwnd,int cmd,WPARAM wParam, LPARAM lParam)
{
   switch(message)
  {
      case WM_COMMAND:
         if (LOWORD(wParam)==1000)
         {
              for(int i=0;i<N;i++)
             {
                 R[i]*=2;//радиусы шаров
              }
              InvalidateRect(hWnd,NULL,true); // перерисовываем окно
              return 0;
          }
          break;
     case WM_PAINT:
     {
              for(int i=0;i<N;i++)
             {
                 // Рисуем шар R[i]
              }
         break;
     }
   }
   return 0;// return DefWindowProc(hwnd,cmd,wparam,lparam);
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE,LPSTR,int)
{
     hInst=hInstance;
     srand((unsigned)time(NULL));
     int j=0;
     for(int i=0;i<N;i++)
    {
            R[i]=h;//радиусы шаров
    }
    HWND hWnd_button3 = CreateWindow(L"button", L"Settings Size", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
              1250, 170, 120, 30, hWnd, (HMENU)10000, hInstance, NULL);
    ....
}
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32451 / 20945 / 8105
Регистрация: 22.10.2011
Сообщений: 36,213
Записей в блоге: 7
26.06.2013, 19:26 12
Цитата Сообщение от IPavel Посмотреть сообщение
А это не то же самое, что написал и я???
Это более понятно. Нет коверканья смысла... "В младшем слове хранится идентификатор управления, в старшем слове код уведомления" Кто переводит это всё? "идентификатор управления"... Это Control identifier, что-ли? Он никакой не "идентификатор управления", это идентификатор контрола...

Цитата Сообщение от IPavel Посмотреть сообщение
Например кнопка может посылать не только нажатия в WM_COMMAND.
И какая мне разница, что может посылать кнопка, если тут-то разговор идет только об обработчике WM_COMMAND? Вот когда мне понадобится обработать WM_NOTIFY, с уведомлением от кнопки - там я буду смотреть, что содержится в параметрах этого сообщения.

А то, что программист не завершает ветку case break-ом - это сугубо его проблема (ну, или проблема дизайна языка. Да, мне кажется - что недостатков у этой "фичи" гораздо больше, чем преимуществ), так можно долго-долго пытаться понять, что за дела происходят, если "забыть" break, скажем, перед обработкой WM_CLOSE. Вроде всё нормально, а тут "бац, вторая смена" окно взяло и закрылось после нажатия на кнопку, или, еще лучше - сразу после создания, смотря после чего забыл break вставить...
1
9 / 9 / 0
Регистрация: 14.01.2013
Сообщений: 102
26.06.2013, 19:49 13
Цитата Сообщение от UI Посмотреть сообщение
Это более понятно. Нет коверканья смысла... "В младшем слове хранится идентификатор управления, в старшем слове код уведомления" Кто переводит это всё? "идентификатор управления"... Это Control identifier, что-ли? Он никакой не "идентификатор управления", это идентификатор контрола...
Ну насколько мне известно...
Control - это управления.
Если дословно переводить...
Если же по смыслу...
Имеется в виду - "элемент управления".
Ну как то так...

Цитата Сообщение от UI Посмотреть сообщение
И какая мне разница, что может посылать кнопка, если тут-то разговор идет только об обработчике WM_COMMAND? Вот когда мне понадобится обработать WM_NOTIFY, с уведомлением от кнопки - там я буду смотреть, что содержится в параметрах этого сообщения.
Ну немного не так...
Я имел в виду что в WM_COMMAND могут прийти и другие уведомления...
Например получения фокуса, потеря фокуса и т.д.
Конечно если установлен стиль BS_NOTIFY.
И тогда всякий раз будет срабатывать код для кнопки если не обрабатывать код уведомления...
Ну собсно это я так...
Интересно просто было почему во всех примерах где встречал этого не делают...
Только в заумных книжках в которых расбераются далеко не такие тривиальные задачи ...
0
46 / 43 / 5
Регистрация: 10.01.2017
Сообщений: 1,522
05.10.2020, 17:59 14
Цитата Сообщение от raaawr Посмотреть сообщение
HWND button = CreateWindow(L"button", L"Settings Speed", WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
1100, 10, 120, 30, hWnd, (HMENU)10000, hInstance, NULL);
Цитата Сообщение от zss Посмотреть сообщение
Кнопка будет посылать сообщение WM_COMMAND со значением
WPARAM равным 10000:
...
}[/CPP]
Подскажите, а в оконную процедуру случаем ни как не приходит сам HWND созданной кнопки ? Это, чтобы от HMENU кнопки/кнопок не зависить. А сравнивать именно HWND, а не LOWORD(wparam).
0
6574 / 4559 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
05.10.2020, 18:55 15
Цитата Сообщение от Optimus11 Посмотреть сообщение
Подскажите, а в оконную процедуру случаем ни как не приходит сам HWND созданной кнопки ? Это, чтобы от HMENU кнопки/кнопок не зависить. А сравнивать именно HWND, а не LOWORD(wparam).
lParam для контролов это Handle to the control window
https://docs.microsoft.com/en-... wm-command
1
Модератор
Эксперт CЭксперт С++
5107 / 4538 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
05.10.2020, 19:10 16
Optimus11, только сравнивать ID кнопки удобнее, чем handle. Из-за того, что ID всегда одно и то же, а handle меняется от запуска к запуску.

Добавлено через 4 минуты
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
чтобы от HMENU кнопки/кнопок не зависить
Вам мало чисел для нумерации контролов?
Кроме того, имея ID контролов, можно в ресурсах хранить строки-подсказки с номером контролов, которые будут показываться при наведении на соответствующие контролы.
1
46 / 43 / 5
Регистрация: 10.01.2017
Сообщений: 1,522
05.10.2020, 19:50 17
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
lParam для контролов это Handle to the control window
https://docs.microsoft.com/en-... wm-command
Спасибо!

Добавлено через 2 минуты
Цитата Сообщение от liv Посмотреть сообщение
Optimus11
Вам мало чисел для нумерации контролов?
.
Нет, не мало конечно, я просто подумал, что так будет проще: мне просто нужно условно - по щелчку мышки добавлять каждый раз кнопку - тут понятно, что HMENU просто можно каждый раз +1 прибавлять с созданием новой кнопки, а что, если мне нужно будет по щелчку удалить какую то произвольную кнопку, HMENU тогда всех последующих кнопок по хорошему нужно пересчитывать, а что то не очень хочется.
0
Модератор
Эксперт CЭксперт С++
5107 / 4538 / 854
Регистрация: 07.10.2015
Сообщений: 9,462
05.10.2020, 20:02 18
Optimus11, зачем пересчитывать? Есть функция для этого
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.10.2020, 20:02
Помогаю со студенческими работами здесь

Симуляция нажатия кнопки
ПОДСКАЖИТЕ как сделать симуляцию нажатия кнопки в заданое время. т.е. мне нужно что бы клавиша...

Обработка нажатия мышки и клавиатуры
Доброе всем время суток! Вот разбираюсь в винапи и пришол к моменту обработки нажатий клавиш мышки...

Удаление кнопки после ее нажатия
Привет всем!) Помогите пожалуйста, новичок в программировании, и вот понадобилось удалить кнопку...

Отсутствие отображения нажатия на кнопки
Не получается самому допереть, но очень любопытно, что не так. Вот код. #include &lt;Windows.h&gt; ...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru