С Новым годом! Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 7
1

Проверка на нажатую кнопку

10.12.2013, 08:41. Показов 2943. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Программа создает N обычных и столько же радио-кнопок.
Нажимаем обычную и включается соответствующая ей радио-кнопка и наоборот.

Преподаватель выставляет в N значение 15к.
С таким значением программа нормально работает только со статической переменной(в ней хранится ID нажатой кнопки), но нужно сделать без нее.

Вот этот кусочек проверяет кнопки на нажатие и как только встречает нажатую - отжимает ее и соответствующую ей радио\обычную кнопку.
Проблема следующая: при нажатии на радиокнопки, цикл прерывается и кнопки быстро отжимаются, а вот если тыкать по обычным кнопкам, то цикл не прерывается и отжатие происходит долго.
C++
1
2
3
4
5
6
7
for(WORD i=STARTID;i<STARTID+NBT;i+=2)
                    if(SendDlgItemMessage(hwnd,i,BM_GETSTATE,0,0) == BST_PUSHED)
                        {
                        SendDlgItemMessage(hwnd,i,BM_SETSTATE,FALSE,0);
                        SendDlgItemMessage(hwnd,i+1,BM_SETCHECK,BST_UNCHECKED,0);
                        break;
                        }
Подкиньте идею
Заранее, спасибо.

Весь код:
Кликните здесь для просмотра всего текста
#include <Windows.h>

#define NBT 15000
#define STARTID 100

HINSTANCE ghInst;

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // command line "abc 555"
int nCmdShow // show state
)
{
ghInst = hInstance;
WNDCLASS ws = {0};
ws.lpszClassName = "LabBTN";
ws.style=CS_VREDRAW|CS_HREDRAW;
ws.hInstance = hInstance;
ws.lpfnWndProc = WindowProc;
ws.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
ws.hCursor = LoadCursor(NULL, IDC_ARROW);
if (RegisterClass(&ws) == NULL)
{
return 0;
}

int cx=GetSystemMetrics(SM_CXSCREEN);
int cy=GetSystemMetrics(SM_CYSCREEN);

HWND hwndMain = CreateWindow(
ws.lpszClassName,
"Btns", // window name
WS_OVERLAPPEDWINDOW, // window style
2*cx/5, // horizontal position of window
cy/5, // vertical position of window
cx/4, // window width
3*cy/5, // window height
NULL, // handle to parent or owner window
NULL, // menu handle or child identifier
hInstance, // handle to application instance
NULL);

if (hwndMain == NULL)
return 0;

ShowWindow(hwndMain, nCmdShow);

MSG msg;
while (GetMessage(&msg, 0,0,0))
DispatchMessage(&msg);
return 0;
}

LRESULT CALLBACK WindowProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch (uMsg)
{
case WM_CREATE:
{
for(int i=0,int y=10;i<NBT;i++,y+=30)
{
char str[256]="Button ",temp[256];
strcat(str,itoa(i+1,temp,10));
CreateWindow(
"BUTTON",
str,
WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
10,
y,
100,
25,
hwnd,
(HMENU)(STARTID+2*i),
ghInst,
NULL);
strcpy(str,"Radiobutton ");
strcat(str,temp);
CreateWindow(
"BUTTON",
str,
WS_VISIBLE|WS_CHILD|BS_AUTORADIOBUTTON|BS_PUSHBUTTON,
120,
y,
140,
25,
hwnd,
(HMENU)(STARTID+2*i+1),
ghInst,
NULL);
}
SendDlgItemMessage(hwnd,STARTID+20,BM_SETSTATE,TRUE,0);
SendDlgItemMessage(hwnd,STARTID+21,BM_SETCHECK,TRUE,0);
return 0;
}

case WM_DESTROY:
PostQuitMessage(0);
return 0;

case WM_COMMAND:
{
WORD idtek=LOWORD(wParam);
for(WORD i=STARTID;i<STARTID+NBT;i+=2)
if(SendDlgItemMessage(hwnd,i,BM_GETSTATE,0,0) == BST_PUSHED)
{
SendDlgItemMessage(hwnd,i,BM_SETSTATE,FALSE,0);
SendDlgItemMessage(hwnd,i+1,BM_SETCHECK,BST_UNCHECKED,0);
break;
}

if(idtek%2==0)
{
SendDlgItemMessage(hwnd,idtek,BM_SETSTATE,TRUE,0);
SendDlgItemMessage(hwnd,idtek+1,BM_SETCHECK,TRUE,0);
}
else
{
SendDlgItemMessage(hwnd,idtek-1,BM_SETSTATE,TRUE,0);
SendDlgItemMessage(hwnd,idtek,BM_SETCHECK,TRUE,0);
}
return 0;
}

}
return DefWindowProc(hwnd, uMsg, wParam, lParam);

}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.12.2013, 08:41
Ответы с готовыми решениями:

Как определить нажатую кнопку?
На рабочем листе Excel (не на форме) расположено N-ое количество управляющих элементов...

не могу проверить нажатую кнопку
&lt;html&gt; &lt;head&gt; &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot;&gt; ...

Получить текущую нажатую кнопку
Привет! У меня есть 3 кнопки с одинаковым оутлет. При нажатии на 3ю кнопку, у меня показывает что...

Как нажатую кнопку не нажатой сделать?
Здравствуйте! Подскажите, если не затруднит. Ситуация такая: после нажатия кнопки срабатывает php и...

