0 / 0 / 0
Регистрация: 07.10.2011
Сообщений: 7
|
||||||
1 | ||||||
Проверка на нажатую кнопку10.12.2013, 08:41. Показов 2928. Ответов 3
Метки нет (Все метки)
Здравствуйте.
Программа создает N обычных и столько же радио-кнопок. Нажимаем обычную и включается соответствующая ей радио-кнопка и наоборот. Преподаватель выставляет в N значение 15к. С таким значением программа нормально работает только со статической переменной(в ней хранится ID нажатой кнопки), но нужно сделать без нее. Вот этот кусочек проверяет кнопки на нажатие и как только встречает нажатую - отжимает ее и соответствующую ей радио\обычную кнопку. Проблема следующая: при нажатии на радиокнопки, цикл прерывается и кнопки быстро отжимаются, а вот если тыкать по обычным кнопкам, то цикл не прерывается и отжатие происходит долго.
Заранее, спасибо. Весь код: Кликните здесь для просмотра всего текста
#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
|
10.12.2013, 08:41 | |
Ответы с готовыми решениями:
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 |
15к пар кнопок. Нельзя использовать статическую переменную.
Решил эту задачу сам. Поскольку скроллинг не предусмотрен, то на экране помещается примерно 40 кнопок. Сделал цикл проверки по этим 40 кнопкам и все работает быстро Схитрожопил немного ^^
0
|
Исследователь
318 / 317 / 24
Регистрация: 06.04.2011
Сообщений: 872
|
|
24.12.2013, 07:16 | 4 |
Было бы интересней узнать на практике сколько по времени занимает перебор всех кнопок по предложенной мной функции. У самого же руки никогда не дойдут сделать такое...
0
|
24.12.2013, 07:16 | |
24.12.2013, 07:16 | |
Помогаю со студенческими работами здесь
4
Как получить ссылку на нажатую кнопку? Отследить нажатую кнопку на второй форме Checkbox убрать все выбранные по нажатую на кнопку Как сделать активной нажатую кнопку в Bootstram Navbar? Toggle Button - Как правильно выделить нажатую кнопку цветом. Стилями или? JavaScript+JQuery! Как повесить функцию обновления страницы на эту же нажатую кнопку, которая имеет другую функцию? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |