02界面编程2控制条文档格式.docx
- 文档编号:22939559
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:15
- 大小:137.08KB
02界面编程2控制条文档格式.docx
《02界面编程2控制条文档格式.docx》由会员分享,可在线阅读,更多相关《02界面编程2控制条文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
SEPARATOR
BUTTONID_EDIT_CUT
BUTTONID_EDIT_COPY
BUTTONID_EDIT_PASTE
BUTTONID_FILE_PRINT
BUTTONID_APP_ABOUT
END
2)编辑工具条
下面仍以Student程序为例,说明如何向工具条中添加按钮、设置响应、及添加新的工具条。
下面是编辑工具条的若干操作于步骤:
●在VC项目工作区的资源视图页中展开“Student\Student.rc”中的“Toolbar”资源列表,双击IDR_MAINFRAME打开工具栏编辑器(见下图)
工具条编辑器
●选择当前按钮:
单击位于VS窗口中部的工具条编辑窗口上部工具条栏中的所需按钮;
●修改位图:
对当前按钮,可以利用“图像”菜单、图像编辑器工具条和(位于属性窗口上部的)颜色窗口,在中部的图像编辑器窗口中绘制和修改当前按钮的位图;
●修改属性:
在属性窗口中可以
⏹选择该按钮所对应的(菜单项)ID
⏹修改该按钮位图的宽和高
⏹键入/修改该按钮所对应的提示文本(\n后的为按钮的浮动提示文本)
●删除按钮:
将按钮拖离工具条即可
●添加按钮:
⏹将工具条最右边的空白按钮拖到你想加入按钮的位置
⏹用“图像”菜单、图像编辑器工具条和颜色窗口来绘制按钮的位图(在空白按钮上绘图后,VS会自动在其右边添加一个新的空白按钮)
⏹在属性窗口中选择该按钮所对应的(菜单项)ID
⏹还可以修改该按钮位图的宽和高、键入/修改该按钮所对应的提示文本
●分组:
左/右拖动按钮半个按钮宽度,可将其
⏹与右边/左边的按钮分开成不同的组
⏹与左边/右边的按钮合并成同一个组
例如,在Student程序的工具条中,在问号按钮前加入分别用“+”与“-”号图形表示的添加菜单项(ID_ADD)与删除菜单项(ID_DEL)按钮。
3)添加新工具条
如果:
1在使用应用程序向导创建程序时,在“MFC应用程序向导”对话框的“用户界面功能”页的“工具栏”选项中,没有选“标准停靠”单选钮,则需要自己加入工具条;
2或者原有的工具条不够用,需要加入第2个工具条;
3或者在程序运行当中需要在多个工具条中切换;
对这些情况都需要自己创建新的工具条,并且自己写代码将它装入框架窗口。
(1)创建工具条资源
●在项目工作区的“资源视图”页中的Toolbar资源表项上单击鼠标右键,在弹出的浮动菜单中选“插入Toolbar”菜单项,VS会自动创建一个ID为IDR_TOOLBAR1的空工具条
●可在该工具条中加入若干图形按钮(如Z、L、W)
●在属性窗口中修改工具条的ID(如IDR_MYTB),选择按钮对应的ID(如ID_NAME_ZS、ID_NAME_LS、ID_NAME_WW)
(2)创建、装入、显示工具条
针对前面所讲的3种情况,分别采用下列不同的方法来装入工具条:
1在没有工具条的框架窗口中加入工具条:
●创建新工具条资源
●打开头文件MainFrm.h,在CMainFrame类中加入工具条类CToolBar的对象m_ToolBar作为公共数据成员:
(缺省的工具条对象为CToolBarm_wndToolBar;
)
CToolBarm_ToolBar;
●在CMainFrame类中WM_CREATE消息响应函数OnCreate(若无该函数则创建它)中的return0;
语句之前加入下列代码:
if(!
m_ToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|
CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|
CBRS_SIZE_DYNAMIC)||!
m_ToolBar.LoadToolBar(IDR_MYTB))
{
TRACE0("
未能创建工具栏\n"
);
return-1;
//未能创建
}
m_ToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&
m_ToolBar);
其中的CreateEx函数代替了下列三个函数的功能:
m_ToolBar.Create(this)){//创建工具条
//创建失败
if(!
m_ToolBar.LoadToolBar(IDR_MYTB)){//装入工具条
//装入失败
m_ToolBar.SetBarStyle(m_ToolBar.GetBarStyle()|CBRS_GRIPPER|CBRS_TOOLTIPS|
CBRS_FLYBY);
//CBRS_GRIPPER:
在工具条的左边加一个夹条
//CBRS_TOOLTIPS:
激活工具条提示;
//CBRS_FLYBY:
允许在鼠标滑过图形按钮时在显示提示(缺省只有在按下按钮时才提示,且无浮动式提示)
2在框架窗口中加入多个工具条:
●在原有的OnCreate函数内加入似①的创建与装入工具条的代码,但要注意代码的顺序,且不需重复语句EnableDocking(CBRS_ALIGN_ANY);
参见下面代码的红色部分(其余部分为自动生成的缺省代码):
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
OnCreate(lpCreateStruct)==-1)
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))
//未能创建
CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|
CBRS_SIZE_DYNAMIC)||!
m_wndStatusBar.Create(this)||
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
未能创建状态栏\n"
//TODO:
如果不需要工具栏可停靠,则删除这三行
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar);
return0;
}
3显示/隐藏/切换工具条:
●似②创建若干工具条资源
●在OnCreate函数内加入相应代码,来创建与装入工具条
●在这些代码后面,加上隐藏暂不显示的工具条的代码,如
ShowControlBar(&
m_ToolBar,FALSE,FALSE);
这里用了框架窗口类的ShowControlBar成员函数,其原型为:
voidShowControlBar(CControlBar*pBar,BOOLbShow,BOOLbDelay);
●在菜单资源中添加显示/隐藏/切换工具条的菜单项(如“视图\切换工具栏”ID_CHANGE_TOOL_BAR),在某一窗口派生类(如视图类CStudentView)中创建该菜单项的消息响应函数(如OnChangeToolBar),在该函数中隐藏/显示/切换工具条,例如:
voidCStudentView:
OnChangeToolBar()
CMainFrame*pFrmWnd=(CMainFrame*)GetTopLevelFrame();
if(m_bTBar){
pFrmWnd->
pFrmWnd->
m_wndToolBar,FALSE,FALSE);
m_ToolBar,TRUE,FALSE);
m_bTBar=false;
else{
m_wndToolBar,TRUE,FALSE);
m_bTBar=true;
其中m_bTBar为bool型类变量,可在视图类的头文件中定义,在视图类的代码文件中的构造函数中设置初始值为true。
这里可能需要修改m_wndToolBar为公共的。
4)修改工具条的位图与ID
除了可装入和切换整个工具条(包括位图与ID),也可只装入位图而不改其原来的ID,这需要使用CToolBar类的成员函数LoadBitmap或SetBitmap,其原型分别为
BOOLLoadBitmap(LPCTSTRlpszResourceName);
BOOLLoadBitmap(UINTnIDResource);
与
BOOLSetBitmap(HBITMAPhbmImageWell);
其中的按钮图片个数必须原来的按钮数相同。
也可不改变按钮的图片,而只是改变其ID、风格和位置:
voidSetButtonInfo(intnIndex,UINTnID,UINTnStyle,intiImage);
5)设置按钮状态
(1)禁止与激活
工具条上图形按钮的禁止与激活是与其对应菜单项同步的,并不需要另外处理。
例如在Student程序中,在还没有按“添加”菜单项时,应该禁止“删除”菜单项功能的使用;
同样,如果最多只允许加入两个菜单项,则在已经加入了两个菜单项后,也应该禁止“添加”菜单项功能的使用。
具体步骤如下:
●可在CStudenView类中设置一个整数型数据成员m_iAddNum(intm_iAddNum;
●在类的构造函数中将该变量初始化为0(m_iAddNum=0;
●在消息响应函数OnAdd中,将该变量加一(m_iAddNum++;
●在消息响应函数OnDel中,将该变量减一(m_iAddNum--;
●在“删除”菜单项的UI更新响应函数OnUpdateDel中,根据m_iAddNum的值设置“删除”按钮(和菜单项)的禁止与激活状态:
OnUpdateDel(CCmdUI*pCmdUI){
pCmdUI->
Enable(m_iAddNum);
●在“添加”菜单项的UI更新响应函数OnUpdateAdd中,根据m_iAddNum的值设置“添加”按钮(和菜单项)的禁止与激活状态:
OnUpdateAdd(CCmdUI*pCmdUI){
Enable(m_iAddNum<
2);
注意:
禁止与激活状态对直接位于菜单条中的菜单项是无效的,但对于位于下拉式或浮动式弹出菜单中菜单项则是有效的。
为了观察对比,可以在原来的缺省菜单条中再增加一个“加删”菜单,并且通过拷贝和粘贴将“添加”和“删除”菜单项也加进“加删”菜单中。
运行结果参见下图:
(2)是否按下
工具条上图形按钮是否被按下是与其对应菜单项是否已被选中(带有√)同步的,也不需要另外处理。
如在Student程序中,切换到MYTB工具条后,可单击按钮Z让其在按下与还原之间切换。
●可在CStudenView类中设置一个布尔型数据成员zs(boolzs;
●在类的构造函数中将该变量初始化为假(zs=false;
●在消息响应函数OnNameZs中,切换该变量的真假(zs=!
zs;
●在Z按钮(ID_NAME_ZS)UI更新响应函数OnUpdateNameZs中,根据zs的值来设置按钮是否按下:
OnUpdateNameZs(CCmdUI*pCmdUI){
SetCheck(zs);
2.状态条
状态条既不接受用户输入,也不产生命令消息,只能显示提示/状态信息和其他文本串。
状态条窗口由若干文本窗格(pane)组成,窗格分成两类:
消息行窗格和状态指示窗格。
若想在状态条中显示应用程序数据,则必须禁用标准的状态条。
1)缺省状态条
缺省状态条用于显示菜单提示和键盘状态。
缺省状态条在CMainFrame类中对应于保护型数据成员CStatusBarm_wndStatusBar;
在MainFrm.cpp文件的前面部分中有数组:
staticUINTindicators[]=
ID_SEPARATOR,//状态行指示器
ID_INDICATOR_CAPS,//CapsLock指示符
ID_INDICATOR_NUM,//NumLock指示符
ID_INDICATOR_SCRL,//ScrollLock指示符
};
在CMainFrame类的消息响应函数OnCreate内有相应的创建代码:
可用状态条类的成员函数SetPaneText在状态条中显示提示信息。
例如
m_wndStatusBar.SetPaneText(0,L"
Messagelineforfirstpane"
其函数原型为
BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);
其中的nIndex可取不同的值,对应于不同的窗格。
2)定制状态条/显示应用程序数据
●将CMainFrame类中的保护数据成员m_wndStatusBar改为公共的
●在头文件MainFrm.h中加入窗格ID的枚举变量。
如
enumSBID{prompt,xName,xVal,yName,yVal};
●去掉原indicators数组中的三个状态指示窗格的ID,加入若干(n个)消息行窗格ID(ID_SEPARATOR),其中第1个(nIndex=0)用于显示提示信息,其余的(n个)用作应用程序的数据显示。
ID_SEPARATOR,//提示nIndex=0
ID_SEPARATOR,//"
x:
"
nIndex=1
ID_SEPARATOR,//x值nIndex=2
ID_SEPARATOR,//"
y:
nIndex=3
ID_SEPARATOR,//y值nIndex=4
●在创建状态条的代码后(如在CMainFrame:
OnCreate函数的尾部),用状态条的成员函数SetPaneInfo来设置每个窗格的ID、风格和宽度(单位似对话框,为1/4英文字母),其函数原型为
voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);
其中nStyle可取值:
⏹SBPS_NOBORDERS窗格周围无三维边框
⏹SBPS_POPOUT窗格突出显示
⏹SBPS_DISABLED不画文本
⏹SBPS_STRETCH伸缩窗格以填满空间(每个状态条中只能有一个窗格可以被设置成伸缩的)
⏹SBPS_NORMAL不伸缩、无边框、不凸显
还可以用状态条类的另一成员函数SetPaneText在窗格中显示文本信息。
如(放在MainFrm.cpp文件中的状态栏创建代码“if(!
m_wndStatusBar.Create(this)……”之后)
m_wndStatusBar.SetPaneInfo(0,prompt,SBPS_STRETCH,0);
//提示
m_wndStatusBar.SetPaneInfo(1,xName,SBPS_NOBORDERS,8);
//"
m_wndStatusBar.SetPaneText(xName,L"
m_wndStatusBar.SetPaneInfo(2,xVal,SBPS_NORMAL,24);
//x值
m_wndStatusBar.SetPaneInfo(3,yName,SBPS_NOBORDERS,8);
m_wndStatusBar.SetPaneText(yName,L"
m_wndStatusBar.SetPaneInfo(4,yVal,SBPS_NORMAL,24);
//y值
●在应用程序中用函数SetPaneText动态修改窗格中的文本串。
OnMouseMove(UINTnFlags,CPointpoint){
wchar_tbuf[20];
_itow_s(point.x,buf,20,10);
pFrmWnd->
m_wndStatusBar.SetPaneText(pFrmWnd->
xVal,buf);
_itow_s(point.y,buf,20,10);
yVal,buf);
CView:
OnMouseMove(nFlags,point);
这里可能需要在视图代码文件的开始处包含主框架类的头文件(#include"
MainFrm.h"
);
而且需要在视图类中,为WM_MOUSEMOVE消息添加响应函数OnMouseMove。
作业
2.(控制条)进一步完善Student程序,包括添加/设置/修改工具条按钮、创建/装入/显示/隐藏工具条、动态设置按钮状态;
定制状态条、动态显示鼠标的当前位置。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 02 界面 编程 控制