Обработка удержания клавиши.

Тема в разделе "WASM.WIN32", создана пользователем Полный 30h, 1 сен 2020.

  1. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    GRAFik,

    Тебе это не нужно точно, ели ты трассировать полностью всё начнёш или писать инструмент для этого, тогда это нужно. Интересный пример https://twitter.com/waleedassar

    Чувак крут, потому что он создал инструмент для поиска уязвимостей в гуе. Да там нужно знать как это работает, но и выхлоп не плохой. А клепать мышем гуй это совсем ниочём.
     
  2. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Ну от Инди редко когда, что-то дельного в ответе можно дождаться, кроме бесполезного мусора. ))
    Может кто-то еще, что-нибудь добавит?
     
  3. A_L_E_X

    A_L_E_X New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2020
    Сообщения:
    13
    Ещё раз повторяю, у вас не получится создать свое уникальное гуи. Точнее эта уникальность и будет результатом опыта помноженного на время, но всё в том же ВинАпи, просто используя несколько иную механику отрисовки и обработки событий. Иначе вы не можете вырвать кусок кода из реальности оси и работать только с ним. Кроме вашего гуи, есть ещё и другие окна, табуляция, фокус и даже переписав МесседжБокс на игровом движке, эти события нужно всё так же обрабатывать. Так что не нужно изобретать велосипед и усложнять себе жизнь, шаблонных элементов диалогового окна вам более чем достаточно и не разобравшись с ними, грезить о каких-то своих феерических гуи уж точно не стоит. Начните с малого, потом научитесь рисовать и использовать текстуры для элементов и пусть все думают, что это ваш "свой гуи" ))
     
  4. Intro

    Intro Active Member

    Публикаций:
    0
    Регистрация:
    29 авг 2009
    Сообщения:
    562
    Код (C++):
    1.  
    2. case WM_COMMAND:
    3.         //отслеживаем отпускание button
    4.         if (lParam != 0 && wmEvent == 0){
    5.             if (wmId>=2 && wmId<=31)
    6.                 KeyUp(wmId-2);
    7.         }
    8.         break;
    9.     case WM_SETCURSOR:  //на что-то нажали
    10.         int     mode;
    11.         if (SendMessage(hRadioSwithOn, BM_GETCHECK, 0, 0)==BST_CHECKED)         //включаем
    12.             SwitchOn();
    13.         else if (SendMessage(hRadioSwithOff, BM_GETCHECK, 0, 0)==BST_CHECKED)   //выключаем
    14.             SwitchOff();
    15.         mode = -1;
    16.         if (SendMessage(hRadioRadians, BM_GETCHECK, 0, 0)==BST_CHECKED)
    17.             mode = 0;           //Радианы
    18.         else if (SendMessage(hRadioGrads, BM_GETCHECK, 0, 0)==BST_CHECKED)
    19.             mode = 1;           //Грады
    20.         else if (SendMessage(hRadioDegrees, BM_GETCHECK, 0, 0)==BST_CHECKED)
    21.             mode = 2;           //Градусы
    22.         if (mode>=0){
    23.             SwitchTrigo(mode);
    24.         }
    25.         //отслеживаем нажатие button
    26.         wmEvent = HIWORD(lParam) & 0xFF;
    27.         for (int i = 0; i<countGroupButtons; i++){
    28.             if ((WPARAM)hGroupButtons[i]==wParam && wmEvent==1){
    29.                 KeyDown(i);
    30.                 break;
    31.             }
    32.         }
    33.         SetFocus(hWnd); //сброс фокуса на основное окно
    34.         break;
    35.  
    Как я решил проблему отслеживания нажатия и отпускания контрола button. Возможно радиокнопки надо переделать. Так же button дублируется клавиатурными клавишами.
    Код (C++):
    1.  
    2.     case WM_KEYDOWN:
    3.     case WM_KEYUP: {
    4.         char    key = wParam & 0xFF;
    5.         for (int i = 0; i<30; i++)
    6.             if (CodeKeys[i]==key){
    7.                 if (uMsg == WM_KEYDOWN)
    8.                     KeyDown(i);
    9.                 else
    10.                     KeyUp(i);
    11.                 break;
    12.             }
    13.         }
    14.     default:
    15.         return DefWindowProc(hWnd, uMsg, wParam, lParam);
    16.     }
    17.     return 0;
    18.  
    PS
    Оконное оболочка для эмулятора калькулятора МК-61.