(1)创建一个单文档应用程序MousePos。在“视图”菜单下添加一个子菜单“鼠标位置”,ID为ID_VIEW_MOUSE,当选择该菜单命令后,鼠标当前的位置显示到用户区,同时该菜单项呈选中状态。再次选择该菜单命令,用户区不再显示当前鼠标位置,同时该菜单项的选中状态被去除。
(2)在工具栏上添加并设计一个工具按钮图标,使该按钮和ID_VIEW_MOUSE菜单命令联动,并添加一个快捷键Ctrl+1和该菜单命令联动。
(3)在窗口用户区中右击鼠标,弹出快捷菜单,显示主菜单“视图”中的菜单命令。结果如图:
解答:
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 |
完成。