77范文网 - 专业文章范例文档资料分享平台

常用控件用法(6)

来源:网络收集 时间:2019-06-11 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

TBSTATE_WRAP 表示按钮具有换行特性,该按钮必须具有TBSTATE_ENABLED状态 按钮风格style可以是下列值的组合: TBSTYLE_BUTTON 表示建立标准下推按钮 TBSTYLE_CHECK 表示建立检查状态按钮 TBSTYLE_CHECKGROUP表示建立检查按钮群 TBSTYLE_GROUP 表示建立按下状态按钮群 TBSTYLE_SEP 表示建立按钮分隔符 6.2.2.3 工具条控制的类属性

工具条控制的类属性必然的联系判断按钮使能状态IsButtonEnabled、判断按钮检查状态 IsButtonChecked、判断按钮按下状态IsButtonPressed、判断按钮是否隐藏IsButtonHidden、判断按钮变灰状态 IsButtonIndeterminate、设置按钮状态SetState、取得按钮状态GetState、取得按钮有关信息GetButton、取得按钮总数GetButtonCount、取得按钮矩形区域GetItemRect、设置按钮结构大小SetButtonStructSize、设置按钮大小SetButtonSize、设置按钮位图大小SetBitmapSize、取得按钮提示控制GetToolTips、设置按钮提示控制 SetToolTips等。

6.2.2.4 工具条控制类的操作方法

工具条控制类的操作方法包括使能按钮EnableButton、检查按钮CheckButton、按下按钮PressButton、隐藏按钮HideButton、变灰按钮Indeterminate、增加按钮 AddButtons、插入按钮InsertButton、删除按钮DeleteButton、取得控制符ID对应的索引CommandToIndex、恢复工具条状态RestoreState、保存工具条状态SaveState和重新确定工具条大小AutoSize等。

6.3 工具条控制的应用技巧

可以这样说,工具条和上述常用控制是应用程序中不可缺少的功能元素,它的优劣会直接影响程序的基本功能和操作特性。所以这里将对工具条的建立技巧、状态保存与恢复、平面特性、停靠位置、排序方法、消息映射、状态更新、控制使用和属性控制等方面,全面阐述工具条的使用技巧。

6.3.1 工具条的建立技巧

6.3.1.1 普通工具条的建立方法

如果应用程序在建立时就具有工具条,则只需对工具条中的按钮图标进行简单的增加、修改和删除等操作就可满足要求。如果未建立或者想增加其它工具条,则应按步骤追加建立。 首先打开已建立好的基于单文档的框架工程文件CTool并选择\选项,插入工具条资源并设置资源标识符;然后编辑工具栏中的按钮图标和相应的按钮标识符,并利用类向导ClassWizard 为按钮消息增加COMMAND和UPDATE_COMMAND_UI两种处理函数;在资源文件中增加和修改工具条图标的动态提示等内容;打开 MainFrm.h包含文件在\m_wndMainToolBar\后增加\m_wndTestToolBar\等来创建增加的工具条对象;在MainFrm.h 中设置建立函数所需的成员变量,如颜色变量为m_bColor、动态提示功能变量为m_bToolTips 等,注意成员变量名与其获取的参数应完全对应以便使用;最后在MainFrm.cpp中的OnCreate()建立函数中按下述示例规则增加控制代码,其实现具体步骤如下: ①在MainFrm.h中增加工具条对象控制和成员变量 #define TOOLLEFT 18

class CMainFrame:public CFrameWnd ......//其它代码 public:

BOOL m_bToolTips;//工具条提示功能 ......//其它代码

protected://工具条控制成员变量

CStatusBar m_wndStatusBar; //框架程序的状态条 CTestToolBar m_wndMainToolBar;//框架程序的工具条 CTestToolBar m_wndTestToolBar;//新增工具条 CTestToolBar m_wndDockToolBar;//浮动工具条 CTestToolBar m_wndDockNextBar;//浮动工具条 ......//其它代码 }

框架程序中工具条的控制类正常应为CToolBar,可以是自己设计的派生类CtestToolBar(为笔者扩充平面特性等功能后的新工具条控制类名)等,具体根据实际需要而定。利用CDialogBar类和CStyleBar 类还可以建立扩展类型的工具条,详见后面工具条中控制应用技巧,但在该文件头处必须 包含如下命令:

#ifndef __AFXEXT_H__

#include //直接存取CToolBar和CStatusBar #endif

②在MainFrm.cpp中完善窗口建立函数

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CFrameWnd::OnCreate(lpCreateStruct) == -1) return -1;

WINDOWPLACEMENT wp;//保存主窗口及工具栏窗口位置状态 if (ReadWindowPlacement(&wp))//读取位置状态信息 SetWindowPlacement(&wp); //设置位置状态信息

