实验5 菜单、工具栏和状态栏
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(2)添加代码,实现鼠标右键单击时显示弹出式菜单。在查看菜单项中选择建立类向导来添加右键单击弹出式菜单WM_CONTEXTMENU及消息处理函数,这时MFC会发现创建了一个新资源,将询问是否创建一个新类,取消后,弹出下图对话框,选择ID为CEx62View,Messages为WM_CONTEXTMENU,双击该消息或单击Add Function按钮,将为该消息添加默认处理函数,单击Edit Code按钮进入OnContextMenu()函数,对其进行编辑。 在相应的消息处理函数中添加代码如下:
CView::OnMouseMove(nFlags, point);
}
注:由于CEx63View类使用了CMainFrame类,因此,需要将类的定义包含进来,在CEx63View.cpp文件头部增加#include“MainFrm.h”。
由于在CEx63View类中访问了成员变量m_wndStatusBar,因此需要将成员变量m_wndStatusBar的受保护类型变为公有类型。
void CEx62View::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_POPMENU);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd());
实验5菜单、工具栏和状态栏
实验目的
1、掌握菜单的实现机制和创建过程
2、掌握普通下拉菜单和上下文菜单的创建
3、掌握工具栏的创建和消息处理过程
实验内容:
本节主要掌握菜单、工具栏的使用方法,内容包括菜单的创建和使用、工具栏的创建和使用。
例1.要求创建一个应用程序,实现在客户区绘制椭圆和矩形的功能。为应用程序添加一个“图形”菜单项,该菜单项包含两个子菜单“椭圆”和“矩形”。
{
pCmdUI->SetCheck(flag==0);
}
Void CE61View::OnUpdateRectangle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(flag==1);
}
例2.用上下文菜单实现例1的功能。创建上下文菜单的步骤如下:
(1)创建一个新菜单资源。用AppWizard创建一个基于MFC的SDI应用程序,工程名为ex62。在工作区的ResourceView选项卡中,右击Menu文件夹,在弹出菜单中选择插入菜单便可创建一个新的菜单资源,其ID为IDR_MENU1。右击IDR_MENU1,在弹出菜单中选择属性,修改其ID为IDR_POPMENU。双击IDR_POPMENU资源进入编辑对话框,对弹出式菜单进行编辑,方法见例1,完成后的菜单资源如图:
在CEx63View类中添加WM_ONMOUSEMOVE消息,在其消息处理函数OnMouseMove()中,更新窗格内容,代码如下:
void CEx63View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
}
void CEx61View::OnRectangle()//矩形画图
{flag=1;
// TODO: Add your command handler code here
Invalidate();
UpdateWindow();
CDC *pDC=GetDC();
pDC->Rectangle(100,100,200,200);
例3(状态栏)在状态上添加信息行,用来实时显示当前鼠标在视图中的位置,同时也添加一个状态指示器,用来显示当前是否按下了Ctrl键。
步骤如下:
第一步,C乘车基于AppWizard[exe]的单文档工程,名称为ex63。
第二步,添加新的窗格,在窗格中显示鼠标的位置,详细步骤如下:
(1)为新窗口创建一个ID标识号。
protected:
//{{AFX_MSG(CEx63View)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnUpdateKeyCtrl(CCmdUI* pCmdUI);
步骤:
(1)用AppWizard创建一个基于MFC的SDI应用程序,工程名为ex61。
(2)在ResourceView页面中,双击Menu文件夹,可以看到一个ID为ID_MAINFRAME的菜单,此菜单为应用程序的主菜单。双击ID_MAINFRAME菜单,进入菜单编辑器,在编辑框窗口中出现菜单栏。
(3)菜单项的添加:1)“图形”菜单项的添加。在ID_MAINFRAME菜单的最右端有一个空的菜单项,双击该菜单项弹出该菜单项的属性对话框,在该对话框中,选定弹出(pop-up),表示本菜单项中包含弹出子菜单,在标明(caption)编辑框中输入该菜单项的标题“图形”,使该菜单项下产生一个空的子菜单项。2)添加“椭圆”和“矩形”子菜单项。双击“图形”菜单项下的空子菜单,其属性对话框中各项为:
}
(3)为“椭圆”和“矩形”子菜单添加WM_COMMAND和UPDATE_COMMAND_UI消息映射,并编辑相应的消息处理函数;具体方法同例1。
修改例1,增加工具栏按钮的步骤如下:打开工程ex61,在ResourceView页面中,双击Toolbar文件夹,可以看到有一个ID位ID_MAINFRAME的工具栏。双击ID_MAINFRAME工具栏,在工具栏编辑框中出现如下图所示的工具栏。 在工具栏的最右边有一空白按钮,双击该按钮,弹出对话框如下图,其中ID选择ID_ELLIPSE,即“椭圆”按钮。该按钮显示在编辑窗口中,可以通过Graphics和Colors工具箱及鼠标画自己的图标。(矩形工具栏图标同椭圆方法)
int flag;
void CEx61View::OnEllipse()//椭圆画图
{flag=0;
// TODO: Add your command handler code here
Invalidate();
UpdateWindow();
CDC *pDC=GetDC();
pDC->Ellipse(100,100,200,200);
(4)增加“椭圆”和“矩形”的消息处理……1)利用ClassWizard为ID_ELLIPSE在CEx61View类中添加消息映射,如下图。双击COMMAND弹出对话框,要求在该对话框中输入消息处理函数的名称,选择默认函数名,确定后,双击消息处理函数OnEllipse进行编辑(矩形同样进行编辑,消息处理函数为OnRectangle),代码如下:
选择主菜单中的view下的Resource Symbols菜单项,弹出Resource Symbols对话框,它显示了用户应用程序中的所有资源符号。单击NEW按钮,在显示的New Symbols对话框中添加新的ID值ID_xy,去默认值:确定来自百度文库关闭对话框。
(2)定义新窗格的默认字符串。
为了表示一个窗格,ID必须和一个定义它的字符串相连。定义字符串,在Resource View页面下,打开String Table文件夹,双击String Table资源,在字符串编辑器中打开它。双击最后一个空白行,弹出下图对话框,在ID的下拉列表框中选择ID_xy,在Caption中键入“x=100,y=100”。
第5步,添加Ctrl键的消息函数。
为了在状态指示器中显示ctrl键的状态,可以在视图类中手工添加相应的消息响应函数。
(1)在ex63View.h中找到类的定义处,添加消息处理函数原型。
class CEx63View : public CView
{
………………
………………
// Generated message map functions
}
(5)给“椭圆”和“矩形”子菜单添加UPDATE_COMMAND_UI消息,并在消息处理函数中实现在选中的子菜单项前打钩。UPDATE_COMMAND_UI消息的添加和WM_COMMAND消息类似。在上图中,在Messages中选择UPDATE_COMMAND_UI即可。消息处理函数为:
Void CE61View::OnUpdateEllipse(CCmdUI* pCmdUI)
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
第4步,调用SetPaneText()函数更新窗格中的文字。
当鼠标移动时,坐标值发生变化,第一窗格内的文字随之相应变化。
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
选中一个以“ID_INDICATOR_”开头的字符串资源,在键盘上按下“Insert“键,插入一个新的字符串资源,将标识号(ID)设置为ID_INDICATOR_CTRL,内容(Caption)设置为“Ctrl键“。
(3)添加窗口的ID标识到状态栏的提示符数组中。
窗格在状态栏中的位置由状态栏的提示符数组决定。前面提到,在应用程序的MainFrame.cpp文件中定义了提示符数组,若在第一窗格显示“鼠标位置”,修改后的数组如下:
(1)声明一个CStatusBar类对象。
在头文件MainFrm.h中可以看到CStatusBar类对象的声明如下:
CStatusBar m_wndStatusBar;
(2)调用Create()函数创建状态栏。调用SetIndicators()函数,设置指示器的标识符为数组中相应元素指定的值,装载每个标识符指定的字符串资源并将字符串设为提示符文本。
CString str;
str.Format("x=%d,y=%d",point.x,point.y);
CMainFrame*pMainFrame=(CMainFrame*)(AfxGetApp()->GetMainWnd());
pMainFrame->m_wndStatusBar.SetPaneText(1,str);
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
在CMainFrame::OnCreate()函数中可以状看到态栏的创建代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_xy,
ID_INDICATOR_CTRL,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
第三步,创建状态栏。步骤如下:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
CView::OnMouseMove(nFlags, point);
}
注:由于CEx63View类使用了CMainFrame类,因此,需要将类的定义包含进来,在CEx63View.cpp文件头部增加#include“MainFrm.h”。
由于在CEx63View类中访问了成员变量m_wndStatusBar,因此需要将成员变量m_wndStatusBar的受保护类型变为公有类型。
void CEx62View::OnContextMenu(CWnd* pWnd, CPoint point)
{
// TODO: Add your message handler code here
CMenu menu;
menu.LoadMenu(IDR_POPMENU);
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON,point.x,point.y,AfxGetMainWnd());
实验5菜单、工具栏和状态栏
实验目的
1、掌握菜单的实现机制和创建过程
2、掌握普通下拉菜单和上下文菜单的创建
3、掌握工具栏的创建和消息处理过程
实验内容:
本节主要掌握菜单、工具栏的使用方法,内容包括菜单的创建和使用、工具栏的创建和使用。
例1.要求创建一个应用程序,实现在客户区绘制椭圆和矩形的功能。为应用程序添加一个“图形”菜单项,该菜单项包含两个子菜单“椭圆”和“矩形”。
{
pCmdUI->SetCheck(flag==0);
}
Void CE61View::OnUpdateRectangle(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(flag==1);
}
例2.用上下文菜单实现例1的功能。创建上下文菜单的步骤如下:
(1)创建一个新菜单资源。用AppWizard创建一个基于MFC的SDI应用程序,工程名为ex62。在工作区的ResourceView选项卡中,右击Menu文件夹,在弹出菜单中选择插入菜单便可创建一个新的菜单资源,其ID为IDR_MENU1。右击IDR_MENU1,在弹出菜单中选择属性,修改其ID为IDR_POPMENU。双击IDR_POPMENU资源进入编辑对话框,对弹出式菜单进行编辑,方法见例1,完成后的菜单资源如图:
在CEx63View类中添加WM_ONMOUSEMOVE消息,在其消息处理函数OnMouseMove()中,更新窗格内容,代码如下:
void CEx63View::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
}
void CEx61View::OnRectangle()//矩形画图
{flag=1;
// TODO: Add your command handler code here
Invalidate();
UpdateWindow();
CDC *pDC=GetDC();
pDC->Rectangle(100,100,200,200);
例3(状态栏)在状态上添加信息行,用来实时显示当前鼠标在视图中的位置,同时也添加一个状态指示器,用来显示当前是否按下了Ctrl键。
步骤如下:
第一步,C乘车基于AppWizard[exe]的单文档工程,名称为ex63。
第二步,添加新的窗格,在窗格中显示鼠标的位置,详细步骤如下:
(1)为新窗口创建一个ID标识号。
protected:
//{{AFX_MSG(CEx63View)
afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg void OnUpdateKeyCtrl(CCmdUI* pCmdUI);
步骤:
(1)用AppWizard创建一个基于MFC的SDI应用程序,工程名为ex61。
(2)在ResourceView页面中,双击Menu文件夹,可以看到一个ID为ID_MAINFRAME的菜单,此菜单为应用程序的主菜单。双击ID_MAINFRAME菜单,进入菜单编辑器,在编辑框窗口中出现菜单栏。
(3)菜单项的添加:1)“图形”菜单项的添加。在ID_MAINFRAME菜单的最右端有一个空的菜单项,双击该菜单项弹出该菜单项的属性对话框,在该对话框中,选定弹出(pop-up),表示本菜单项中包含弹出子菜单,在标明(caption)编辑框中输入该菜单项的标题“图形”,使该菜单项下产生一个空的子菜单项。2)添加“椭圆”和“矩形”子菜单项。双击“图形”菜单项下的空子菜单,其属性对话框中各项为:
}
(3)为“椭圆”和“矩形”子菜单添加WM_COMMAND和UPDATE_COMMAND_UI消息映射,并编辑相应的消息处理函数;具体方法同例1。
修改例1,增加工具栏按钮的步骤如下:打开工程ex61,在ResourceView页面中,双击Toolbar文件夹,可以看到有一个ID位ID_MAINFRAME的工具栏。双击ID_MAINFRAME工具栏,在工具栏编辑框中出现如下图所示的工具栏。 在工具栏的最右边有一空白按钮,双击该按钮,弹出对话框如下图,其中ID选择ID_ELLIPSE,即“椭圆”按钮。该按钮显示在编辑窗口中,可以通过Graphics和Colors工具箱及鼠标画自己的图标。(矩形工具栏图标同椭圆方法)
int flag;
void CEx61View::OnEllipse()//椭圆画图
{flag=0;
// TODO: Add your command handler code here
Invalidate();
UpdateWindow();
CDC *pDC=GetDC();
pDC->Ellipse(100,100,200,200);
(4)增加“椭圆”和“矩形”的消息处理……1)利用ClassWizard为ID_ELLIPSE在CEx61View类中添加消息映射,如下图。双击COMMAND弹出对话框,要求在该对话框中输入消息处理函数的名称,选择默认函数名,确定后,双击消息处理函数OnEllipse进行编辑(矩形同样进行编辑,消息处理函数为OnRectangle),代码如下:
选择主菜单中的view下的Resource Symbols菜单项,弹出Resource Symbols对话框,它显示了用户应用程序中的所有资源符号。单击NEW按钮,在显示的New Symbols对话框中添加新的ID值ID_xy,去默认值:确定来自百度文库关闭对话框。
(2)定义新窗格的默认字符串。
为了表示一个窗格,ID必须和一个定义它的字符串相连。定义字符串,在Resource View页面下,打开String Table文件夹,双击String Table资源,在字符串编辑器中打开它。双击最后一个空白行,弹出下图对话框,在ID的下拉列表框中选择ID_xy,在Caption中键入“x=100,y=100”。
第5步,添加Ctrl键的消息函数。
为了在状态指示器中显示ctrl键的状态,可以在视图类中手工添加相应的消息响应函数。
(1)在ex63View.h中找到类的定义处,添加消息处理函数原型。
class CEx63View : public CView
{
………………
………………
// Generated message map functions
}
(5)给“椭圆”和“矩形”子菜单添加UPDATE_COMMAND_UI消息,并在消息处理函数中实现在选中的子菜单项前打钩。UPDATE_COMMAND_UI消息的添加和WM_COMMAND消息类似。在上图中,在Messages中选择UPDATE_COMMAND_UI即可。消息处理函数为:
Void CE61View::OnUpdateEllipse(CCmdUI* pCmdUI)
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
第4步,调用SetPaneText()函数更新窗格中的文字。
当鼠标移动时,坐标值发生变化,第一窗格内的文字随之相应变化。
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
选中一个以“ID_INDICATOR_”开头的字符串资源,在键盘上按下“Insert“键,插入一个新的字符串资源,将标识号(ID)设置为ID_INDICATOR_CTRL,内容(Caption)设置为“Ctrl键“。
(3)添加窗口的ID标识到状态栏的提示符数组中。
窗格在状态栏中的位置由状态栏的提示符数组决定。前面提到,在应用程序的MainFrame.cpp文件中定义了提示符数组,若在第一窗格显示“鼠标位置”,修改后的数组如下:
(1)声明一个CStatusBar类对象。
在头文件MainFrm.h中可以看到CStatusBar类对象的声明如下:
CStatusBar m_wndStatusBar;
(2)调用Create()函数创建状态栏。调用SetIndicators()函数,设置指示器的标识符为数组中相应元素指定的值,装载每个标识符指定的字符串资源并将字符串设为提示符文本。
CString str;
str.Format("x=%d,y=%d",point.x,point.y);
CMainFrame*pMainFrame=(CMainFrame*)(AfxGetApp()->GetMainWnd());
pMainFrame->m_wndStatusBar.SetPaneText(1,str);
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
在CMainFrame::OnCreate()函数中可以状看到态栏的创建代码如下:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_xy,
ID_INDICATOR_CTRL,
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
第三步,创建状态栏。步骤如下:
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))