如何创建与菜单相关联的工具栏?
1. 在资源编辑器编辑主菜单,增加相应的菜单项。如在菜单Draw下标题为Circle,id为ID_DRAW_CIRCLE的菜单项,并在属性对话框中的Prompt框中输入想要显示的文本,如Draw a Circle/nCircle。前面将在状态栏中显示,/n后面是工具提示。
2. 使用资源编辑器编辑更新应用程序的工具栏。展开Toolbar,打开IDR_MAINFRAME,双击最右边的空白按钮,增加新工具按钮,id设为ID_DRAW_CIRCLE。设计位图,画一个圆形作为工具栏图标。
3. 使用ClassWizard为视图添加相应的ID_DRAW_CIRCLE的消息处理函数。如void CMy14aView::OnDrawCircle()
如何在状态栏中显示相应的信息(例)?
1. 编辑StringTable,增加新的条目。如添加id为ID_INDICATOR_LEFT字符串值为Left的条目和id为ID_INDICATOR_RIGHT字符串值为Rightt的条目。
2. 编辑应用程序标记。View->Resource Symbols,添加新的状态栏标识符ID_MY_STATUS_BAR,并接受默认值。
3. 使用ClassWizard在类CMainFrame中添加View菜单命令处理程序。加入命令消息处理程序:
ID_VIEW_STATUS_BAR COMMAND OnViewStatusBar
ID_VIEW_STATUS_BAR UPDATE_COMMAND_UI OnUpdateViewstatusbar
4. 在MainFrm.h中手动添加函数原型:
Afx_msg void OnUpdateLeft(CCmdUI* pCmdUI);
Afx_msg void OnUpdateRight(CCmdUI* pCmdUI);
并使m_wndStatusBar为public。
5. 编辑MainFrm.cpp文件,的indicators数组:
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_SEPARATOR,
ID_INDICATOR_LEFT,
ID_INDICATOR_RIGHT,
// ID_INDICATOR_CAPS,
// ID_INDICATOR_NUM,
// ID_INDICATOR_SCRL,
};
修改OnCreate90函数的插入颜色标记的代码
if (!m_wndStatusBar.Create(this,
WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, ID_MY_STATUS_BAR) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar/n");
return -1; // fail to create
}
6. 在CMainFrame类添加消息映射入口
ON_UPDATE_COMMAND_UI(ID_INDICATOR_LEFT, OnUpdateLeft)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_RIGHT, OnUpdateRight)
同时,添加以下两个函数:
void CMainFrame::OnUpdateLeft(CCmdUI* pCmdUI)
{
pCmdUI->Enable(::GetKeyState(VK_LBUTTON) < 0);
}
void CMainFrame::OnUpdateRight(CCmdUI* pCmdUI)
{
pCmdUI->Enable(::GetKeyState(VK_RBUTTON) < 0);
}
编辑以下函数,添加颜色显示的代码:
void CMainFrame::OnViewStatusBar()
{
// TODO: Add your command handler code here
m_wndStatusBar.ShowWindow((m_wndStatusBar.GetStyle() & WS_VISIBLE) == 0);
RecalcLayout();
}
void CMainFrame::OnUpdateViewStatusBar(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck((m_wndStatusBar.GetStyle() & WS_VISIBLE) != 0);
}
7. 在视图类添加WM_MOUSEMOVE消息处理函数
void CMy14bView::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CString str;
CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
CStatusBar* pStatus = &pFrame->m_wndStatusBar;
if (pStatus)
{
str.Format("x = %d", point.x);
pStatus->SetPaneText(0, str);
str.Format("y = %d", point.y);
pStatus->SetPaneText(1, str);
}
CView::OnMouseMove(nFlags, point);
}
运行此程序,将在状态栏第一第二个消息行显示鼠标所在左边的x,y值;第三、第四个状态指示器将在鼠标左键、右键按下时显示Left或Rgiht。
如何在程序中添加重组菜单栏?
1. 创建MFC应用程序的时候,在第四步选上:Internet Explorer ReBars
2. 使用资源编辑器编辑Dialog标题下id为IDR_MAINFRAME的对话栏资源。添加组合框等各种元素。
3. 把对话栏与CMainFrame类相关联。双击对话栏的某一元素,启动ClassWizard,在Adding a Class对话框中选中Select an existing class,在弹出的对话框中选中CMainFrame。
4. 为对话栏编程。可应用如
CProgressCtrl* pProgress = (CProgressCtrl*)m_wndDlgBar.GetDlgItem(IDC_PROGRESS1);
来获得一个指向进度条控件的指针,并用这个指针调用相应的控件的函数进行编程。