第2章菜单、工具栏和状态栏的设计
例2.2 在顶层菜单栏里建立一个菜单项,并在其下面建立带有子菜单的菜单项,使有的子菜单具有加速键、变灰和核对符,又使每个子菜单都能显示信息。步骤如下:(1)建一个单文档的应用程序(或用例2.1程序),名为:山东旅游
(2)建立菜单:
1)ResourceView→Menu→IDR_MAINFRAME→右面出现菜单编辑器→左键选中顶层最后的空白菜单不放,将其拖到“帮助”的前面,松开鼠标(或选中“帮助”菜单,按Insert键)。双击这个空白菜单,出现“菜单属性对话框”,在Caption处写:山东旅游(&S)→ Pop_up 处于选中状态(屏蔽ID)→退出。
2)双击下面出现的空白菜单,出现“菜单属性对话框”,选中Pop_up(屏蔽ID)→Capton 处写:烟台(&Y)
3)右边出现空白子菜单,双击它,出现“菜单属性对话框”→ID处写:ID_SD_YT_PL→Capton处写:蓬莱Ctrl +F5 (注:Ctrl +F5是加速键标识)→注释栏prompt 处写:蓬莱仙境
4)双击“蓬莱”下面的子菜单,双击它,出现“菜单属性对话框”→ID处写:ID_SD_YT_NS→Capton处写:南山(&N)→prompt处写:南山大佛
5)双击“烟台”下面的空白菜单, 出现“菜单属性对话框”→选中Pop up(屏蔽ID)→Capton 处写:青岛(&Q)
6)右边出现空白子菜单,双击它,出现“菜单属性对话框”→ID处写:ID_SD_QD_LS→Capton处写:崂山Ctrl +F6→prompt处写:崂山道士
表2. 1 菜单General属性对话框的各项含义
项目含义
ID 菜单的资源ID标识符
Caption(标题)用于标识菜单项显示文本,助记符字母前面须有一个&符号,这个字
母与Alt构成组合键
Separator(分隔符)选中时,菜单项是一个分隔符或一条水平线
Checked(选中的)选中时,菜单项文本前显示一个选中标记
Pop_up(弹出)选中时,菜单项含有一个弹出式子菜单
Grayed(变灰)选中时,菜单项显示是灰色的,用户不能选用
Inactive(非激活)选中时,菜单项没有被激活,用户不能选用
Help(帮助)选中时,菜单项在程序运行时被放在顶层菜单的最右端
Break(暂停)当为Column时,对于顶层菜单项来说,被放置在另外一行上,而
对于弹出式子菜单的菜单项来说,则被放置在另外一列上,当为Bar
时,与Column相同,只不过对于弹出式子菜单来说,它还在新列
与原来的列之间增加一条竖直线,注意:这些效果只能在程序运行
后才能看到。
Prompt(提示)用于指明光标移至该菜单项时,在状态栏上显示的提示信息
7)双击“青岛”下面的空白菜单, 出现“菜单属性对话框”→选中Pop up(屏蔽ID)→Capton 处写:泰安(&T)
8)右边出现空白子菜单,双击它,出现“菜单属性对话框”→ID处写:ID_SD_TA_TS→Capton处写:泰山Ctrl +F7→prompt处写:泰山日出
9)双击“泰安”下面的空白菜单,出现“菜单属性对话框”→选中Pop up(屏蔽ID)→Capton 处写:济南(&J)
10)右边出现空白子菜单,双击它,出现“菜单属性对话框”→ ID处写:ID_SD_JN_BTQ →Capton处写:趵突泉Ctrl +F8→prompt处写:天下第一泉
图2.1.3 加速键资源列表
(3)填加加速键表:
1)单击项目工作区的资源界面ResourceView→打开Accelerator→双击IDR_MAINFRAME→出现加速键表,双击最下面的空白格,见图2.1.3所示→出现加速键属性对话框Accl Properties →ID处下拉找到ID_SD_YT_PL置好→key处下拉,找到VK_F5置好(或置好ID后,单击[Next Key Typed],出现一个小对话框后,再按下Ctrl+F5键也可)见图2.1.4所示,这样就为“蓬莱”菜单置好了加速键。“加速键General属性”对话框的各项含义如表2.2所示。
图2.1.4 “Accel Properties”(加速键属性)对话框
2)你再双击最下面的空白格,按上步的方法,分别将青岛崂山(ID_SD_QD_LS)、泰安泰山(ID_SD_TA_TS),济南趵突泉(ID_SD_JN_BTQ)菜单分别置好VK_F6 ,VK_F7,VK_F8的加速键。
注意:图2.1.4中Modifiers处,选中Ctrl,说明是Ctrl键,选中Alt说明是Alt键,选中Shift说明是Shift键,小对话框“Press a key to be ysed as the accelerator”是单击“Next Key Typed”弹出来的。
表2. 2 “加速键General属性”对话框的各项含义
项目含义
ID 指定资源ID号的列表项,为了能和菜单联用,通常选择某菜单项的ID号Modifiers 用于确定Ctrl、Alt、Shift是否是构成加速键的组成部分
Type 用于确定该加速键的值是虚拟键(VirKey),还是ASCII
Key 是指启动加速键的键盘按键
下一键(Next Key Type) 单击此按钮后,用户操作的任何按键将成为此加速键的键值。
(4)使菜单变灰(不被激活,不起作用)
View→ClassWizard→Classname选CMyView→在Object IDS里找到你想要变灰的菜单,这里选中ID_SD_TA_TS(泰山)→右边Messages里选中UPDATE COMMAND UI(命令属性)→AddFoution →OK→Edit Code→在该函数里写:
void CMyView::OnSdTaTs()
{ pCmdUI->Enable(false); }
说明:
pCmdUI是CCmdUI类的指针对象。CCmdUI类只是被用在一个CCmdTarget派生类中的ON_UPDATE_COMMAND_UI处理程序中。当用户拉出一个菜单时,每个菜单项都需要知道它应该被显示为可用还是禁用。当菜单被拉出时,(框架)会寻找并调用各个ON_UPDATE_COMMAND_UI 处理程序,每个处理程序都调用CCmdUI类中像Enable和Check这样的成员函数,然后框架将(按照其合适的方式)显示各个菜单项。
(5)核对菜单项,使这个菜单名字的前面加个“√”号
View→ClassWizard→Classname选CMyView→在Object IDS里找到你想要核对的菜单,这里选中ID_SD_YD_NS(南山)→右边Messages里选中UPDATE COMMAND UI→AddFoution→OK→Edit Code→在该函数里写:
void CMyView::OnUpdateSdYtNs(CCmdUI* pCmdUI)
{ pCmdUI->Enable(true);//这里如果是Enable(false)则该菜单变灰
pCmdUI->SetCheck(1);//设置核对符,如果括弧里写0是删除核对符
}
(6)菜单命令响应
1)在View.h里的public:下定义变量:CString str;
在View.cpp的构造函数里将变量值赋空:str=“ ”;
2)将烟台的子菜单“蓬莱”的ID标识符ID_SD_YT_PL映射到视图类View里:
View→ClassWizard→在LassName置View(视图类)→在ObjectIDs里找到ID_SD_YT_PL→选中COMMAND→Add Function→Edit Code→加代码:
void CMyView::OnSdYtPl()
{ str=“蓬莱仙境”;
Invalidate();
}
3)将烟台的子菜单“南山”的ID_SD_YT_NS映射到视图类View里,并加代码:
void CMyView::OnSdYtNs()
{ str=“南山大佛”;
Invalidate();
}
4)分别将青岛的子菜单“崂山”ID_SD_QD_LS、泰安的子菜单“泰山”ID_SD_TA_TS、济南的子菜单“趵突泉”ID_SD_JN_BTQ映射到视图类中,并加代码:
void CMyView::OnSdQdLs() //青岛崂山
{ str=“崂山道士”;
Invalidate();
}
void CMyView::OnSdTaTs() //泰安泰山
{ str=“泰山日出”;
Invalidate();
}
void CMyView::OnSdJnBtq()//济南趵突泉
{ str="天下第一泉";
Invalidate();
}
5)在视图类实现文件CMyView.cpp的OnDraw()函数里加代码:
void CMyView::OnDraw(CDC* pDC)
{ CMyDoc* pDoc = GetDocument();
ASSERT_V ALID(pDoc);
pDC->TextOut(50,50,str);
}
(7)编译运行,,结果见图2.1所示
1)打开山东旅游菜单 烟台,见菜单“南山”前面有“√”号
2)打开山东旅游菜单,分别点“蓬莱”、“南山”、“崂山”、“趵突泉”便出现各自的信息。而“泰山”是灰色的,不能显示信息。
3)程序运行后,出项空白窗口,你按Ctrl+F5、Ctrl+F6、Ctrl+F8分别在窗口中显示“蓬莱仙境”,“崂山道士”,“天下第一泉”。Ctrl+F7变灰不能显示信息。
4)打开山东旅游菜单,按相应的助机记符(烟台)Y、(青岛)Q、(泰山)T、(济南)J键,便出现各自的子菜单,将鼠标放在子菜单“南山”上,按助记符N,便在文档窗口上显示出:南山大佛。
说明:
void Invalidate( BOOL bErase = TRUE ); 该函数的作用是使整个窗口客户区无效。窗口的客户区无效意味着需要重绘,例如,如果一个被其它窗口遮住的窗口变成了前台窗口,那么原来被遮住的部分就是无效的,需要重绘。这时Windows会在应用程序的消息队列中放置WM_PA INT消息。MFC为窗口类提供了WM_PAINT的消息处理函数OnPaint,OnPaint负责重绘窗口。
视图类有一些例外,在视图类的OnPaint函数中调用了OnDraw函数,实际的重绘工作由O nDraw来完成。参数bErase为TRUE时,重绘区域内的背景将被擦除,否则,背景将保持不变。
它和UpdateWindow( )区别在于:
UpdateWindow( )的作用是使窗口立即重绘。调用Invalidate等函数后窗口不会立即重绘,这是由于WM_PAINT消息的优先级很低,它需要等消息队列中的其它消息发送完后才能被处理。调用UpdateWindow函数可使WM_PAINT被直接发送到目标窗口,从而导致窗口立即重绘。
2.1.2 菜单的编程控制
在交互式软件设计中,菜单有时会随着用户操作的改变而改变,这时的菜单就需要在程序中进行控制。MFC提供的菜单类CMenu可在程序运行时,处理有关菜单的操作,如:创建菜单、装入菜单、删除菜单、获取菜单或设置菜单的状态等。下面给出了CMenu 类的常用成员函数。
1、创建菜单:
CMenu类的CreateMenu()和CreatePopupMenu()函数分别用于创建一个菜单或子菜单框架,它们的原型是:
BOOL CreateMenu(); 产生一个空菜单
BOOL CreatePopupMenu();产生一个空的弹出式子菜单
2、装入菜单
将菜单从资源装入应用程序中,需要调用Cmenu类成员函数LoadMenu或者用SetMenu对应用程序菜单进行重新设置。
BOOL LoadMenu(LPCTSTR lpszResourceName);
BOOL LoadMenu(UINT nIDResource);
参数:
lpszResourceName:菜单资源名称
nIDResource:菜单资源ID标识号
3、添加菜单项
当菜单创建后,用户可以调用AppendMenu或InsertMenu函数来添加一些菜单项。但每次添加时,AppendMenu是将菜单项添加在菜单的末尾处,而InsertMenu在菜单的指定位置处插入菜单项,并将后面的菜单项依次下移。
BOOL AppendMenu(UINT nFlags,UINT nIDNewItem=0,
LPCTSTR lpszNewItem=NULL); BOOL AppendMenu(UINT nFlags,UINT nIDNewItem,const CBitmap *pBmp);
BOOL InSertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem=0,
LPCTSTR lpszNewItem=NULL); BOOL InSertMenu(UINT nPosition,UINT nFlags,UINT nIDNewItem,
const CBitmap *pBmp);
参数:
nIDNewItem 表示新菜单项的资源ID号
lpszNewItem表示新菜单项的内容
pBmp 用于菜单项的位图指针
nPosition 表示新菜单项要插入的菜单项位置
nFlags表示要增加的新菜单项的状态信息,其含义见表2.3所示。
表2.3 nFlags的值及其对其他参数的影响
nFlage值含义nPosition值nIDNewItem值lpszNewItem MF_BYCOMMAND 菜单项以ID标识符来标识菜单项资源ID
MF_BYPOSITION 菜单项以位置来标识菜单项的位置
MF_POPUP 菜单项有弹出式子菜单弹出式菜单句柄
MF_SEPARATOR 分割线忽略忽略
MF_OWNERDRAW 自画菜单项自画所需的数据MF_STRING 字符串标志字符串指针MF_CHECKED 设置菜单项的选中标记
MF_UNCHECKED 取消菜单项的选中标记
MF_DISABLED 禁用菜单项
MF_ENABLED 允许使用菜单项
MF_GRAYED 菜单项灰显
注意:
(1)当nFlags为MF_BYPOSITION时,nPosition表示新菜单项要插入的具体位置,为0时表示第1个菜单项,为-1时,将菜单项添加至菜单的末尾处。
(2)在nFlags的标志中,可以用”|”(按位或)来组合,例如MF_CHECKED|MF_STRING等。但有些组合是不允许的,例如MF_DISABLED、MF_ENABLED和MF_GRAYED,MF_STRING、MF_OWNERDRAW、MF_SEPARATOR和位图,MF_CHECKED和MF_UNCHECKED都不能组合在一起。
(3)当菜单项增加、改变或删除后,不管菜单依附的窗口是否改变,都应调用CWnd::DrawMenuBar 来更新菜单。
4、删除菜单项
调用DeleteMenu函数可将指定的菜单项删除。函数DeleteMenu的原型如下:
BOOL DeleteMenu(UINT nPosition,UINT nFlags);
参数:
nPosition表示要删除的菜单项位置,它由nFlags进行说明。
当:Flags为MF_BYCOMMAND时,nPosition表示菜单项的ID标识符。
当:Flags为MF_BYPOSITION时,nPosition表示菜单项的位置(第一个菜单项为0)
5、获取菜单项
以下三个CMenu成员函数分别获得菜单的项数、菜单项的ID标识符以及弹出式子菜单的句柄。
UINT GetMenuItemCount()const;获得菜单项的项数,调用失败返回-1。
UINT GetMenuItemID(int nPos)const;获得由nPos指定菜单项位置(以0为基数)的菜单项的标
识号,若nPos是SEPARATOR(分隔符)则返回-1。
CMenu *GetSubMenu(int nPos)const;获得指定菜单的弹出式菜单的菜单句柄,该弹出式菜单位置由参数nPos指定,开始位置为0,若选单不存在,则创建一个临时菜单指针。
例2.3 用编写程序的方法添加并处理一个新的菜单项
(1)创建一个单文档(SDI)应用程序(或用例2.2程序),名为:添加菜单项
(2)View→ResourceSymbols弹出图2.1.5的对话框。
(3)单击“New”按钮,弹出“New Symbol”对话框→New→在名字(Name)框中输入一个新的标识符ID_NEW_MENUITEM。在值(Value)框中,输入该ID的值, 如图2.1.6所示。系统要求用户定义的ID值应大于15(0X000F)而小于61440(0XF000)。这里保留默认的ID值101,单击“OK”按钮。
图2.1.5 “资源符号”对话框图2.1.6“New Symbol”对话框
(4)关闭“资源符号”对话框,在CMainFrame::OnCreate函数中添加下列代码,该函
数在框架窗口创建时自动调用。
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{ ……
CMenu *pSysMenu=GetMenu();//获得主菜单句柄指针
CMenu *pSubMenu=pSysMenu->GetSubMenu(1);//获得第二个子菜单指针
CString StrMenuItem(“新的菜单项”);//字符串对象
pSubMenu->AppendMenu(MF_SEPARATOR);//增加一水平分割线(见表2.3)
//在子菜单末尾增加一菜单项,允许使用ON_UPDA TE_COMMAND_UI或ON_COMMAND的菜单//项下面MF_STRING是字符串标志,ID_NEW_MENUITEM是新的菜单标识符,StrMenuItem是新菜单//项内容
pSubMenu->AppendMenu(MF_STRING,ID_NEW_MENUITEM,StrMenuItem);
m_bAutoMenuEnable=FALSE;//关闭系统自动更新菜单状态,见下面说明3
pSysMenu->EnableMenuItem(ID_NEW_MENUITEM,MF_BYCOMMAND|
MF_ENABLED);//激活菜单项DrawMenuBar();//更新菜单
return 0;
}
(5)编译运行,程序添加的菜单如图2.1.7,但此时只是将菜单项加上了,命令却无反映。
(6)使用ClassWizard在CMainFrame主框架类中添加OnCommand消息函数的重载,并检测用户菜单的nID参数: View->ClassWizard->在Class name处下拉置CMainFrame ->Messages处找到OnCommand消息,将其映射到CMainFrame里并添代码:
BOOL CMainFrame::OnCommand(WPARAM wParam,LPARAM lParam)
{ //参数wParam的低字节表示菜单、控件、加速键的命令ID
if(LOWORD(wParam)==ID_NEW_MENUITEM)
MessageBox(“你选中了新的选单项”);
}
(7)编译运行并测试。点击菜单项的编辑->新的选单项;弹出图2.1.8对话框,显示“你选中了新的选单项”
说明:
1、WPARAM wParam,LPARAM lParam参数,见第1章例20的说明。
2、LOWORD是获取其参数中的整型值位数。
下面是用C++语言编写的程序,可以看到LOWORD是取wParam参数的右边的4位数,即菜单的ID值(是用资源符号建菜单的Value框中写的101)。
#include
// #include
#include
int main()
{ int iInWord = 101;
cout< cout< cout< WORD usOutWord = LOWORD(iInWord); cout< cout< cout< return 0; } 结果:iInWord 是65 (16进制),145(8进制),101(10进制) usOutWord是65 (16进制),145(8进制),101(10进制)。 3、资源符号:能对应用程序中的资源标识符进行管理。由于程序中要添加的菜单项需要一个标识值,最好用一个标识符来代替这个值,因此这里通过“资源符号”对话框来创建一个新的标识符。 4、m_bAutoMenuEnable:当此成员是可用的(缺省),用户下拉一个菜单时,没有ON_COMMAND 或ON_UPDATE_COMMAND_UI处理程序的菜单项目将被自动设置为无效。具有ON_COMMAND 处理程序而无ON_UPDA TE_COMMAND_UI处理程序的菜单项目将被自动设置为可用。当数据成员被设置时,菜单条与工具条按钮一样的方式被可用。此数据成员简化了基于当前选择的最优命令的实现,并减少为可用与无效菜单项目编写ON_UPDATE_COMMAND_UI处理程序的应用需求。 2.1.3 使用快捷菜单 快捷菜单是一种浮动弹出式菜单,它是一种新的用户界面设计风格,当用户按下鼠标右键时,就会相应地弹出一个浮动菜单,其中提供了几个与当前选择内容相关的选项。用资源编辑器和MFC库的CMenu::TrackPopupMenu()函数可以很容易地创建这样的菜单,其原形为: BOOL TrackPopupMenu(UINT nFlags,int x,int y,CWnd *pWnd,LPCRECT lpRect=NULL); 该函数用于显示一个浮动的弹出式菜单,其位置由各参数决定。 参数: nFlags:表示菜单在屏幕显示的位置以及鼠标按钮标志,见表2.4。 x,y:表示菜单的水平坐标和菜单的顶端的垂直坐标。 pWnd:表示弹出菜单的窗口,此窗口将收到菜单的全部WM_COMMAND消息。 lpRect:是一个RECT结构或CRect对象指针,它表示一个矩形区域,用户单击这个区域时,弹出菜单不消失。当lpRect为NULL时,若用户在菜单外面单击,菜单立刻消失。 表2.4 nFlags的值及其对其它参数的影响 nFlags 含义 TPM_CENTERALIGN 屏幕位置标志,表示菜单的水平中心位置由x坐标确定 TPM_LEFTALIGN 屏幕位置标志,表示菜单的左边位置由x坐标确定 TPM_RIGHTALIGN 屏幕位置标志,表示菜单的右边位置有x坐标确定 TPM_LEFTBUTTON 屏幕位置标志,表示当用户单击鼠标左键时弹出菜单 TPM_RIGHTBUTTON 屏幕位置标志,表示当用户单击鼠标右键时弹出菜单 例2.4 使用快捷菜单(截取”文件(F)”下拉的菜单项,以快捷方式弹出) (1)建一个单文档的应用程序,名为:快捷菜单 (2)用MFC ClassWizard在视图CMyView类添加WM_CONTEXTMENU消息映射,并加代码: void CMyView::OnContextMenu(CWnd* pWnd, CPoint point) { //获得主窗口指针 CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; CMenu *pSysMenu=pFrame->GetMenu(); //获得程序窗口菜单指针 int nCount=pSysMenu->GetMenuItemCount();//获得顶层菜单个数 int nSubMenuPos=-1; //给特征变量送个标记,下面要用 for(int i=0;i { CString str; // 将指定菜单项的标签拷贝到指定的缓冲区。如设置的是MF_BYPOSITION(见表2.3),这个参 // 数就代表菜单条目在菜单中的位置(第一个菜单条目的位置为零) pSysMenu->GetMenuString(i,str,MF_BYPOSITION); if(str.Left(4)=="文件") { nSubMenuPos=i; //将菜单的条目号送给特征变量 break; } } if(nSubMenuPos<0) return; //没有找到返回 pSysMenu->GetSubMenu(nSubMenuPos) //获得“文件”下面的子菜单 ->TrackPopupMenu(TPM_LEFTALIGN|TPM_RIGHTBUTTON, //见表2.4 point.x,point.y,this);// 在屏幕的任意地方显示一个弹出式菜单。 } (3)在视图的执行文件“快捷菜单View.cpp”文件头部加:#include “MainFrm.h” (4)编译运行,在应用程序窗口的客户区中,用鼠标单击右键,会弹出快捷菜单(将原File下拉的菜单弹出来),见图2.1.9所示。 说明: 1、WM_CONTEXTMENU鼠标右键按下时发送的消息 2、GetMenuString(i,str,MF_BYPOSITION); 将指定菜单项的标签拷贝到指定的缓冲区。 如果其最后的参数为MF_BYCOMMAND,则 其他参数指定菜单项标识符。如果其最后的参 数为MF_BYPOSITION,则其他参数指定菜单 项位置。如果其最后的参数为: MF_BYPOSITION,这个参数就代表菜单条目 在菜单中的位置(第一个菜单条目的位置为零)。图2.1.9 例2.4快捷菜单显示结果 3、AfxGetApp ()函数:是获取应用程序实例指针 GetMainWnd()函数:是获取主窗口对象指针。这两个函数可以合成一个: afxgetmainwnd(); 我们通常把一些重要的工程一开始就需要初始化的并且在其它地方类中都要用到的变量或函数定义在C***App类中,然后通过此函数获得这些变量或函数。 由于菜单、工具栏、状态栏是由主框架类CMainFrame来控制的,虽在视图类可以添加快捷菜单消息映射,但若要在视图类中访问应用程序的主框架窗口的系统菜单,则必须通过AfxGetApp来获取主框架类对象指针后才能获取相应的菜单。AfxGetApp是CWinApp类的一个成员函数,该函数可在应用程序项目中的任何类中使用,用于获取应用程序中的CWinApp类对象指针。 例2.5 使用快捷菜单(以快捷方式弹出自己设计的菜单项) (1)创建一个单文档应用程序,名为:建立快捷菜单。 (2)Insert→Resource→点中Menu→New→便在Menu资源下出现一个新菜单资源(默认的ID号为IDR_MENU1),将此ID号改为:IDR_MYFLOATMENU (3)双击右边出现的空白菜单项,出现Menu Item Properties对话框,在对话框中选中Pop up,在Caption处写:弹出快捷菜单->关闭→点开下面的子菜单,依次添加如下表所示的子菜单项: 菜单ID 标题属性 ID_MENU_SCOREIN 成绩输入(&S) 默认 ID_MENU_SCOREPRINT 成绩打印(&P) 默认 ID_SEPARATRO 选中Separator ----- 其他(&Q) 选中Pop_up,其余默认 (4)将ID_MENU_SCOREIN的COMMAND消息映射到主框架类MainFrame中(如果要出现提问对话框,选择Select a new class,出现Select Class对话框,选择对话框上的CMainFrame→Select,回到MFC ClassWizard,接着加如上ID的COMMAND消息)。 View→ClassWizard→ClassName→CMainFrame→将上面的ID分别加COMMAND消息。这里我们仅加ID_MENU_SCOREIN的COMMAND消息,并加如下代码: void CMainFrame::OnMenuScorein() { AfxMessageBox(“现在就输入成绩吗?”);} (5)在CMainFrame类加入WM_CONTEXTMENU消息处理函数,添加代码: void CMainFrame::OnContextMenu(CWnd *pWnd,CPoint point) { CMenu menu; menu.LoadMenu(IDR_MYFLOATMENU);//刚才加上的菜单资源 menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN| TPM_RIGHTBUTTON,point.x,point.y,this); } (6)运行并测试,在出现的应用程序窗口中,单击鼠标右键,会出现你创建的快捷菜单,如图2.1.10所示。再单击“成绩输入”,会出现写有“现在就输入成绩吗?”的对话框。 2.2 工具栏 工具栏是一系列工具按钮的组合,借助它 们可以提高用户的工作效率。Visual C++6.0系 统保存了每个工具栏相应的位图,其中包括所有 按钮的图象,而所有的按钮图象具有相同的尺 寸(15像素高,16像素宽),它们在位图中的排 列次序与屏幕上的按钮在工具栏上的次序相同。 图2.1.10 例2.5快捷菜单显示结果2.2.1使用工具栏编辑器 在项目工作区窗口中选择ResourceView页面,双击“Toolbar”项目中的IDR_MAINFRAME,则工具栏编辑器出现在主界面的右边,如图2.2.1所示。 图2.2.1 工具栏编辑器 例2.6 工具栏按钮和菜单联用 (1)创建一个SDI 单文档应用程序,名为:工具栏 (2)ResourceView →Toobar →IDR_MAINFRAME 工具栏编辑器出现在主界面的右边 →单击最后一个空的工具栏按钮(建完该工具栏按钮后,其后面又会自动出现一个新的空工具栏按钮)→点颜色工具箱的红色,再点图形工具箱的画刷→之后将鼠标移到下面较大的方块图上,来回移动鼠标将这个按钮涂红色后,见图2.2.1所示→再双击上面这个按钮,出现属性对话框,见图2.2.2所示,ID 处写:ID_TOOLBAR →在prompt (注释)框内键入:建立新文档\n 新建 (3)将ID_TOOLBAR 映射到View 视图类中,并加代码: void CMainFrame::OnToolbar() { MessageBox(“工具栏显示”); } (4)编译运行鼠标放在刚创建的工具 拦上出现“新建”框,而一会儿便消失。 在状态拦上出现“建立新文档”字样。再 单击这个按钮,在文档窗口出现小对话 框,上面写的是“工具栏显示”。 图2.2.2 “工具栏按钮属性”对话框 (5)建一个菜单项ResourceView → Menu →双击IDR_MAINFRAME →双击右边出现空白菜单→标题处写:和工具栏联用→ID 处写(和工具栏的ID 一样):ID_TOOLBAR →运行→点这个菜单和点刚才创建的工具栏的显示结果是一样的(这就是工具栏和菜单相结合)。鼠标点中这个菜单不放,状态栏出现“建立新文档”,放开鼠标,状态栏的“建立新文档”没了,但在文档窗口出现一个小对话框,和点刚才建的工具栏按钮一样,上面也写着“工具栏显示”。 说 明: 1、移动一个工具栏按钮:用鼠标左键单击这个按钮不放,拖动至相应位置即可。 2、删除一个工具栏按钮:用鼠标左键单击这个按钮不放,拖动它离开工具栏。 3、复制一个工具栏按钮:若在移动一个按钮的同时,按下Ctrl 键,则在新位置复制一个按钮。 4、在工具栏中插入空格有以下几种情况: 工具栏空按钮 图形工具箱 颜色工具箱 (1)如果工具栏按钮前没有空格,拖动该按钮向右移动并当覆盖相邻按钮的一半以上时,释放鼠标,则此按钮前出现空格。 (2)如果工具栏按钮前有空格而按钮后没空格:拖动该按钮向左移动并当按钮的左边界接触到前面按钮时,释放鼠标键,则此按钮后出现空格。 (3)如果工具栏按钮前后均有空格,拖动该按钮向右移动并当接触到相邻按钮时,则此按钮前的空格保留,按钮后的空格消失。相反,拖动该按钮向左移动并当接触到前一个相邻按钮时,则此按钮前面的空格消失,后面的空格保留。 5、工具栏按钮属性的设置:双击某按钮弹出“工具栏属性”对话框,如图2.2.2所示。工具栏按钮属性对话框中的各项含义如表2.5所示。 2.2.2 多个工具栏的使用 实际应用中,常常需要多个工具栏,下面来讨论多个工具栏的创建、显示和隐藏,以及多个工具栏和菜单之间的联动操作等。 例2.7 使用多个工具栏 1、添加并更改应用程序菜单 (1)创建一个单文档应用程序,名为:多个工具栏 表2.5 工具栏按钮属性对话框中的各项含义 项目含义 ID 工具栏按钮的标识符,可以输入自己的标识符名称,也可从ID的下 拉列表中选取标识符名称 Width(宽) 工具栏按钮的像素宽度 Height(高) 工具栏按钮的像素高度 Prompt(提示) 工具栏按钮提示文本:若为“建立新文档\n新建”,则表示将鼠标指 向该按钮时,在状态栏中显示“建立新文档”,而在弹出的提示信息 中出现“新建”字样。”\n”是它们的分割转义符。 (2)Insert→Resource→在资源类型中选中Menu(或按快捷键Ctrl+R)→单击“New”按钮,便在右边出现一个空菜单,系统给的默认ID为IDR_MENU1见图2.2.3所示。(3)在Menu资源的ID_MENU1上单击鼠标右键,从弹出的快捷菜单中选择“Properties”命令,出现如图2.2.4所示的“菜单属性对话框”,在这里可以重新指定菜单资源ID,设置菜单资源的语言和条件。这个条件用于决定菜单资源包含到哪个环境中,例如当指定条件为_DEBUG,则菜单资源只存于Debug编译环境中。 图2.2.3 添加菜单资源后开发环境 图2.2.4 “菜单属性”对话框 (4)为菜单ID_MENU1添加一个顶层弹出菜单项:测试(&T ),并在该菜单下添加一个子菜单:返回(&R),ID 设为ID_TEST_RETURN ,如图2.2.5所示。注意:“测试(&T )”中的符号 “&” 用于指定后面的字符(T )是一个助记符。 (5)打开此程序的菜单资源Menu ,双击IDR_MAINFRAME ,在“查看”菜单的最后添加一个子菜单项:显示测试菜单(&M),将ID 设为:ID_VIEW_TEST ,见图2.2.6所示。 (6)在CMainFrame 类头文件MainFrm.h 中的public 下添加成员变量: CMenu m_NewMenu; (7)View →ClassWizard (或按快捷键Ctrl+W )→切换到Message Maps 页面,从“Classname”列表中选CMainFrame ,分别为菜单项ID_VIEW_TEST 和ID_TEST_RETURN 添加COMMAND 消息映射,使用默认的消息映射函数名,并加代码: void CMainFrame::OnViewTest() { m_NewMenu.Detach(); //使菜单对象和菜单句柄分离. m_NewMenu.LoadMenu(IDR_MENU1); //将菜单从资源装入应用程序中 SetMenu(NULL); //清除应用程序菜单 SetMenu(&m_NewMenu); //设置应用程序菜单 } void CMainFrame::OnTestReturn() { m_NewMenu.Detach(); //使菜单对象和菜单句柄分离 m_NewMenu.LoadMenu(IDR_MAINFRAME); SetMenu(NULL); SetMenu(&m_NewMenu); } 图2.2.5 设计新的菜单资源 图2.2.6 在查看下面建一个菜单项 说 明: 代码中,LoadMenu 和Detach 都是CMenu 类成员函数,LoadMenu 用于装载菜单资源,而Detach 是使菜单对象与菜单句柄分离。在调用LoadMenu 后,菜单对象m_NewMenu 就拥有一个菜单句炳,当再次调用LoadMenu 时,由于菜单对象的句柄已经创建,因而会发生运行错误,但当菜单对象与菜单句柄分离后,就可以再次创建菜单了。SetMenu 是CWnd 类的一个成员函数,用于设置应用程序的菜单。 (8)编译运行:单击菜单查看→显示测试菜单→菜单上 面出现“测试”→测试→返回→又回到原菜单。 2、添加并设计工具栏按钮 (1)ResourceView →打开resources →打开Toolbar →双击IDR_MAINFRAME,显示出工具栏编辑器, 利用工具栏编辑器设计两个工具栏按钮,设计结 果如图2.2.6所示。 (2)双击设计的第1个工具栏按钮,弹出该工 具栏按钮的属性对话框,将该工具栏按钮的ID 号设为:ID_VIEW_TEST ,在提示框内输入: 图2.2.6 设计的2个工具栏按钮 显示测试菜单\n 显示测试菜单。 (3)再双击设计的第2个工具按钮,弹出该工具栏按钮的属性对话框,将该工具栏按钮的ID 号设为ID_TEST_RETURN ,在提示框内输入:返回应用程序主菜单\n 返回主菜单。 (4)再编译运行后,将鼠标移至第1个工具栏按钮处,这时在状态栏上显示出“显示测试菜单”,稍等片刻后,还会出现一个小窗口,也显示“显示测试菜单”字样。再将鼠标移至第2个工具栏按钮处,在状态栏上显示“返回应用程序主菜单”,稍等片刻后,又会出现一个小窗口,显示“返回主菜单”,如图2.2.7所示。先单击第1个按钮,再单击第2个按钮,会各自执行和菜单一样的命令。 3、添加工具栏 (1)在项目工作区的ResourceView 页面中,展开Toolbar(工具栏)资源,用鼠标单击 IDR_MAINFRAME 不松开,然后按下Ctrl 键,移动鼠标将ID_MAINFRAME 拖到 Toolbar 资源名称上,松开鼠标和Ctrl 键, 这样就复制了工具栏默认资源: ID_MAINFRAME ,复制后的资源标识,系 统自动设为:IDR_MAINFRAME1。 (2)用鼠标右键单击工具栏资源 IDR_MAINFRAME1,从弹出的“工具栏属 性”对话框中选择Properties 命令,将ID 设 为IDR_TOOLBAR1,如图2.2.8所示。 图2.2.7显示测试菜单 设计的2个 工具栏按钮 图2.2.8 “工具栏属性”对话框图2.2.9 删除不要的工具按钮 (3)双击IDR_TOOLBAR1,打开工具栏资源,删除(鼠标按住原有按钮不放,将其拖出工具栏即可)不要的工具栏按钮,如图2.2.9所示。 (4)在CMainFrame类头文件CMainFrm.h 的public下,添加成员变量:CToolBar m_wndTestBar;// CToolBar类封装了工具栏的操作(5)在CMainFrame::OnCreate函数中添加以下工具栏创建代码: int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1; int nRes = m_wndTestBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS| CBRS_FLYBY|CBRS_SIZE_DYNAMIC,CRect(0,0,0,0), AFX_IDW_TOOLBAR+10); if(!nRes||!m_wndTestBar.LoadToolBar(IDR_TOOLBAR1)) { TRACE0("Failed to create toolbar\n"); return -1; } ……… m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); m_wndTestBar.EnableDocking(CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar); DockControlBar(&m_wndTestBar); return 0; } (6)编译运行,结果见2.2.10所示,点击原 工具栏新加的2个按钮和复制的2个工具栏 按钮,都执行和菜单一样的命令。 图2.2.10 运行结果 说明: (1)CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER| CBRS_TOOLTIPS|CBRS_FL YBY|CBRS_SIZE_DYNAMIC,CRect(0,0,0,0), AFX_IDW_TOOLBAR+10);创建工具栏 第一个参数用于指定工具栏所在的父窗口指针(this表示当前的CMainFrame类窗口指针)。 第二个参数用于指定工具按钮的风格(TBSTYLE_FLAT表示工具按钮是“平面”的)。 第三个参数用于指针工具栏的风格,由于这里的工具栏是CMainFrame的子窗口,因此需要指定 WS_CHILD|WS_VISIBLE(见第4章表4.1:创建子窗口|窗口最初是可见的)。 CBRS_TOP 将工具栏放在边框窗口的顶部 CBRS_BOTTOM 将工具栏放在边框窗口的底部 CBRS_GRIPPER 表示工具栏前面有一个“把手” CBRS_SIZE_DYNAMIC 表示工具栏在浮动时,其大小是可以动态改变的 CBRS_NOALIGN: 边框窗口改变大小时,工具栏不重定位 CBRS_TOOLTIPS: 使工具栏提示有效 CBRS_SIZE_FIXED: 工具栏尺寸固定 CBRS_FLOATIONG: 工具栏是浮动的 CBRS_FL YBY: 在状态栏中显示按钮的有关信息 CBRS_HIDE_INPLACE: 不显示工具栏 第四个参数用于指定工具栏四周的边框大小,一般都为0(如:CRect(0,0,0,0))。 最后一个参数用于指定工具栏这个子窗口的标识ID(与工具栏资源标识不同)。 (2)if语句中的LoadToolBar函数用于装载工具栏资源。若CreateEx或LoadToolBar的返回值为0,既调用不成功,则显示诊断信息“Failed to create toolbar”。 TRACEO是一个用于程序调试的跟踪宏OnCreate函数返回-1时,主框架窗口被清除。 (3)应用程序中的工具栏一般具有停靠或浮动性: m_wndTestBar.EnableDocking使得m_wndTestBar对象可以停靠。 CBRS_ALIGN_ANY表示可以停靠在窗口的任一边。 EnableDocking(CBRS_ALIGN_ANY)调用的是CFrameWnd类的成员函数,用于让工具栏或其它控 制条在主框架窗口可以进行停靠操作。 DockControlBar也是CFrameWnd类的成员函数,用于将指定的工具栏或其他控制条进行停靠。(4)代码中的AFX_IDW_TOOLBAR是系统内部的工具栏子窗口标识,并将: AFX_IDW_TOOLBAR+1的值表示默认的状态栏子窗口标识。如果在创建新的工具栏时没有指定相应的子窗口标识,则会使用默认的AFX_IDM_TOOLBAR。这样,当打开“查看”菜单,单击“工具栏”菜单时,显示或隐藏的工具栏不是原来的工具栏,而是新添加的工具栏。为此,需要重新指定工具栏子窗口的标识,并使其值等于AFX_IDW_TOOLBAR+10。 4、完善程序代码 (1)调用CFrameWnd类的成员函数ShowControlBar,使程序一开始运行时,将工具栏IDR_TOOLBAR1隐藏起来。 int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { ... ... ShowControlBar(&m_wndTestBar,FALSE,FALSE);//关闭测试工具栏 return 0; } 说明: ShowControlBar函数有3个参数,第1个参数用于指定要操作的工具栏或状态栏指针,第2个参数是一个布尔型,当为TRUE时表示显示,否则表示隐藏,第3个参数用于表示是否延迟显示或隐藏,当为FALSE时表示立即显示或隐藏。 (2)在CMainFrame::OnViewTest和CMainFrame::OnTestReturn函数中添加下列代码: void CMainFrame::OnViewTest() { ... ... ShowControlBar(&m_wndTestBar,TRUE,FALSE); //显示测试工具栏 ShowControlBar(&m_wndToolBar,FALSE,FALSE);//关闭主工具栏 } void CMainFrame::OnTestReturn() { ShowControlBar(&m_wndTestBar,FALSE,FALSE);//关闭测试工具栏 ShowControlBar(&m_wndToolBar,TRUE,FALSE); //显示主工具栏 } (3)编译运行:结果见图2.2.11和2.2.12所示。 图 2.2.11 程序运行的结果 图2.2.12 单击前面的工具按钮后结果 2.3 状态栏 状态栏是一条水平长条,位于应用程序的主窗口的底部,它可以分割成几个窗格, 用来显示多组信息。应用程序往往需要把当前的状态信息或提示信息告诉用户,虽然其他窗口(如窗口的标题栏上、提示窗口等)也可显示文本,但它们的功能比较有限,而状态栏能很好地满足应用程序显示信息的需求。 2.3.1 状态栏的定义 在MFC AppWizard 创建的SDI 或MDI 应用程序框架的MainFrm.cpp 文件中有一个静态数组indicators 数组,它被MFC 用做状态栏的定义,见图2.3.1所示。 这个数组中的元素是一些标识常量或是字串资源的ID 标识符。默认的indicators 数组包含了4个元素,它们是: ID_SEPARATOR 是用于标识信息行窗格的,菜单项或工具栏按钮的许多信息都在这个 信息行窗格中显示。 ID_INDICATOR_CAPS 是用于标识指示器窗格显示出CapsLock 键的状态(大写), CapsLock 键就是在键盘左边的那个控制大小写转换的键。 ID_INDICATOR_NUM 是用于标识指示器窗格显示出NumLock 键状态(数字)。 ID_INDICATOR_SCRL 是用于标识指示器窗格显示出ScrollLock 键的状态(滚动)。 static UINT indicators[]= { ID_SEPARATOR, } 图2.3.1 indicators数组元素与标准状态栏窗口的关系 2.3.2 状态栏的常用操作 Visual C++6.0中可以方便地对状态栏进行操作,如增加窗格、减少窗格、在状态栏中显示文本、改变状态栏的风格大小等,并且MFC的CStatusBar类封装了状态栏的大部分操作。 1、增加和减少窗格 状态栏中的窗格可以分为信息行窗格和指示器窗格2类: (1)若在状态栏中增加一个信息行窗格,则只需要在indicators数组的适当位置增加一个ID_SEPARATOR标识即可。 (2)若在状态栏中增加一个用户指示器窗格,则在indicators数组中的适当位置增加一个在字符串表中定义过的资源ID,其字符串的长度表示用户指示器窗格的大小。 (3)若状态栏减少一个窗格,其操作与增加相类似,只需减少indicators数组元素即可。 2、在状态栏上显示文本 (1)调用CWnd::SetWindowText更新信息行窗格(或窗格0)中的文本。由于状态栏也是一种窗口,故在使用时可直接调用。若状态栏变量为m_wndStatusBar显示为: m_wndStatusBar。SetWindowText(“消息”)语句将在信息行窗格(或窗格0)内显示“消息”字样。 (2)手动处理状态栏的ON_UPDATE_COMMAND_UI更新消息,并在处理函数中调用:CCmdUI::SetText函数。 (3)调用CStatusBar::SetPaneText函数更新任何窗格(包括信息行窗格)中的文本,此函数原型描述如下: BOOL SetPaneText(int nIndex,LPCTSTR lpszNewText,BOOL bUpdate=TRUE); 参数: 1、nIndex是表示设置的窗格索引(第1个窗格的索引为0) 2、lpszNewText表示要显示的字符串,若bUpdate为TRUE,则系统自动更新显示的结果。下面我们用两种方法在状态栏中显示鼠标在客户区的位置: 例2.8 在状态栏的最右边两个窗格中显示出当前鼠标在窗口客户区的位置。 (1)创建一个单文档应用程序(或用上个“多个工具栏”程序),名为:状态栏 (2)将项目工作区切换到ClassView页面,展开CMainFrame所有项,双击CMainFrame() 函数,在文档窗口中出现该函数的定义,在它的前面是状态栏数组的定义。 (3)将状态栏indicators数组的定义改为下列代码: static UINT indicators[] = { ID_SEPARATOR, // status line indicator ID_SEPARATOR, }; (4)将鼠标移动消息WM_MOUSEMOVE映射到视图类“状态栏View”中。 由于鼠标移动消息WM_MOUSEMOVE 在CMainFrame类映射后不起作用,因此只能映射到视图“状态栏View” 类中。但是,这样一来,就需要更多的代码,因为状态栏对象m_wndStatusBar是CMainFrame类定义的成员变量,因而需要在视图类“状态栏View”中添加访问CMainFrame类的代码。 void CNnView::OnMouseMove(UINT nFlags, CPoint point) { CString str; //获得主窗口指针 CMainFrame *pFrame=(CMainFrame*)AfxGetApp()->m_pMainWnd; //获得主窗口中的状态栏指针 CStatusBar *pStatus=&pFrame->m_wndStatusBar; if(pStatus) { str.Format("X=%d,Y=%d",point.x,point.y);//格式化文本 //这里”1”是更新第2个窗格的文本,而”0”是第1窗格 pStatus->SetPaneText(1,str); } } (5)将MainFrm.h文件中的受保护变量m_wndStatusBar改为公共变量。 (6)在“状态栏View.cpp”视图类执行文件的头部写:#include “MainFrm.h”。 (7)编译运行,结果见图2.3.2所示。 3、改变状态栏的风格 在MFC的CStatusBar类中,有2个成员函数可以改变状态栏风格,他们是: void SetPaneInfo(int nIndex,UINT nID,UINT nStyle,int cxWidth); viod SetPaneStyle(int nIndex,UINT nStyle); 参数: nIndex表示要设置的状态栏窗格的索引 nID用于为状态栏窗格指定新的ID cxWidth表示窗格的像素宽度 nStyle表示窗格的风格类型,用于指定窗格的外观,例如:SBPS_POPOUT表示窗格是凸起来的,状态栏窗格的风格类型如表2.6所示: (8)在上面的OnMouseMove(UINT nFlags, CPoint point)函数里加: void CNnView::OnMouseMove(UINT nFlags, CPoint point) { ... ... //下面函数第一个参数表示状态栏窗格索引,第二个参数见表2.6所示 pStatus->SetPaneStyle(1,SBPS_POPOUT); str.Format("X=%d,Y=%d",point.x,point.y); //格式化文本 武汉轻工大学VC++程序设计大作业 院系电气与电子工程学院 班级 学号1204 姓名 日期2013.11.22 1题目 编写MFC下的单文档程序,通过鼠标点击选择两个点,作为矩形左上角、右下角,然后绘制矩形。(对应12题) 2思路 首先点击鼠标,选中左上角,然后拖动鼠标,在右下角拿起,这样矩形就就可以实现了。 3程序实现过程 首先建立MFC单文档程序 然后建立类向导 添加鼠标事件 添加CPoint成员变量m_OrigPoint 4关键代码 // RectangleView.cpp : implementation of the CRectangleView class // #include "stdafx.h" #include "Rectangle.h" #include "RectangleDoc.h" #include "RectangleView.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CRectangleView IMPLEMENT_DYNCREATE(CRectangleView, CView) BEGIN_MESSAGE_MAP(CRectangleView, CView) //{{AFX_MSG_MAP(CRectangleView) ON_WM_LBUTTONDOWN() ON_WM_LBUTTONUP() //}}AFX_MSG_MAP // Standard printing commands ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CRectangleView construction/destruction CRectangleView::CRectangleView() { // TODO: add construction code here } CRectangleView::~CRectangleView() { } BOOL CRectangleView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: Modify the Window class or styles here by modifying // the CREATESTRUCT cs return CView::PreCreateWindow(cs); } VC程序设计课程设计 报告书 设计题目:简单绘图软件 院系:信息工程学院 班级:软件1101 组别:第二十二组 学号: 1110024130 姓名: 方锦 起止日期:2012年12月10日~2012年12月20日指导教师:张顺利 目录 绪论 -------------------------------------------------------------------------------- 3一概要设计 -------------------------------------------------------------------- 5 1.主要功能---------------------------------------------------------------------- 5 2.设计的概要设计功能模型框架图---------------------------------------- 5 二设计的详细设计------------------------------------------------------------- 5 1工具栏的编辑---------------------------------------------------------------- 6 2状态栏的编辑 --------------------------------------------------------------- 6 四编码和测试---------------------------------------------------------------- 9五设计总结 ------------------------------------------------------------------ 10 1.过程分析-------------------------------------------------------------------- 10 2.经验教训及分析 -----------------------------------------------------------11 3程序维护 --------------------------------------------------------------------11 六参考文献-------------------------------------------------------------------- 12 26-编辑菜单栏_什么是菜单栏和工具栏 编辑菜单栏“编辑”菜单“编辑”菜单中的一些命令主要是对文件进行编辑的,比如复制、粘贴、填充、描边等。“编辑”菜单是photoshop软件操作中最为常用的菜单之一。 1.“还原”命令这个命令用来将操作进行还原,它的快捷键是CTRL+Z,当时它只能还原一次,如果想要尽可能多地还原操作步骤,那么可以按CTRL+ALT+Z键。 2.“剪切”命令当画面中存在选框的时候,这个命令能将画面中选框中的部分进行裁切,下面我们通过一个练习来讲解。 一:打开这一张图片,然后用选区工具(M)选出一个选区。 二:选择编辑>剪切(CTRL+X),这样选框中的部分就被剪切掉了,如下图。 再选择编辑>粘贴(CTRL+V)就可以把剪切的部分粘贴到画面中。 3.“拷贝”和“粘贴”命令这两个命令基本上是组合来使用的,在画面中制作选框后,选择编辑>拷贝(CTRL+C)命令将其复制然后再选择编辑>粘贴(CTRL+V)将复制的部分粘贴到画面中。与前面的“剪切”命令不同的是,剪切后的图片在选框中的部分就没有了,当时使用“拷贝”和“粘贴”命令后,原图片是完整的。所以大家要注意这两个的区别。 4.“填充”命令“填充”命令的功能与工具箱中的“油漆桶”工具基本相同,只不过它将一些主要的命令和选项集中在一起。如图: 在下拉列表中可以选择很多选项,我们可以选择这些相应的选项来得到不同的效果,不过最为常用的就是前两个选项。其他的大家自己尝试吧。。。。 在“模式”下拉列表中我们可以选择填充的模式,这与前面讲过的混合模式是相同的。如“不透明度”用于改变填充颜色的透明程度。 5.“描边”命令描边命令用于对选框或者对象进行描边,下面通过一个实例来讲解下一:新建文件,然后使用矩形选框工具(M)在画面中做出选框。 二:选择编辑>描边命令,按照下图设置。 三:完成后得到如下效果。 6“自由变换”命令“自由变换”命令是我非常喜欢的一个命令,它灵活多变,用户可以完全地自行控制,做出任何变形。 自由变换:编辑——自由变换(快捷键:Ctrl+T)辅助功能键:Ctrl、Shift、Alt。 其中,Ctrl键控制自由变化; Shift控制方向、角度和等比例放大缩小; Alt键控制中心对称。 一、正常情况下(不按任何键)(1)拖动边框:单边缩放(2)拖动角点:长宽同时缩放(3)框外旋转:自由旋转,任意角度二、Shift+鼠标(1)拖动边框:单边缩放(同一(1),即无影响)(2)拖动角点:长宽等比例缩放(3)框外旋转:以15°的倍数旋转三、Ctrl+鼠标(1)拖动边框:自由平行四边形变换(2)拖动角点:角度,和相邻两边发生变化(3)框外旋转:自由旋转,任意角度(同一(3),即无影响)四、Alt+鼠标(1)拖动边框:对边等比例缩放,角度不变(2)拖动角点:中心对称的自由缩放(不是等比列)(3)框外旋转:自由旋转,任意角度(同一(3),即无影响)Tips:框外旋转时凡 3.25设计一个类CRectangle,除了有相关的数据成员,该类要求包含下述成员1 函数:矩形从一个位置移动到另一个位置的Move()函数;改变矩形大小的Size 2 ()函数;返回矩形左上角的坐标坐标值的Where()函数;计算矩形面积的Area 3 ()函数。 4 代码如下:#include } 20 ~CRectangle() 21 {} 22 void Move(double , double); 23 void Size(double ,double); 24 void Where(); 25 void Area(); 26 }; 27 void CRectangle::Move(double x, double y) 28 { 29 cout<<"矩形按向量("< Coreldraw系列问答:工具栏消失 2007-01-13 06:54 作者:木平原创出处:天极设计在线 问:CorelDraw的工具栏找不到啦!属性栏也没有啦!菜单不见啦!泊钨窗口不见啦…… 答:这个问题基本上是由于误操作引起的。有时候我们找不到工具栏,有时候属性栏不见了……但是我们在菜单 栏下方点鼠标右键,查看相关的选项,会发现其对应的项目前已经勾上。可为什么会没有呢? 这种情况基本上发生在新手身上,误操作将工具栏、属性栏等拖到屏幕以外的地方去了。其实它们都在,只是看不到罢了。 解决的方法很简单,只需重置Coreldraw默认选项即可。 方法是按住F8不放,双击桌面上的Coreldraw图标,提示是否要恢复到初始值,点确定即可。这个办法对解决工具栏,属性栏不见或移位等诸问题适用。 另外此方法可解决以下的类似问题: 1.可解决左边工具箱不见的问题 2.可解决右边色盘不见的问题 3.可解决复原和重做功能键不能使用的问题 4.可解决打开时出现,Menu Configuration File已毁损,使用预设设定来取代含有旧的格式,使用预设设定来取代,然后CD9就不能用了,移除重新安装,还是会出现一样的情况。 5.可解决左上角的地方("文件"的菜单旁边)会出现一个字"跪"的问题 6.可解决在属性列上改变一个矩形的尺寸、角度时,会生成新的图形的问题 7.可解决CorelDRAW开启时一直出现「试图越过其尾端对一未命名文件进行读写」的问题 8.可解决最上面菜单不见的问题 9.可解决CD在启动时出现未发现目录c:\program\corel\Graphics9\Scriprs.正在默认到桌面项的问题 10.可解决其它一些莫名奇妙的Coreldraw程序或菜单使用出错问题 F8键相当于Coreldraw中的一键还原,用好它可以省去很多麻烦。这个方法对COREL家族的软件都通用。 下一次我们解答Coreldraw版本兼容性的问题。 南京工业大学继续教育学院 《VC++程序设计》练习题 2010学年第一学期使用班级:H工升本/HY交升本/H自升本 一、选择题(每小题2分,共计40分) (1)下列关于栈的叙述正确的是 A)栈是非线性结构B)栈是一种树状结构 C)栈具有先进先出的特征D)栈具有后进先出的特征 (2)结构化程序设计所规定的三种基本控制结构是 A)输入、处理、输出B)树形、网形、环形 C)顺序、选择、循环D)主程序、子程序、函数 (3)结构化程序设计的一种基本方法是 A)筛选法B)递归法C)归纳法D)逐步求精法 (4)如果对一个关系实施了一种关系运算后得到了一个新的关系,而且新的关系中属性个数少于原来关系中属性个数,这说明所实施的运算关系是: A)选择B)投影C)连接D)并 (5)C++语言是从早期的C语言逐渐发展演变而来的.与C语言相比,它在求解问题方法上进行的最大改进是() A)面向过程B)面向对象C)安全性D)复用性 (6)C++语言的跳转语句中,对于break和continue说法正确的是() A)break语句只应用与循环体中 B)continue语句只应用于循环体中 C)break是无条件跳转语句,continue不是 D)break和continue的跳转范围不够明确,容易产生问题 (7)for(int x=0,y=o;!x& &y<=5;y++)语句执行循环的次数是() A)0B)5C)6D)无次数 (8)考虑函数原型void test(int a,int b=7,char="*"),下面的函数调用中,属于不合法调用的是() A)test(5); B)test(5,8); C)test(6,"#") D)test(0,0."*"); (9)下面有关重载函数的说法中正确的是() A)重载函数必须具有不同的返回值类型;B)重载函数形参个数必须不同; C)重载函数必须有不同的形参列表D)重载函数名可以不同; (10)下列关于构造函数的描述中,错误的是() A)构造函数可以设置默认参数;B)构造函数在定义类对象时自动执行 C)构造函数可以是内联函数;D)构造函数不可以重载 (11)下面描述中,表达错误的是() A)公有继承时基类中的public成员在派生类中仍是public的 B)公有继承是基类中的private成员在派生类中仍是private的 C)公有继承时基类中的protected成员在派生类中仍是protected的 D)私有继承时基类中的public成员在派生类中是private的 (14)在进行完任何C++流的操作后,都可以用C++流的有关成员函数检测流的状态;其中只能用于检测输入流状态的操作函数名称是(B) A)fail B)eof C)bad D)good (15). ( D )能用作用户自定义标识符 A friend B-var C 3xyz D Float (16). 指针可以用来表示数组元素,int a[3][7],表示错误的是___A___ A.*(a+1)[5] B.*(*a+b) C.*(*(a+1)) D.*(a[0][0]+2) 实验八菜单和工具栏 import java.awt.*; import javax.swing.*; import java.awt.event.*; public class c extends JFrame{ private JMenuBar menuBar; private JMenu xtMenu,xyMenu,zyMenu,xsMenu,kcMenu,cjMenu,jsMenu;// private JMenuItem aItem,bItem,cItem,dItem;// private JMenuItem eItem,fItem,gItem,hItem; private JMenuItem iItem,jItem,kItem,lItem; private JMenuItem mItem,nItem,oItem,pItem; private JMenuItem qItem,rItem,sItem,tItem; private JMenuItem uItem,vItem,wItem,xItem; private JMenuItem yItem,zItem,aaItem,bbItem; public c(String account){ setTitle("学生管理系统"+"当前管理员为"+account); setSize(500,400); center(this); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); createMenu(); showToolBar(); setVisible(true); } //caidan public void createMenu(){ menuBar=new JMenuBar();//创建菜单栏 xtMenu=new JMenu("系统管理"); aItem=new JMenuItem("学院设置"); bItem=new JMenuItem("专业设置"); cItem=new JMenuItem("修改密码"); dItem=new JMenuItem("退出"); //dItem.setMnemonic('Q'); xtMenu.add(aItem); xtMenu.add(bItem); xtMenu.addSeparator(); xtMenu.add(cItem); xtMenu.addSeparator(); xtMenu.add(dItem); 【26-编辑菜单栏】什么是菜单栏和工具栏 编辑菜单栏“编辑”菜单“编辑”菜单中的一些命令主要是对文件进行编辑的,比如复制、粘贴、填充、描边等。“编辑”菜单是photoshop软件操作中最为常用的菜单之一。 1.“还原”命令这个命令用来将操作进行还原,它的快捷键是CTRL+Z,当时它只能还原一次,如果想要尽可能多地还原操作步骤,那么可以按CTRL+ALT+Z键。 2.“剪切”命令当画面中存在选框的时候,这个命令能将画面中选框中的部分进行裁切,下面我们通过一个练习来讲解。 一:打开这一张图片,然后用选区工具(M)选出一个选区。 二:选择编辑>剪切(CTRL+X),这样选框中的部分就被剪切掉了,如下图。 再选择编辑>粘贴(CTRL+V)就可以把剪切的部分粘贴到画面中。 3.“拷贝”和“粘贴”命令这两个命令基本上是组合来使用的,在画面中制作选框后,选择编辑>拷贝(CTRL+C)命令将其复制然后再选择编辑>粘贴(CTRL+V)将复制的部分粘贴到画面中。与前面的”剪切”命令不同的是,剪切后的图片在选框中的部分就没有了, 当时使用“拷贝”和“粘贴”命令后,原图片是完整的。所以大家要注意这两个的区别。 4.“填充”命令“填充”命令的功能与工具箱中的“油漆桶”工具基本相同,只不过它将一些主要的命令和选项集中在一起。如图:在下拉列表中可以选择很多选项,我们可以选择这些相应的选项来得到不同的效果,不过最为常用的就是前两个选项。其他的大家自己尝试吧。。。。 在“模式”下拉列表中我们可以选择填充的模式,这与前面讲过的混合模式是相同的。如“不透明度”用于改变填充颜色的透明程度。 5.“描边”命令描边命令用于对选框或者对象进行描边,下面通过一个实例来讲解下一:新建文件,然后使用矩形选框工具(M)在画面中做出选框。 二:选择编辑>描边命令,按照下图设置。 三:完成后得到如下效果。 6“自由变换”命令“自由变换”命令是我非常喜欢的一个命令,它灵活多变,用户可以完全地自行控制,做出任何变形。 自由变换:编辑——自由变换(快捷键:Ctrl+T)辅助功能键:Ctrl、Shift、Alt。 其中,Ctrl键控制自由变化;Shift控制方向、角度和等比例放大缩小;Alt键控制中心对称。 烟台南山学院计算机系《可视化程序设计Visual C++》作业 2016-2017学年第二学期 班级:计科1401 姓名:毛宗磊 学号:201422031026 专业:计算机科学与技术 指导教师:王玉健 1、创建计算器 1、打开vc6.0编译环境,选择file新建选项,选择工程,选择MFC APPWIZARD(exe),设置工程名字和位置,选择建立对话框,完成基本设置。 2、添加静态文本、编辑框以及按钮,修改基本属性,如图所示 3、创建类向导,在members variables中添加代码,如图所示 4、点击求和按钮,函数的代码如下 5、点击归零按钮,设置代码如下 6、实验结果如下 2、设置背景颜色 1、在文件视图中找到Onpaint()函数,设置代码如下: CRect rect; GetClientRect(rect); CPaintDC dc(this); dc.FillSolidRect(rect,RGB(10,20,180)); CDialog::OnPaint(); 2、设置完成后效果如下: 3、设置变色按钮功能 1、添加一个按钮,设置其基本属性 2、在头文件里定义几个控制颜色的变量 int m_nred; int m_ngreen; int m_nblue; 3、在变色按钮函数内添加如下代码: CColorDialog dlg; if(dlg.DoModal()==IDOK) { COLORREF color=dlg.GetColor(); m_nred=GetRValue(color); m_ngreen=GetGValue(color); m_nblue=GetBValue(color); Invalidate(); } 4、在绘图函数中修改几个变量的值 dc.FillSolidRect(rect,RGB(m_nred,m_ngreen,m_nblue)); 5、效果图如下 4、设置随机色 1、添加一个随机色按钮,设置基本属性 菜单及工具栏设计 (总分:40.00,做题时间:90分钟) 一、{{B}}选择题{{/B}}(总题数:11,分数:22.00) 1.将一个预览成形的菜单存盘,再运行该菜单,却不能执行。这是因为______。 (分数:2.00) A.没有放到项目中 B.没有生成√ C.要用命令方式 D.要编程序 解析: 2.设计菜单要完成的最终操作是______。 (分数:2.00) A.创建主菜单及子菜单 B.指定各菜单任务 C.浏览菜单 D.生成菜单程序√ 解析: 3.为一个表单建立了快捷菜单,要打开这个菜单应当______。 (分数:2.00) A.用热键 B.用快捷键 C.用事件√ D.用菜单 解析: 4.如果不能预计频率,也无法确定逻辑顺序,则可以按字母顺序组织菜单项。当菜单中包含有______个以上的菜单项时,按字母顺序特别有效。 (分数:2.00) A.5 B.6 C.7 D.8 √ 解析: 5.要创建快速菜单,应当______。 (分数:2.00) A.用热键 B.用快捷键 C.用事件 D.用菜单√ 解析: 6.在菜单设计器中,要为某个菜单项定义一个快捷键,要在______定义。 (分数:2.00) A.菜单名称列 B.结果列 C.选项列√ D.菜单级 解析: 7.Visual FoxPro的系统菜单,其主菜单是一个______。 (分数:2.00) A.条形菜单√ B.弹出式菜单 C.下拉式菜单 D.组合菜单 解析: 8.使用菜单方法打开一个在当前目录下已经存在的查询文件zgik.qpr后,在命令窗口生成的命令是______。(分数:2.00) A.OPEN QUERYzgiqpr B.MODIFY QUERYzgiqpr √ C.DO QUERYzgiqpr D.CREATE QUERYzgiqpr 解析: 9.假设有菜单文件mainmu.mnx,下列说法正确的是______。 (分数:2.00) A.在命令窗口利用DO mainmu命令,可运行该菜单文件 B.首先在菜单生成器中,将该文件生成可执行的菜单文件mainmmpr,然后在命令窗口执行命令:DO mainmu 可运行该菜单文件 C.首先在菜单生成器中,将该文件生成可执行的菜单文件mainmmpr,然后在命令窗口执行命令:DOmainmmpr可运行该菜单文件 D.首先在菜单生成器中,将该文件生成可执行的菜单文件mainmmpr,然后在命令窗口执行命令:DO MEMU mainmu可运行该菜单文件√ 解析: 10.假设已经生成了名为mymenu的菜单文件,执行该菜单文件的命令是______。 (分数:2.00) A.DO mymenu B.DO mymenmpr √ C.DO mymenpjx D.DO mymenmax 解析: 11.使用Visual FoxPro的菜单设计器时,选中菜单项之后,如果要设计它的子菜单,应在 Result中选择______。 (分数:2.00) A.PadName B.Submenu √ https://www.wendangku.net/doc/6d15774226.html,mand D.Procedure 解析: 二、{{B}}填空题{{/B}}(总题数:9,分数:18.00) 12.菜单设计器窗口中的 1组合框可用于上、下级菜单之间的切换。 (分数:2.00) 填空项1:__________________ (正确答案:菜单级) 解析: 13.创建SDI菜单的方法是,打开“菜单设计器”,从“显示”菜单中选择 1选项,并选择 2。 (分数:2.00) 填空项1:__________________ (正确答案:“常规选项”) 填空项1:__________________ (正确答案:“顶层表单”) 解析: 一.Excel 2007 与Excel 2003 菜单工具栏比较 相信很多人在刚接触到Excel 2007时,都有种无从下手的感觉,特别是原先在Excel 2003或以前的版本中熟悉的菜单和工具栏不见了,好多命令都不知道“隐藏”到哪儿去了。下面,我们对Excel 2003和Excel 2007进行比较,看看Excel2003中的菜单和工具栏在Excel2007中是如何组合的。 Excel 2003的基本界面 图1.1:Excel2003界面 如上图1.1所示,为大家很熟悉的Excel2003及以前版本的界面。 Excel 2007的界面 图1.2:Excel2007界面 Excel2007操作将功能进行逻辑分类,分别放在相应的“带形功能区”中,共分9类,即开始、插入、页面布局、公式、数据、审阅、视图、开发工具、加载项。每个功能区中又分成几块小的区域,分别集中相应的功能命令按钮。同时,一些命令按钮旁有下拉箭头,含有相关的功能选项。在区域的右下角,有扩展箭头可显示该区域功能的对话框。 下面将详细地进行比较 (1)Office按钮 这两项调到了07版的 【页面布局】 相当于03版的 [工具]->[选项] Office 07版Office按钮Office 03版文件选项 单击Office按钮,则显示与文件操作相关的命令,相当于以前版本中的“文件”菜单中的大多数内容,但变化还是比较大的,在新版本中移除了“页面设置”和“打印区域”,增加了“Excel选项”。 如果对方的版本过低又没安装补丁的话是开不打新版的文件的,我们可以在“另存为”里选择“Excel 97-2003工作簿”另存一个副本给他。 打印预览,在“打印里”,我们最好将“打印预览”和“快速打印”添加到快速访问工具栏里,这样方便我们工作。 设置访问密码有两个方法:1.在“准备”里的“加密文件”可以设置,但只可以设置访问密码,不能设置修改密码。 2. 在“另存为”界面“保存”旁边有一个“工具”按钮,点击“工具”按钮右边的小三角,在弹出菜单中选择“常规选 项”。这时我们就可以在“常规选项”中设置密码了。设置“打开权限密码”后,他人可以用这个密码阅读这个Excel文件。设置“修改权限密码”后,他人可以用这个密码打开和修改这个Excel文件。 一般我们发布的知通都以PDF文件格式发布,这时我们可以点击“发送”再选择“PDF电子邮件附件”。 一、填空题:(每小题2分,共20分) 1.工程名称为kkk的单文档应用程序,默认情况下其文档类名称为() 2.切分窗口有两种类型:()切分和()切分。 3.ActiveX控件有三个属性集:()、()和方法。 4.Windows操作系统支持两种形式的多任务:基于()的多任务和基于()的多任务 5.Windows提供了四种同步对象:()创建或打开一个命名的或匿名的事件对象)、(把指定的事件对象设置为有信号状态)、(把指定的事件对象设置为无信号状态/)、(请求事件对象)事件对象、和临界区。 6.在Windows系统中,消息有数百种之多,可以大致分为以下三类:()、()和命令消息 7.套接字的数据结构中包含的信息应该有:()、()和协议 8.ActiveX控件的二进制文件的扩展名为(CAB)。9.若从扩展动态链接库中导出类,需在定义该类时添加关键字()10.画刷共有三种基本类型:()、()和图案画刷。 二、选择题:(每小题2分,共40分) 1.下列()函数用于弹出模式对话框? (A)OnInitDialog(B)DoModal(C)OnOK(D)OnCancel 2.()函数用于设置注册数据库,注册文档模板等初始化工作。 (A)I nitInstance(B)OnDraw(C)OnOK(D)OnCancel 3.()函数作用是初始化一个新文档。 (A)GetDocument(B)DeleteContent(C)OnNewDocument(D)Dump 4.自动化客户可以通过自动化服务器的()来控制自动化服务器。 (A)过程(B)属性(C)事件(D)方法 5.所有的标准Windows消息都以WM_为前缀,标准Windows消息应该由相应的窗口类和视图类进行处理,它又分为以下几类:() (A)鼠标消息(B)控件消息(C)键盘消息(D)命令消息(E)窗口消息 6.下列哪些属于文档与视图之间相互作用的函数?() (A)Serialize(B)OnUpdate(C)GetDocument(D)GetNextView 7.对于SDI应用程序,命令传递顺序为:() (A)文档->视图->SDI主框架窗口->应用程序 (B)视图->文档->SDI主框架窗口->应用程序 (C)应用程序->文档->视图->SDI主框架窗口 (D)应用程序->视图->文档->SDI主框架窗口 得分评卷人 得分评卷人 WIN7中任务栏,菜单栏和工具栏的基本设置 WIN7的任务栏和XP的任务栏相比有很大的区别,下面我们就来看看WIN7中的变化。 WIN7的任务栏中没有了快速启动栏,这是因为WIN7中增加了一项新的功能,可以将桌面快捷方式附到任务栏,其方法很简单,只要将你想要附到任务栏的桌面快捷方式托到任务栏即可,如果要将其从任务栏移除则只要在选中后“右键”则会显示“解除任务栏锁定”,单击即可。 有些时候我们会发现有些朋友的电脑的任务栏显示在电脑的右面或者上面,也有一些同学的电脑的任务栏就没有,这是怎么设置的呢?在任务栏空白处右键,会看到下图 我们只要将“锁定任务栏”前的勾去掉,那么我们就可以将任务栏托动到电脑的上下左右了,如果要隐藏任务栏则将下面的“自动隐藏任务栏”前的勾给勾上就可,要显示任务栏时只要我们将鼠标移动到最下方就会再次显示。“屏幕上的任务栏位置”也可以设置任务栏的位置,在此就不多说了。 “在任务栏按钮”我们可以作一些设置,具体操作很简单,在此就省略了。 WIN7中新增了AERO PEEK预览功能,有些时候我们会发现我们在任务栏里面的“使用AERO PEEK功能”前面的勾我们也勾上了,可就是没法使用预览功能,这很可能是我们还有一个地方忘了设置。具体方法是“计算机——属性——高级系统设置——高级——性能——设置——视觉效果” 将启用AERO PEEK前的勾给勾上就可以了。 有些时候我们会发现我们电脑里面的开始菜单里面的一些程序或项目不见了(如有些电脑里的开始菜单没有运行项),这时候我们就要到“开始菜单”项里设置了,在开始菜单里我们单击“自定义”会看到下图 目录 目录 ......................................................................................................................................... I 摘要 ....................................................................................................................................... II 1 设计目的 (1) 2 设计要求 (2) 3 设计内容 (3) 3.1 系统分析 (3) 3.2项目创建 (3) 3.3界面设计 (5) 3.4 代码实现 (8) 3.5 方案分析总结 (17) 总结与致谢 (20) 参考文献 (21) 附件 (22) 摘要 GPA英语全称是grade point average,意思就是平均分。GPA的精确度往往达到小数点后1到2位,如:3.0,3.45。GPA的标准计算方法是将大学成绩的加权平均数乘以4,再除以100,得出平均分。美国的GPA满分是4分,即A=4,B=3,C=2,D=1。一般来讲,百分制中的90分以上可视为4分,80分以上为3分,70分以上为2分,60分以上为1分,五分制中的5分为4分,4分为3分,3分为2分,2分为1分。 这次课程设计完成了一个简单的GPA计算器。本次设计系统具有良好的界面,必要的交互信息和较好的健壮性,使我们能快捷简单地进行操作,即时准确地获得需要的计算的结果,充分降低了数字计算的难度和节约了时间,对人们的生活有一定的帮助。 关键词:GPA;VC++6.0;MFC;控件; 一、引言 对于不需要文档/视图结构支持的程序一般都采用对话框做为程序的基础框架。虽然在对话框程序上可以通过修改其属性来添加系统菜单,但对比SDI和MDI程序的工具条和状态栏未免使界面显得简单、单调。虽然在V isual Basic 中提供有独立的工具条和状态栏标准控件可以直接在对话框上使用,但V isual C++ 6.0所提供的26种基本Windows标准控件却没有将它们包含其中。因此要在对话框程序中实现工具条和状态栏只能通过编程来动态实现。 二、工具条的实现过程 MFC对于工具条和状态栏分别提供了CToolBar和CStatusBar两个基本类库,但由于在实现时MFC 对其做了过多的封装,以至无法了解内部的一些核心技术。因此本文在实现过程中放弃了相对比较方便的CToolBar和CStatusBar类的使用,而是通过SDK(Software Developers Kit,软件开发工具箱)式的WinAPI 应用程序接口来实现的。在API函数中经常需要用到对话框的窗口句柄和当前的实例句柄,在SDK程序设计中以上两个句柄可以直接从入口函数WinMain()中引出,而在MFC下也对其做了封装,不能直接获取。但MFC也为其留有接口:CWnd窗口类提供的GetSafeHwnd()可以返回对话框的窗口句柄;函数AfxGetInstanceHandle()则可以获取当前应用程序的实例句柄。由于对话框和状态栏属于程序界面的一部分,需要程序启动时就显示出来,因此获取句柄的代码和后面创建显示工具条、状态栏的全部代码都应当放在对话框初始化消息WM_INITDIALOG的响应函数OnInitDialog()中进行: HWND hDlg=GetSafeHwnd(); HINSTANCE hInstance=AfxGetInstanceHandle(); 对于待添加的工具条按钮可以根据情况细分为两种: 一种是Windows标准的一些工具条按钮比如打开文件、打印预览、在线帮助等等,这类工具条按钮可以直接使用预定义好的按钮图标的ID号,在VC自带的CommCtrl.h头文件中有详细定义; 另一种就是用户自己添加的工具栏按钮,只能由用户在资源视图中为其指定相应的图标。不论是那种工具条按钮的创建都是通过对TBBUTTON结构的设置来决定每一个工具条按钮的状态,对于第一个填充好的工具条按钮可以用CreateToolbarEx()来直接将其加入到工具条上,并返回指向工具条的窗口句柄,而对于以后工具条按钮的添加则只能通过向工具条发送TB_ADDBUTTONS消息来实现: …… //填充工具条按钮结构: TBBUTTON ptoolbar[30]={{STD_HELP, //指定Windows的标准帮助图标 MU_ONE, //工具条按钮的ID TBSTA TE_ENABLED, //可用状态 TBSTYLE_BUTTON, //指定创建一个可以下按的按钮 0, //保留,由应用程序定义该参数意义 0}, //按钮字串索引 //创建一个分割按钮用的竖线 {0,0,TBSTA TE_ENABLED,TBSTYLE_SEP,0,0}}; 工具,菜单,及工具栏 Ps丶杰丨Forever Photo shop 工具箱中包含了用于创建和编辑图像、图稿、页面元素的工具和按钮。单击工具箱顶部的双箭头切换为单排和双排。 移动工具箱 默认的情况下,工具箱停放在窗口左侧。将光标放在工具箱顶部双箭头 右侧,可以将工具箱从停放中拖出,放在窗口的任意位置。 程序栏:可以调整photo shop窗口大小,将窗口最大化、最小化或关闭。还可以切换工作区,显示参考线,网络等。 菜单栏:菜单中可以执行各种命令。单击菜单名称即可打开相应的菜单。 标题栏:显示了文档名称、文件格式、窗口缩放比例和颜色模式等等。如果包含多个图层,则标题栏中还会显示当前工作的图层的名称。 图中的文档名称为鱼老大,格式为psd,缩放比例为33.3%,颜色模式为RGB。括号里面则为:我选择的图层。 工具箱:包含用于各种操作的工具,如创建选区,移动图像,绘画,绘图等 工具选项栏:用来设置工具的各种选项,它会随着所选工具的不同而变换内容。 魔棒工具选项栏 渐变工具选项栏 面板:可以帮助我们编辑图像。有的用来设置编辑内容,有的用来设置颜色属性。 状态栏:可以显示文档大小,文档尺寸,当前工具和窗口缩放比较等信息。 图中缩放比例为33.33%,文档尺寸为146.05毫米* 216.03毫米 文档窗口:是显示和编辑图像的区域。 选项卡:打开多个图像时,它们会最小化到选项卡中,单击各个文件的名称即到相应的文件。 在photo shop中打开一个图像时,便会创建一个文档窗口。如果打开了多个图像,则各个文档窗口会以选项卡的形式显示。 按下Ctrl+ Tab键,即可照前后顺序窗口切换。按下Ctrl+ Shift+ Tab键,可按照相反的顺序切换窗口。 单击一个标题栏将其从选项卡中拖出,它便成为可任意移动位置的浮动窗口。 西安科技大学 《VC++程序设计》 实验报告 题目画图 院、系(部)计算机科学与技术学院专业及班级 学号 姓名:szgkb 日期 2014.6.2 1 题目要求 建立一个通过“画图”程序,它是基于MFC的多文档应用程序,并且应用程序的风格样式具有Office视觉样式的Ribbon风格。在实现程序的过程中,要创建具有Office视觉样式的项目,再为应用程序的Ribbon功能区添加相应的绘图命令。在实现绘图中,能够很好地使用CDC类中的绘图函数,以实现直线、矩形、圆弧、椭圆等的绘制。了解MFC中设备环境类和坐标映射方式,并且了解常用的GDI对象。扩展“画图”程序实现图形的绘制、保存、滚动等功能。 2 功能需求 选择“绘图”选项卡后,将会展开一些绘图工具。选择某个绘图工具后,便可以在客户区中绘制相应的图形,还可以点击面板上的“画笔颜色”和“填充颜色”按钮,利用弹出的颜色对话框分别设置绘图的颜色及填充的颜色,而且单击“文本”按钮还可以在客户区中输入文本内容,在文本输入中,涉及到文本的颜色、插入符的位置、字体、退格、回车、文本字符等的正确处理。 3 总体设计 建立一个MFC的基于对话框的应用程序,取名为MyPaint1。接下来创建Ribbon 功能区,创建了“工具”、“颜色”两个面板。新建绘图类CDrawShape用以封装自由线、直线、矩形、椭圆、圆的绘制过程。在CMyPaint1View中响应绘图命令并通过添加鼠标左键按下以及移动的消息响应函数(OnLButtonDown、OnMouseMovehe、 OnLButtonup)来实现图形绘制。另外设置插入符、文本内容、文本颜色,来实现文本的输出。最后进行对绘图光标的修改。 3.1 系统模块 3.2 系统业务处理流程运行“画图”程序“绘图”菜单 工具面板 客户区绘图 颜色面板 保存图形 Matlab GUI 常用操作 菜单 1.编辑菜单 打开GUIDE,选择工具栏上面的菜单编辑按钮 2.添加菜单回调函数(callback) 菜单编辑完成保存后,在fig对应的m文件中会自动生成菜单的回调函数声明例如菜单tag名为menuFilePrint,则对应的callback函数为: function menuFilePrint_Callback(hObject, eventdata, handles) 可以在该函数内添加代码实现功能。 3.菜单项访问 获取菜单句柄 在matlab的函数中要对某个菜单进行访问,必须获得该菜单的句柄。 如果是在菜单的回调函数里面,hObject就是该菜单的句柄; 如果是在其他的函数里面要获得某一菜单的句柄,比如选中工具栏上的ZoomIn按钮,按钮处于被按下状态,同时要设置对应菜单项view->Zoom-Zoom In 为选中状态,如下图: 这里要在按钮“ZoomIn”的callback函数里面实现对菜单menuViewZoomIn的状态设置。首先得获得菜单的句柄: % first we must get the handle of menuZoomIn hFigChildren = allchild(gcf); % menuView handle hMenuView = findobj(hFigChildren,'Tag','menuView'); hvc = allchild(hMenuView); % menuViewZoom hViewZoom = findobj(hvc,'Tag','menuViewZoom'); hvzc = allchild(hViewZoom); %menuZoomIn handle hZoomIn = findobj(hvzc,'Tag', 'menuZoomIn'); 获取设置菜单状态 得到菜单的句柄后就可以得到菜单当前的状态了: if strcmp(get(hZoomIn, 'Checked'),'on') set(hZoomIn, 'Checked', 'off'); else set(hZoomIn, 'Checked', 'on'); endVC++程序设计大作业——熊武
VC程序设计 课程设计报告书
26-编辑菜单栏_什么是菜单栏和工具栏
最新vc++程序设计
03.CorelDraw的工具栏找不到啦!属性栏也没有啦!菜单不见啦!泊钨窗口不见啦……
VC++程序设计练习题
JAVA菜单和工具栏界面代码设计
【26-编辑菜单栏】什么是菜单栏和工具栏
VC++可视化程序设计入门
菜单及工具栏设计
Excel 2007 与 Excel 2003 菜单工具栏比较
VC 程序设计
WIN7中任务栏,菜单栏和工具栏的基本设置
VC++程序设计说明书---计算器
VC对话框程序添加目录菜单、工具条和状态栏
工具,菜单,及工具栏
(画图vc程序设计)
Matlab GUI 菜单和工具栏常用操作