m_bToolTips=(AfxGetApp()->GetProfileInt(//读提示功能 _T(\默认值为1

m_wndMainToolBar.SetState(TOOLLEFT,TRUE);//设置初始状态 EnableDocking(CBRS_ALIGN_ANY);//停靠位置,必须提前位置 if (!m_wndMainToolBar.Create(this,WS_CHILD|WS_VISIBLE |CBRS_SIZE_DYNAMIC|CBRS_TOP|((m_bToolTips)? (CBRS_TOOLTIPS|CBRS_FLYBY):0),IDR_MAINFRAME)|| !m_wndMainToolBar.LoadToolBar(IDR_MAINFRAME)) { //CBRS_SIZE_DYNAMIC为锁定位置风格 TRACE0(\主工具条MAINFRAME建立失败\\n\return -1;} // 建立失败处理

......//建立其它工具条代码,基本相同 if (!m_wndStatusBar.Create(this)||

!m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT))) { //建立状态条

TRACE0(\return -1;} // fail to create

m_wndMainToolBar.SetWindowText(_T(\主工具栏\设置标题

m_wndMainToolBar.EnableDocking(CBRS_ALIGN_ANY);//停靠位置 //m_wndMainToolBar.ModifyStyle(0,TBSTYLE_FLAT);//平面特性 ......//设置其它工具条位置代码,基本相同 DockControlBar(&m_wndMainToolBar, AFX_IDW_DOCKBAR_TOP);//锁定位置

DockControlBarLeftOf(&m_wndTestToolBar, &m_wndMainToolBar);//连接工具条

DockControlBar(&m_wndDockToolBar,AFX_IDW_DOCKBAR_RIGHT); m_wndDockToolBar.SetColumns(AfxGetApp()->GetProfileInt( _T(\恢复列格式,默认为3

DockControlBarLeftOf(&m_wndDockNextBar,&m_wndDockToolBar); m_wndDockNextBar.SetColumns(AfxGetApp()->GetProfileInt( _T(\

LoadBarState(_T(\恢复保存的状态和位置 return 0; }

以上建立过程除工具条建立和资源调用函数外,还涉及到了窗口和工具条的状态保存和恢复函数、注册表参数读取函数、工具条停靠位置函数、工具条标题修改函数、工具条连接函数、工具条列格式控制函数和工具条风格修改函数,其中工具条建立函数中的风格设置很重要,如果建立的工具条需要重新设置多行多列的排序功能,除正确设置工具条停靠位置参数外,还必须设置CBRS_SIZE_FIXED 风格,即允许程序改变工具条窗口的尺寸,如果工具条不需要重新排序,则必须设置为CBRS_SIZE_DYNAMIC 风格,否则工具栏不但不能进行重新排序和正确停靠到理想的位置,而且也无法正确保存和恢复工具条的位置和状态,这一点应引起编程者高度重视。其余函数以后分别介绍。 6.3.1.2 浮动工具条的建立方法

如果要建立浮动工具条,必须使用如下工具条的控制方法:

Cpoint pt(GetSystemMetrics(SM_CXSCREEN)-100,GetSystemMetrics(SM_CYSCREEN)/3); FloatControlBar(&m_wndPaletteBar,pt);//浮动工具条 6.3.1.3 多位图工具条的建立方法

如果工具条存在多幅按钮位图,如单色和彩色等,则必须将工具条按钮存在在位图资源文件中而不是工具条资源中,并如下建立:

if(!m_wndDockToolBar.Create(this,WS_CHILD|WS_VISIBLE| CBRS_SIZE_FIXED|CBRS_TOP|CBRS_TOOLTIPS,ID_PALETTEBAR)|| !m_wndDockToolBar.LoadBitmap(IDR_DOCKTOOLBAR)|| !m_wndDockToolBar.SetButtons(DockTool, sizeof(DockTool)/sizeof(UINT)))

其中DockTool为按钮IDs数据结构,其定义方法如下: static UINT BASED_CODE DockTool[]= { ID_SEPARATOR, ID_STYLE_LEFT, ID_STYLE_CENTERED, ID_STYLE_RIGHT, ID_STYLE_JUSTIFIED, };

上述建立过程中的EnableDocking 函数必须放在所有工具条建立函数之前,否则可能出现很难发现的错误,如特殊工具条初始位置控制等。工具条的所有特性均在上述建立函数中确定,所以其建立过程是实现理想工具条的关键环节。 6.3.2 工具条状态保存和恢复6.3.3

很多应用程序中都具有保存和恢复应用程序及其工具条等状态的功能,即下次启动应用程序后进入上次的运行状态,这种功能只需进行一次界面布局便可永久保存,极大方便用户。 要正确保存和恢复应用程序界面状态,必须对应用程序窗口和工具条窗口等均进行保存和恢复,这需要完善应用程序的建立和关闭过程。具体步骤如下:

(1)首先利用类向导ClassWizard为应用程序增加窗口关闭WM_CLOSE消息处理功能OnClose();

(2)在MainFrm.cpp中为应用程序状态设置成员变量 static TCHAR BASED_CODE szSection[]=_T(\static TCHAR BASED_CODE szWindowPos[]=_T(\

static TCHAR szFormat[]=_T(\(3)编制窗口位置状态读取和写入函数

static BOOL PASCAL NEAR ReadWindowPlacement(LPWINDOWPLACEMENT pwp) { //窗口位置状态读取函数,从INI文件中

CString strBuffer=AfxGetApp()->GetProfileString(szSection,szWindowPos); if (strBuffer.IsEmpty()) return FALSE; WINDOWPLACEMENT wp;//窗口位置数据结构 int nRead=_stscanf(strBuffer,szFormat, &wp.flags,&wp.showCmd,//为数据结构读取数值 &wp.ptMinPosition.x,&wp.ptMinPosition.y, &wp.ptMaxPosition.x,&wp.ptMaxPosition.y,

&wp.rcNormalPosition.left,&wp.rcNormalPosition.top,

&wp.rcNormalPosition.right,&wp.rcNormalPosition.bottom); if (nRead!=10) return FALSE; wp.length=sizeof wp;//结构大小 *pwp=wp; //结构指针 return TRUE; }

static void PASCAL NEAR WriteWindowPlacement( LPWINDOWPLACEMENT pwp)

{ //窗口位置状态写入函数,写到INI文件

TCHAR szBuffer[sizeof(\wsprintf(szBuffer,szFormat,//将参数值转换为字符串 pwp->flags,pwp->showCmd,

pwp->ptMinPosition.x,pwp->ptMinPosition.y, pwp->ptMaxPosition.x,pwp->ptMaxPosition.y,

pwp->rcNormalPosition.left,pwp->rcNormalPosition.top,

pwp->rcNormalPosition.right,pwp->rcNormalPosition.bottom);

AfxGetApp()->WriteProfileString(szSection,szWindowPos,szBuffer); }

(4)在应用程序建立函数OnCreate()中增加状态读取和设置功能

WINDOWPLACEMENT wp;//保存主窗口及工具条窗口位置状态 if (ReadWindowPlacement(&wp))//读取位置状态信息 SetWindowPlacement(&wp); //设置位置状态信息

(5)在应用程序建立函数OnCreate()中增加工具条状态恢复功能 m_wndDockToolBar.SetColumns(AfxGetApp()->GetProfileInt( _T(\恢复列格式,默认为3 m_wndDockNextBar.SetColumns(AfxGetApp()->GetProfileInt( _T(\

LoadBarState(_T(\恢复保存的状态和位置 (6)在应用程序关闭函数OnClose()中完善状态保存功能 void CMainFrame::OnClose() { //保存工具条等的状态

SaveBarState(_T(\保存工具条状态

AfxGetApp()->WriteProfileInt(_T(\写入列数 _T(\AfxGetApp()->WriteProfileInt(_T(\

_T(\写入提示功能 WINDOWPLACEMENT wp; wp.length=sizeof wp;

if (GetWindowPlacement(&wp)){ wp.flags=0;

if (IsZoomed()) wp.flags|=WPF_RESTORETOMAXIMIZED; //如果窗口被放大,则保存为最大化状态 WriteWindowPlacement(&wp); }

CFrameWnd::OnClose(); }

虽然SaveBarState()和LoadBarState()函数保存和恢复了工具条的所有默认位置状态,但在实际自己实现的功能参数部分并不能被保存,所以应单独编写这些参数的保存代码,如工具栏的排列格式列参数值、颜色状态标志和是否存在动态提示功能标志等,在实际编程时一定要注意。

6.3.4 工具条的平面特性

工具条的平面特性给人耳目一新之感,很多大型应用程序中的工具条都采用这一特性,并取得了巨大成功。利用VC++5中的COMCTL32.DLL动态链接库可以实现平面式工具条,其主要解决问题包括:由于MFC使用风格控制位来控制工具条的外观,所以在建立工具条时不能直接设置这种风格,必须在建立后利用 SetFlatLookStyle()函数来修改;工具条控制本身也不在各级按钮之间绘制分隔线,其另一个任务就是截取WM_PAINT消息,并在相应的位置处增加分隔线;工具条控制也不绘制左边的把手(gripper) ,最后的任务就是调整客户区域并绘制并绘制相应的gripper。 显然,实际工作中需要动态链接库COMCTL32.DLL支持的上述方法很不方便。尽管最简便的方法是利用VC++ 5中的未公开工具栏风格TBSTYLE_FLAT,可以得到工具条的平面特性,只需在工具条建立后简单地增加一条代码 \,但笔者经试验发现这种方法存在两个严重错误:其一是所建立的平面工具条在移动时,不能自动清除移动前的按钮图标,使工具条画面杂乱无章;其二是当建立的平面工具条具有浮动

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库常用控件用法(6)在线全文阅读。

常用控件用法(6).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/658193.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: