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

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

10.12.2013, 08:41. Показов 2928. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
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
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru