运行时程序界面如界面图,该程序拥有一个工具条用于显示两个命令按钮,一个用于演示如何使按钮处于检查状态,另一个根据第一个按钮的状态来禁止/允许自身。(设置检查状态和允许状态都通过OnUpdateCommand实现)此外Dialog Bar上有一个输入框和按钮,这两个子窗口的禁止/允许同样是根据工具条上的按钮状态来确定,当按下Dialog Bar上的按钮时将显示输入框中的文字内容。状态条的第一部分用于显示各种提示,第二部分用于利用OnUpdateCommand显示当前时间。同时在程序中演示了如何设置菜单项的命令解释字符(将在状态条的第一部分显示)和如何设置工具条的提示字符(利用一个小的ToolTip窗口显示)。
生成应用:利用AppWizard生成一个MFC工程,图1,并设置为单文档界面图2,最后选择工具条,状态条和ReBar支持,图3
修改菜单:利用资源编辑器删除多余的菜单并添加一个新的弹出菜单和三个子菜单,图4,分别是:
图1
图2
图3
图4
\n前的字符串将显示在状态条中作为命令解释,\n后的部分将作为具有相同ID的工具条按钮的提示显示在ToolTip窗口中。
修改Dialog Bar:在Dialog Bar中添加一个输入框和按钮,按钮的ID为IDM_SHOW_TXT与一个菜单项具有相同的ID,这样可以利用映射菜单消息来处理按钮消息(当然使用不同ID值也可以利用ON_COMMAND来映射Dialog Bar上的按钮消息,但是ClassWizard没有提供为Dialog Bar上按钮进行映射的途径,只能手工添加消息映射代码)。图5
修改工具条:在工具条中添加两个按钮,ID值为IDM_CHECK和IDM_DISABLE和其中两个菜单项具有相同的ID值。图6
利用ClassWizard为三个菜单项添加消息映射和更新命令。图7
图5
图6
图7
修改MainFrm.h文件
//添加一个成员变量来记录工具条上Check按钮的检查状态。
protected:
BOOL m_fCheck;
//手工添加状态条第二部分用于显示时间的更新命令,和用于禁止/允许输入框的更新命令
//{{AFX_MSG(CMainFrame)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnCheck();
afx_msg void OnUpdateCheck(CCmdUI* pCmdUI);
afx_msg void OnDisable();
afx_msg void OnUpdateDisable(CCmdUI* pCmdUI);
afx_msg void OnShowTxt();
afx_msg void OnUpdateShowTxt(CCmdUI* pCmdUI);
//}}AFX_MSG
//上面的部分为ClassWizard自动产生的代码
afx_msg void OnUpdateTime(CCmdUI* pCmdUI); //显示时间
afx_msg void OnUpdateInput(CCmdUI* pCmdUI); //禁止/允许输入框
修改MainFrm.cpp文件
//修改状态条上各部分ID
#define ID_TIME 0x705 //作为状态条上第二部分ID
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_SEPARATOR, //先设置为ID_SEPARATOR,在状态条创建后再进行修改
};
//修改消息映射
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(IDM_CHECK, OnCheck)
ON_UPDATE_COMMAND_UI(IDM_CHECK, OnUpdateCheck)
ON_COMMAND(IDM_DISABLE, OnDisable)
ON_UPDATE_COMMAND_UI(IDM_DISABLE, OnUpdateDisable)
ON_COMMAND(IDM_SHOW_TXT, OnShowTxt)
ON_UPDATE_COMMAND_UI(IDM_SHOW_TXT, OnUpdateShowTxt)
//}}AFX_MSG_MAP
//以上部分为ClassWizard自动生成代码
ON_UPDATE_COMMAND_UI(ID_TIME, OnUpdateTime) ////显示时间
ON_UPDATE_COMMAND_UI(IDC_INPUT_TEST, OnUpdateInput) //禁止/允许输入框
//修改OnCreate函数,重新设置状态条第二部分ID值
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
....
// by wenyy 修改状态条上第二部分信息
m_wndStatusBar.SetPaneInfo(1,ID_TIME,SBPS_NORMAL,60);//set the width
return 0;
}
//修改经过映射的消息处理函数代码
void CMainFrame::OnCheck()
{
//在Check按钮被按下时改变并保存状态
m_fCheck=!m_fCheck;
}
void CMainFrame::OnUpdateCheck(CCmdUI* pCmdUI)
{
//Check按钮是否设置为检查状态
pCmdUI->SetCheck(m_fCheck);
}
void CMainFrame::OnDisable()
{
//Disable按钮被按下
AfxMessageBox("you press disable test");
}
void CMainFrame::OnUpdateDisable(CCmdUI* pCmdUI)
{
//根据Check状态决定自身禁止/允许状态
pCmdUI->Enable(m_fCheck);
}
void CMainFrame::OnShowTxt()
{
//得到Dialog Bar上输入框中文字并显示
CEdit* pE=(CEdit*)m_wndDlgBar.GetDlgItem(IDC_INPUT_TEST);
CString szO;
pE->GetWindowText(szO);
AfxMessageBox(szO);
}
void CMainFrame::OnUpdateShowTxt(CCmdUI* pCmdUI)
{
//Dialog Bar上按钮根据Check状态决定自身禁止/允许状态
pCmdUI->Enable(m_fCheck);
}
void CMainFrame::OnUpdateInput(CCmdUI* pCmdUI)
{
//Dialog Bar上输入框根据Check状态决定自身禁止/允许状态
pCmdUI->Enable(m_fCheck);
}
void CMainFrame::OnUpdateTime(CCmdUI* pCmdUI)
{
//根据当前时间设置状态条上第二部分文字
CTime timeCur=CTime::GetCurrentTime();
char szOut[20];
sprintf( szOut, "%02d:%02d:%02d", timeCur.GetHour(), timeCur.GetMinute(),timeCur.GetSecond());
pCmdUI->SetText(szOut);
}