Как определить текущее состояние кнопки в 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
// Кнопка отпущена и доступна

}