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