15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Как определить текущее состояние кнопки в CToolbar

Хотя MFC и предоставляет полезный и простой способ хранения состояния меню и/или кнопок панели инструментов совместно в CControlBar, однако, простого способа определения текущего состояния кнопок не существует.

Для нахождения текущего состояния команд меню или кнопок панели интструментов в классе, наследованном от CControlBar, можно использовать следующий кусок кода:

      UINT iButtonID;
      UINT iButtonStyle;
      int iButtonImage;

      // Если Toolbar не основан на значении константы по умолчанию
      // "AFX_IDW_TOOLBAR", то замените константу Toolbar на нужное
      // значение.

      // Если следующая строка вызывается из фреймового окна (Frame Window)
      // то удалите "GetParentFrame()->":
      CToolBar* pBar =
      (CToolBar*)GetParentFrame()->GetDescendantWindow(AFX_IDW_TOOLBAR);

      // Если данная часть кода вызывается из сгенерированной визардом 
      // (AppWizard) функции фреймового окна (Frame Window) в Visual C++ 4.0,
      // то замените предыдущую строку на следующую. Повторно вызовите,
      // чтобы фреймовое окно, наследованное от CMDIFrameWnd и
      // сгенерированное визардом (AppWizard) имело переменную-член
      // m_wndToolBar для CToolBar.
      CToolBar* pBar = &m_wndToolBar;

      if (pBar != NULL) {

           // в следующей строке используйте нужный ID кнопки:
           int iButtonIndex = pBar->CommandToIndex(ID_MY_BUTTON);

           pBar->GetButtonInfo(iButtonIndex, iButtonID, iButtonStyle,
      iButtonImage);

           // Следующий код проверяет все возможные состояния.
           // На практике, проверяйте только те состояния, которые нужны.

           if (iButtonStyle & TBBS_PRESSED)
                // Кнопка нажата
           else
                if (iButtonStyle & (TBBS_CHECKED & TBBS_DISABLED))
                     // Кнопка нажата и недоступна
                else
                     if (iButtonStyle & TBBS_DISABLED)
                          // Кнопка запрещена
                     else
                          if (iButtonStyle & TBBS_INDETERMINATE)
                               // Неопределённое состояние кнопки
                          else
                               if (iButtonStyle & TBBS_CHECKED)
                                    // Кнопка отмечена (Checked)
                               else
                                    // Кнопка отпущена и доступна

      }