CMFCToolBar上按钮的状态更新

来源:互联网 发布:查询 域名 最早 注册人 编辑:程序博客网 时间:2024/05/30 12:29


1。实现ON_UPDATE_COMMAND_UI宏以及相关的函数

BEGIN_MESSAGE_MAP(CXXXX, CWnd)

ON_UPDATE_COMMAND_UI(id, OnFun)

END_MESSAGE_MAP()


BOOL bEnable = FALSE;

void CXXXX::OnFun(CCmdUI *pCmdUI)

{

pCmdUI->Enable(bEnable);

}


2. 直接修改ToolBar按钮的风格

如果方法1不能自动实现,比如在OCX控件中,则可以用直接修改按钮风格的方法来实现,具体如下:


void CXXXX::EnableToolBarItem(int iIndex, BOOL bOn)
{

CMainFrame *pMainFrame  = (CMainFrame *)theApp.GetMainWnd();

ENSURE(pMainFrame!= NULL)

CMFCToolBar* pToolBar = &pMainFrame->m_wndToolBar;//wndToolBar是我们的CMFCToolBar对象

ENSURE(pToolBar != NULL);

ASSERT_KINDOF(CMFCToolBar, pToolBar);

ASSERT(iIndex < pToolBar->GetCount());

UINT nNewStyle = pToolBar->GetButtonStyle(iIndex) & ~TBBS_DISABLED;

if (!bOn)

{

nNewStyle |= TBBS_DISABLED;

}

ASSERT(!(nNewStyle & TBBS_SEPARATOR));

pToolBar->SetButtonStyle(iIndex, nNewStyle);

}

改变Check状态类似,具体不再赘述。

请参见afxtoolbar.cpp中CToolCmdUI类的源代码,代码如下:


void CToolCmdUI::Enable(BOOL bOn)
{

m_bEnableChanged = TRUE;

CMFCToolBar* pToolBar = (CMFCToolBar*)m_pOther;

ENSURE(pToolBar != NULL);

ASSERT_KINDOF(CMFCToolBar, pToolBar);

ASSERT(m_nIndex < m_nIndexMax);

UINT nNewStyle = pToolBar->GetButtonStyle(m_nIndex) & ~TBBS_DISABLED;

if (!bOn)

nNewStyle |= TBBS_DISABLED;

ASSERT(!(nNewStyle & TBBS_SEPARATOR));

pToolBar->SetButtonStyle(m_nIndex, nNewStyle);

}


void CToolCmdUI::SetCheck(int nCheck)
{

ASSERT(nCheck >= 0);

if (nCheck > 2)

{

nCheck = 1;

}

CMFCToolBar* pToolBar = (CMFCToolBar*)m_pOther;

ENSURE(pToolBar != NULL);

ASSERT_KINDOF(CMFCToolBar, pToolBar);

ASSERT(m_nIndex < m_nIndexMax);

UINT nNewStyle = pToolBar->GetButtonStyle(m_nIndex) & ~(TBBS_CHECKED | TBBS_INDETERMINATE);

if (nCheck == 1)

nNewStyle |= TBBS_CHECKED;

else if (nCheck == 2)

nNewStyle |= TBBS_INDETERMINATE;

ASSERT(!(nNewStyle & TBBS_SEPARATOR));

pToolBar->SetButtonStyle(m_nIndex, nNewStyle | TBBS_CHECKBOX);

}


void CToolCmdUI::SetRadio(BOOL bOn)
{

SetCheck(bOn ? 1 : 0); // this default works for most things as well

CMFCToolBar* pToolBar = (CMFCToolBar*)m_pOther;

ENSURE(pToolBar != NULL);

ASSERT_KINDOF(CMFCToolBar, pToolBar);

ASSERT(m_nIndex < m_nIndexMax);

CMFCToolBarButton* pButton = pToolBar->GetButton(m_nIndex);

ASSERT_VALID(pButton);

pButton->SetRadio();

}




原创粉丝点击