使用API函数CreateWindow或CreateWindowEx创建
MFC封装类为CToolBar
///
新建工程ToolbarDemo
添加一个菜单资源ID为IDR_MENU,为其第一个子菜单项添加两个菜单项:ID_MI_TEST、ID_MI_DISABLE,文本为“测试”和“禁用”
添加一个工具栏资源ID为IDR_TOOLBAR,为其添加两个按钮,ID为ID_MI_TEST、ID_MI_DISABLE
///头文件中
CToolBar m_toolbar ; ///工具栏
BOOL m_bCanTest; //测试按钮是否被禁用
注:OnKickIdle为自定义消息的响应函数,参数格式必须一定
afx_msg LRESULT OnKickIdle(WPARAM wParam , LPARAM lCount);
LRESULT CToolbarDemoDlg::OnKickIdle(WPARAM wParam ,LPARAM lCount)///函数的功能是:在空闲时发出更新界面的消息
{
///向工具栏发出更新消息
if(m_toolbar.IsWindowVisible())
{
CFrameWnd *pParent = (CFrameWnd*)m_toolbar.GetParent(); /// 获得父窗口指针
if(pParent)
m_toolbar.OnUpdateCmdUI(pParent , (WPARAM)true);
}
///向菜单发出更新消息
CMenu* pMainMenu = GetMenu();///CWnd::GetMenu
CCmdUI cmdUI; ????????????
for(UINT n = 0; n < pMainMenu->GetMenuItemCount() ; ++n) ///CMenu::GetMenuItemCount
{
CMenu* pSubMenu = pMainMenu->GetSubMenu(n);
cmdUI.m_nIndexMax = pSubMenu->GetMenuItemCount();
for(UINT i = 0 ; i < cmdUI.m_nIndexMax ;++i)
{
cmdUI.m_nIndex = i ;
cmdUI.m_nID = pSubMenu->GetMenuItemID(i);
cmdUI.m_pMenu = pSubMenu;
cmdUI.DoUpdate(this , FALSE);
}
}
return 0 ;
}
///OnInitDialog中
m_bCanTest = true;
///创建工具栏
m_toolbar.CreateEx(this , TBSTYLE_FLAT ,WS_CHILD | WS_VISIBLE| CBRS_TOP);
m_toolbar.LoadToolBar(IDR_TOOLBAR);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST ,AFX_IDW_CONTROLBAR_LAST , 0 );
///菜单按钮和工具栏按钮的响应函数
void CToolbarDemoDlg::OnMiDisable()
{
// TODO: Add your command handler code here
m_bCanTest = (!m_bCanTest);
}
void CToolbarDemoDlg::OnMiTest()
{
// TODO: Add your command handler code here
AfxMessageBox(_T("你按下了测试按钮!"));
}
ID_MI_TEST的ON_UPDATE_COMMAND_UI消息响应函数
void CToolbarDemoDlg::OnUpdateMiTest(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
///更新ID_MI_TEST的界面,包括工具栏和菜单栏
pCmdUI->Enable(m_bCanTest);
}
BEGIN_MESSAGE_MAP(CToolbarDemoDlg, CDialog)
ON_MESSAGE(WM_KICKIDLE , OnKickIdle)///这里有两个BEGIN_MESSAGE_MAP,不要把代码位置添加错了
END_MESSAGE_MAP()
本例中使用了自定义消息,自定义消息的一般步骤:
1. 在头文件stdafx.h中增加一个自定义消息宏
#define WM_USER_THREADEND WM_USER + 1
2. 在于增加新消息的窗口或对话框类的头文件中增加一个回调函数声明,注意要声明为public
afx_msg LRESULT OnUserThreadend(WPARAM wParam, LPARAM lParam);
3. 在窗口或对话框的cpp文件的BEGIN_MESSAGE_MAP,END_MESSAGE_MAP 中增加一行
ON_MESSAGE(WM_USER_THREADEND, OnUserThreadend)
4. 在窗口或对话框的cpp文件中增加回调函数的实现,如:
LRESULT ThreadDialog::OnUserThreadend(WPARAM wParam, LPARAM lParam)
{
TRACE("WM_USER_THREADEND message /n");
return 0;
}
5. 自定义消息的触发
::PostMessage(GetSafeHwnd(), WM_USER_THREADEND, 0, 0);
其中GetSafeHwnd()得到了一个当前窗口的句柄,此消息将发给当前窗口,如果想发送消息给其它 窗口只需改变这个句柄,前提是目的窗口也实现了此消息的处理函数。