Обнаружение стрелок вверх / вниз в cspinbuttonctrl mfc c++

Есть ли способ отличить нажатие стрелки вверх или вниз на CSpinButtonCtrl?

Я пытаюсь использовать событие OnPointerdown, но не знаю, как это сделать ...

afx_msg LRESULT CMySpinButtonCtrl::OnPointerdown(WPARAM wParam, LPARAM lParam)
{
   if(IS_POINTER_PRIMARY_WPARAM(wParam))
   {
       //TODO
   }
   return 0;
}

Буду признателен за любую помощь.

Один из способов - проверить позицию курсора. Если он находится в верхней половине элемента управления, это кнопка вверх.

Jonathan Potter 11.04.2018 12:47

Правильный способ - обработать код уведомления UDN_DELTAPOS через ON_NOTIFY(UDN_DELTAPOS, ...). Вы получите структуру NMUPDOWN, где член iDelta представляет собой целое число со знаком, которое содержит предлагаемое изменение позиции (положительное значение указывает вверх, отрицательное значение - вниз).

fhe 11.04.2018 13:05

Кажется, ваш вопрос связан с другим: stackoverflow.com/questions/49750680/…

Andrew Truckle 11.04.2018 15:44
2
3
1 326
1

Ответы 1

Is there any way to differentiate when the Up or Down arrow of a CSpinButtonCtrl is pressed?

Для этого вы должны использовать UDN_DELTAPOS.

  • Щелкните правой кнопкой мыши элемент управления в Редактор ресурсов и выберите Добавить обработчик событий:

Add Event Handler

  • Выберите сообщение UDN_DELTAPOS и нажмите Добавить и редактировать:

UDN_DELTAPOS

  • Вам будет предоставлен скелетный код:

    void CMFCApplication1Dlg::OnDeltaposSpin1(NMHDR *pNMHDR, LRESULT *pResult)
    {
        LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
        // TODO: Add your control notification handler code here
        *pResult = 0;
    }
    
  • Статья NMUPDOWN объясняет используемую вами структуру. Что вам нужно сделать, так это проверить значение iDelta. Пример:

    void CColumnOrderDlg::OnDeltaposSpinColumns(NMHDR* pNMHDR, LRESULT* pResult) 
    {
        LPNMUPDOWN pNMUpDown = reinterpret_cast<LPNMUPDOWN>(pNMHDR);
    
        if (pNMUpDown != nullptr)
        {
            if( pNMUpDown->iDelta > 0)
                // Up - Do stuff;
            else if(pNMUpDown->iDelta < 0)
                // Down - Do stuff;
        }
    
        *pResult = 0;
    }
    

Также есть полезная статья здесь, в которой говорится:

If you use a spin control for some other purpose, for example, to page through a sequence of windows or dialog boxes, then add a handler for the UDN_DELTAPOS message and perform your custom action there.

Другие вопросы по теме