MFC对话框添加菜单、状态栏,并在状态栏显示菜单提示信息

时间:2021-05-31 00:18:50

1、添加菜单、状态栏

  1、添加菜单的方法比较多,可以在VS studio的Resource View里面分别添加一个菜单资源和状态栏资源;

  2、在对话框头文件添加菜单和状态栏成员变量:

	// 菜单
CMenu m_Menu;
//状态栏
CStatusBar m_StatusBar;
             

  3、完成菜单与状态栏的初始化(在OnInitDialog()添加以下代码):

(1)菜单的初始化:

//添加自定义菜单
m_Menu.LoadMenuA(IDR_MENU1);
SetMenu(&m_Menu);

            小技巧:菜单栏的初始化也可以不用代码实现,直接修改对话框的Menu属性:

MFC对话框添加菜单、状态栏,并在状态栏显示菜单提示信息

(2)状态栏的初始化

在这里我给状态栏添加两栏:
MFC对话框添加菜单、状态栏,并在状态栏显示菜单提示信息

所以先创建两个字符串资源,显示状态栏的文字:
MFC对话框添加菜单、状态栏,并在状态栏显示菜单提示信息
然后创建一个局部数组,存储这两个字符串资源:
static UINT indicators[]={IDS_STATESTRING1,IDS_STATESTRING2};

接下来就可以初始化状态栏了:
//添加状态栏

if(!m_StatusBar.Create(this)|| !m_StatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Can't create status bar\n");
return false;
}
m_StatusBar.GetClientRect(&stateRect);
m_StatusBar.MoveWindow(0,rect.bottom-stateRect.Height(),rect.right,stateRect.Height());// 调整状态栏的位置和大小
m_StatusBar.SetPaneInfo(0,m_StatusBar.GetDlgCtrlID(),SBPS_NOBORDERS,250);//设置状态栏的宽度
m_StatusBar.SetPaneInfo(1,m_StatusBar.GetDlgCtrlID(),SBPS_STRETCH,20);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);//显示状态栏

我们希望,当窗口大小变化是,状态栏始终在底部,就需要在对话框的OnSize()函数里面添加相应的代码:
//根据窗口的大小自动调整工具栏、状态栏的大小
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);

到此时,菜单和状态栏就添加完成。

2、状态栏显示菜单提示信息

状态栏的一个重要作用就是要显示提示信息,列如:我们将鼠标放在菜单栏某个菜单时,在状态栏给出菜单键相应的提示信息
MFC对话框添加菜单、状态栏,并在状态栏显示菜单提示信息

我们手动添加的状态栏不能响应OnMenuSelect()消息,这就需要我们自己手动添加一个函数OnMenuSelect()
对话框头文件声明:
void OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu);
源文件实现:
void MeasurementDlg::OnMenuSelect(UINT nItemID, UINT nFlags, HMENU hSysMenu)
{
CString strStatusText;
strStatusText.LoadString( nItemID);
m_StatusBar.SetPaneText(0, strStatusText);
return ;
}

但是这时候我们发现状态栏任然没有提示,为什么呢?原因在于OnMenuSelect()这个函数并没有被调用。
下面重载对话框的WindowProc()
LRESULT MeasurementDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
// TODO: Add your specialized code here and/or call the base class
if (message==WM_MENUSELECT)
{
OnMenuSelect(LOWORD(wParam), HIWORD(wParam), (HMENU)lParam);
}
return CDialog::WindowProc(message, wParam, lParam);
}

如此,就会响应鼠标落在菜单上的消息了并调用OmMenuSelect()函数进行处理。

为了实现菜单与工具按钮同步响应请阅读这篇博客: 点击打开链接

Email:1834428218@qq.com