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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010260855/article/details/23126095

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属性:


(2)状态栏的初始化

在这里我给状态栏添加两栏:


所以先创建两个字符串资源,显示状态栏的文字:

然后创建一个局部数组,存储这两个字符串资源:
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、状态栏显示菜单提示信息

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


我们手动添加的状态栏不能响应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



展开阅读全文

没有更多推荐了,返回首页