3
Исследователь
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
10.12.2013, 11:03 2
15к - это что значит? 15 000 кнопок? Хранить ID нажатой кнопки нельзя? Да еще и долго выполняющийся цикл перебора всех кнопок...
В случае, если нажатая кнопка может быть только одна, то CheckRadioButton вам в руки! И предложенный вами код из семи строк запросто укладывается в одну. По идее, должно работать быстрее, чем цикл, несмотря на то, что тут тоже используется BM_SETCHECK для каждой кнопки.
0
0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 7
10.12.2013, 17:06  [ТС] 3
Цитата Сообщение от GrayWolf Посмотреть сообщение
15к - это что значит? 15 000 кнопок? Хранить ID нажатой кнопки нельзя? Да еще и долго выполняющийся цикл перебора всех кнопок...
В случае, если нажатая кнопка может быть только одна, то CheckRadioButton вам в руки! И предложенный вами код из семи строк запросто укладывается в одну. По идее, должно работать быстрее, чем цикл, несмотря на то, что тут тоже используется BM_SETCHECK для каждой кнопки.
15к пар кнопок. Нельзя использовать статическую переменную.
Решил эту задачу сам. Поскольку скроллинг не предусмотрен, то на экране помещается примерно 40 кнопок. Сделал цикл проверки по этим 40 кнопкам и все работает быстро Схитрожопил немного ^^
0
Исследователь
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
24.12.2013, 07:16 4
Цитата Сообщение от Rabb1t Посмотреть сообщение
Схитрожопил немного ^^
Было бы интересней узнать на практике сколько по времени занимает перебор всех кнопок по предложенной мной функции. У самого же руки никогда не дойдут сделать такое...
0
24.12.2013, 07:16
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.12.2013, 07:16
Помогаю со студенческими работами здесь

Как получить ссылку на нажатую кнопку?
Здравствуйте. Сразу код: private void Form1_Load(object sender, EventArgs e) { for (int i =...

Отследить нажатую кнопку на второй форме
Есть две формы: основная и вторая с двумя кнопками да и нет. При совершении некоторых действий на...

Checkbox убрать все выбранные по нажатую на кнопку
Добрый день. Не могу разобраться . У меня есть форма &lt;label&gt;&lt;div class=&quot;photo&quot; data-title=&quot;Цена...

Как сделать активной нажатую кнопку в Bootstram Navbar?
Всем привет. Делаю на первый взгляд тривиальную вещь, хочу чтобы нажатый пункт меню стал...

Toggle Button - Как правильно выделить нажатую кнопку цветом. Стилями или?
Toggle Button в листенере просто присвоить цвет - красный или как то другим свойством в...

JavaScript+JQuery! Как повесить функцию обновления страницы на эту же нажатую кнопку, которая имеет другую функцию?
я понимаю что звучит очень странно, НО! по пунктам: 1. есть кнопка С функцией А 2. при нажатии на...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Как программировать под HCL Notes и создавать свои продукты на ее основе
InfoMaster 11.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой мощную платформу для разработки корпоративных приложений, которая сочетает в себе функции электронной почты, календаря,. . .
Как работать с SVN (Subversion)
InfoMaster 11.01.2025
Введение Система контроля версий является неотъемлемой частью современного процесса разработки программного обеспечения. Она обеспечивает управление изменениями в коде, позволяет отслеживать. . .
Использование GraphQL в JavaScript
InfoMaster 11.01.2025
Введение в GraphQL и его преимущества В современной разработке веб-приложений эффективный обмен данными между клиентом и сервером играет ключевую роль. GraphQL представляет собой язык запросов и. . .
Администрирован­­­­ие Git, продвинутые техники работы с Git
InfoMaster 11.01.2025
Основы управления репозиторием Эффективное управление Git-репозиторием требует глубокого понимания механизмов контроля доступа и инструментов администрирования. Рассмотрим ключевые аспекты. . .
Что такое HCL Notes и как с ним работать
InfoMaster 10.01.2025
HCL Notes (ранее известный как IBM Notes и Lotus Notes) представляет собой комплексную платформу для совместной работы и обмена информацией в корпоративной среде. Это многофункциональное решение,. . .
Как работать с Git из Windows и Visual Studio
InfoMaster 10.01.2025
Работа с Git в Windows Работа с Git в операционной системе Windows может быть осуществлена с помощью различных инструментов, каждый из которых обладает своими уникальными возможностями и. . .
Аналог оператора switch case в Python
InfoMaster 10.01.2025
Оператор switch case используется в программировании для выбора одного из нескольких вариантов исполнения кода. Однако в языке Python этот оператор отсутствует. Понимание аналогов switch case в. . .
Отличия абстрактного класса от интерфейса
InfoMaster 10.01.2025
В современной разработке программного обеспечения существуют два основных механизма реализации абстракции: абстрактные классы и интерфейсы. Эти инструменты, хотя и схожи в своей основной цели -. . .
Как работать в Git
InfoMaster 10.01.2025
Git — это одна из наиболее популярных систем контроля версий, которая активно используется разработчиками по всему миру. Она позволяет эффективно управлять изменениями в коде, координировать работу. . .
Реализация передвижения персонажа в Unity3d на C#
InfoMaster 10.01.2025
Реализация передвижения персонажа в Unity3D начинается с правильной настройки проекта. Этот этап критически важен для создания отзывчивого и плавного управления. Рассмотрим основные шаги для создания. . .
Docker: руководство для начинающих
InfoMaster 10.01.2025
В современном мире разработки программного обеспечения контейнеризация стала неотъемлемой частью процесса создания и развертывания приложений. Docker, как ведущая платформа контейнеризации, произвела. . .
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru