MFC-菜单和工具栏

(1)创建一个单文档应用程序MousePos。在“视图”菜单下添加一个子菜单“鼠标位置”,ID为ID_VIEW_MOUSE,当选择该菜单命令后,鼠标当前的位置显示到用户区,同时该菜单项呈选中状态。再次选择该菜单命令,用户区不再显示当前鼠标位置,同时该菜单项的选中状态被去除。

(2)在工具栏上添加并设计一个工具按钮图标,使该按钮和ID_VIEW_MOUSE菜单命令联动,并添加一个快捷键Ctrl+1和该菜单命令联动。

(3)在窗口用户区中右击鼠标,弹出快捷菜单,显示主菜单“视图”中的菜单命令。结果如图:

MFC菜单栏和工具栏

解答:

1、通过MFC应用程序向导建立单文档应用程序。

2、切换到资源视图,编辑menu中的IDR_MAINFRAME,在“视图”中添加“鼠标位置”菜单。Caption为“鼠标位置[&M]\tCtrl+1”,ID为“ID_VIEW_MOUSE”

3、在类CMousePosView中添加public变量:

CString m_strShow; //用于显示鼠标位置的字符串
BOOL m_bShow; //控制是否显示鼠标位置的bool值

4、切换到菜单编辑视图,为“鼠标位置”菜单添加事件处理程序,消息类型为COMMAND。

void CMousePosView::OnViewMouse()
{
	// TODO: 在此添加命令处理程序代码
	m_bShow = !m_bShow;
	Invalidate();
}

5、再次切换到菜单编辑视图,为“鼠标位置”菜单添加事件处理程序,消息类型为UPDATE_COMMAND_UI。

void CMousePosView::OnUpdateViewMouse(CCmdUI *pCmdUI)
{
	// TODO: 在此添加命令更新用户界面处理程序代码
	pCmdUI->SetCheck(m_bShow);
}

6、新增状态栏位置,在MainFrm.cpp中的static UINT indicators[]改为:

static UINT indicators[] =
{
	ID_SEPARATOR,           // 状态行指示器
	ID_SEPARATOR,
	ID_INDICATOR_CAPS,
	ID_INDICATOR_NUM,
	ID_INDICATOR_SCRL,
};

7、在CMousePosView类的OnDraw(CDC* pDC)函数中添加界面初始化代码,实现鼠标位置的显示。

// TODO: 在此处为本机数据添加绘制代码
CPoint point;
GetCursorPos(&point);
m_strShow.Format("%d,%d", point.x, point.y);
if (m_bShow) {
	pDC->TextOut(100, 100, m_strShow);
}

8、在类向导中为CMousePosView类添加对消息WM_MOUSEMOVE(指示鼠标光标的移动)的消息响应函数。

void CMousePosView::OnMouseMove(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
        //发送重绘消息,调用OnDraw()函数重绘用户界面,即实现用户区鼠标位置的实时更新
	Invalidate(); 
        //将坐标由客户坐标转化为屏幕坐标
	ClientToScreen(&point); 
	m_strShow.Format("%d,%d", point.x, point.y);
        //获取状态栏指针
	CStatusBar* pStatusBar = (CStatusBar*)AfxGetMainWnd()->GetDescendantWindow(AFX_IDW_STATUS_BAR);
	//在状态栏显示鼠标位置
        pStatusBar->SetPaneText(1, m_strShow);
	CView::OnMouseMove(nFlags, point);
}

9、实现右键快捷菜单,在类向导中为CMainFrame类添加对消息WM_CONTEXTMENU的消息响应函数。(注:此消息指示用户右击窗口)

void CMainFrame::OnContextMenu(CWnd* pWnd, CPoint point)
{
	// TODO: 在此处添加消息处理程序代码
	CMenu *pSysMenu = GetMenu(); //获得程序菜单
        //GetSubMenu(2)获取菜单栏中的第三列
        //TrackPopupMenu函数用来弹出快捷菜单
	pSysMenu->GetSubMenu(2)->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, point.x, point.y, this);
}

10、切换到资源视图,打开Toobar中的IDR_MAINFRAME,新增一工具栏图标,将其ID设置为ID_VIEW_MOUSE(即与菜单栏中“鼠标位置”菜单一致),即可完成两者关联。

11、设置快捷键(加速键),切换到资源视图,打开Accelerator中的IDR_MAINFRAME,新增一行:

ID 修饰符 类型
ID_VIEW_MOUSE Ctrl 1 VIRTKEY

完成。

发帖时间: MFC 归档位置: