下载本文示例代码
p> 微软在已经推出Visual C 6.0预览版几个月了。正式版预计到今年年底发布。同时,预览版显示出版本6将包含大量的改进和提高,包括支持Internet控件,例如扁平工具条等。虽然改进的控件包与Internet无关,但它首先出现在Internet Explorer中,因此它就被取做这个名字了。事实上,官方发布的预览版的标题是“针对Internet Explorer 4.0的Visual C 5.0技术预览”。
在以前关于MFC工具条类的讨论专题中,我曾答应提供一个在版本6中工具条的外观演示。有一个很好的消息,那就是你现在用CToolBar所作的所有工作在新的版本中都是有效的,包括那些在以前的栏目中所描述的一些扩展功能。因此,你将很容易修改现存的程序以获得象Internet Explorer和Visual Studio中那样“酷”的界面。此外,并没有什么坏消息。
工具条的新特色
早在版本4中,CToolBar就已被MFC库完全实现了。一旦公用控件动态链接库(命名为comctl32.dll)变得无所不在了,CToolBar就成了如今已包含在操作系统中的工具条控件的代名词了。然而,CToolBar并没有揭示公用工具条控件的所有能力。如今,通过CreateEx()函数,它成功了。
公用控件动态链接库现在包含了至少三类风格:最初的、在Internet Explorer3.0中加入的以及在Internet Explorer 4.0中加入的。虽然这些版本理论上是向下兼容的,但某些专业人员曾写出一些不能在后来版本中正常运行的应用程序,这可能是这些程序采用了一些没有公开的功能,而这些功能并没有被包含在所有的版本中。
Visual C 程序员没有这样的经历,因为在Visual C 4.0或5.0中comctl32.dll并不是一个可以再分发的组件,它在安装Internet Explorer时被更新,因此MFC程序员无法依靠最新版本的某些功能来用于他们的程序。这就是CToolBar仅仅具有最初的DLL的有限功能的原因。CToolBar能够实现最新的特色意味着微软将在Visual C 6.0中包含最新的DLL并将其作为一个可以再分发的组件。
绝大多数新特色将由在调用CreateEx()和其它CToolBar成员函数时指定的新的风格标志来确定。下面是commctrl.h的一部分,它定义了TBSTYLE类标识符:
#define TBSTYLE_BUTTON 0x0000
#define TBSTYLE_SEP 0x0001
#define TBSTYLE_CHECK 0x0002
#define TBSTYLE_GROUP 0x0004
#define TBSTYLE_CHECKGROU TBSTYLE_GROUP | TBSTYLE_CHECK)
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_DROPDOWN 0x0008
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_AUTOSIZE 0x0010
#define TBSTYLE_NOPREFIX 0x0020
#endif
#define TBSTYLE_TOOLTIPS 0x0100
#define TBSTYLE_WRAPABLE 0x0200
#define TBSTYLE_ALTDRAG 0x0400
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_FLAT 0x0800
#define TBSTYLE_LIST 0x1000
#define TBSTYLE_CUSTOMERASE 0x2000
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_REGISTERDROP 0x4000
#define TBSTYLE_TRANSPARENT 0x8000
#define TBSTYLE_EX_DRAWDDARROWS 0x00000001
#endif
你会注意到其中的一些采用了条件编译,依赖于_WIN32_IE的值,它缺省指的是Internet Explorer 4.0(即取值为0x0400)。对于Internet Explorer 3.0(即取值为0x0300)以前的版本,大多数的TBSTYLE标识符指的是按钮或是一组按钮。Internet Explorer3.0引入了扁平钮、文本标签、下拉列表和自定义绘制。Internet Explorer 4.0增强了下拉列表和自定义绘制功能,并且增加了支持OLE拖动目标到一个工具条。
扁平钮和把手
在过去的18个月中我常常被问及该如何获得象Internet Explorer和Visual Studio中的工具条一样不使用浮雕按钮而是用扁平钮并且带有便于移动和定位的把手那样酷的界面。这些特色并不被MFC所支持,因此最简单获取的方法就是购买一个扩展库。而对于Visual C 6.0来说却无须多此一举,因为它使得CToolBar类实现了对扁平钮、把手和其它新的视觉效果的支持。
在预览版中,AppWizard并不会自动包括这些新特色,但它们却很容易被加入。表1显示了AppWizard创建的主框架窗口的OnCreate()函数,表2显示了需要做哪些修改以获得具有扁平钮和把手的工具条。图1显示了表1创建出的工具条,而图2显示出了表2实现的工具条。
表 1: CMainFrame::OnCreate as generated by AppWizard
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.Create(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)))
图1
表2: Adding flat buttons and the gripper
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.CreateEx(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Remove this if you dont want tool tips or a resizeable
toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_GRIPPER | CBRS_BORDER_3D | CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS_SIZE_DYNAMIC);
// TODO: Delete these three lines if you dont want the toolbar
to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
图2
为了作出扁平按钮我必须使用CreateEx()来代替Create()。这个新的函数在afxext.h中声明:
BOOL CreateEx
(
CWnd* pParentWnd, // parent window
DWORD dwCtrlStyle = TBSTYLE_FLAT, // extended style
DWORD dwStyle = // style
WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
CRect rcBorders = CRect(0,0,0,0), // border rectangle
UINT nID = AFX_IDW_TOOLBAR // identifier
);
因为扩展风格缺省指的就是TBSTYLE_FLAT,因此我要得到扁平按钮就只需要简单地将AppWizard形成的代码中的Create()改为CreateEx()即可。我将在后面实现其它的扩展风格。为了获得把手,我必须在调用SetBarStyle()函数时包含CBRS_GRIPPER标志,参看表2。这是CControlBar类的一个新风格,而CToolBar类是从它继承而来的。请注意到我也加入了CBRS_BORDER_3D标志,这是为了修正一个未知的绘制问题,该问题将会在工具条的边缘绘制一些多余的点。这也许意味着预览版确实有这个问题,因为一旦我将3D标志加入就立即解决了并且也似乎没有影响到别的什么。
上面所作的两个简单的改变是使得一个已存程序获得酷界面的最省力的方法。在一个程序具有了扁平钮和把手的同时,它也不会发生不应有的其它改变。(未完)
p> 微软在已经推出Visual C 6.0预览版几个月了。正式版预计到今年年底发布。同时,预览版显示出版本6将包含大量的改进和提高,包括支持Internet控件,例如扁平工具条等。虽然改进的控件包与Internet无关,但它首先出现在Internet Explorer中,因此它就被取做这个名字了。事实上,官方发布的预览版的标题是“针对Internet Explorer 4.0的Visual C 5.0技术预览”。
在以前关于MFC工具条类的讨论专题中,我曾答应提供一个在版本6中工具条的外观演示。有一个很好的消息,那就是你现在用CToolBar所作的所有工作在新的版本中都是有效的,包括那些在以前的栏目中所描述的一些扩展功能。因此,你将很容易修改现存的程序以获得象Internet Explorer和Visual Studio中那样“酷”的界面。此外,并没有什么坏消息。
工具条的新特色
早在版本4中,CToolBar就已被MFC库完全实现了。一旦公用控件动态链接库(命名为comctl32.dll)变得无所不在了,CToolBar就成了如今已包含在操作系统中的工具条控件的代名词了。然而,CToolBar并没有揭示公用工具条控件的所有能力。如今,通过CreateEx()函数,它成功了。
公用控件动态链接库现在包含了至少三类风格:最初的、在Internet Explorer3.0中加入的以及在Internet Explorer 4.0中加入的。虽然这些版本理论上是向下兼容的,但某些专业人员曾写出一些不能在后来版本中正常运行的应用程序,这可能是这些程序采用了一些没有公开的功能,而这些功能并没有被包含在所有的版本中。
Visual C 程序员没有这样的经历,因为在Visual C 4.0或5.0中comctl32.dll并不是一个可以再分发的组件,它在安装Internet Explorer时被更新,因此MFC程序员无法依靠最新版本的某些功能来用于他们的程序。这就是CToolBar仅仅具有最初的DLL的有限功能的原因。CToolBar能够实现最新的特色意味着微软将在Visual C 6.0中包含最新的DLL并将其作为一个可以再分发的组件。
绝大多数新特色将由在调用CreateEx()和其它CToolBar成员函数时指定的新的风格标志来确定。下面是commctrl.h的一部分,它定义了TBSTYLE类标识符:
#define TBSTYLE_BUTTON 0x0000
#define TBSTYLE_SEP 0x0001
#define TBSTYLE_CHECK 0x0002
#define TBSTYLE_GROUP 0x0004
#define TBSTYLE_CHECKGROU TBSTYLE_GROUP | TBSTYLE_CHECK)
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_DROPDOWN 0x0008
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_AUTOSIZE 0x0010
#define TBSTYLE_NOPREFIX 0x0020
#endif
#define TBSTYLE_TOOLTIPS 0x0100
#define TBSTYLE_WRAPABLE 0x0200
#define TBSTYLE_ALTDRAG 0x0400
#if (_WIN32_IE $#@62;= 0x0300)
#define TBSTYLE_FLAT 0x0800
#define TBSTYLE_LIST 0x1000
#define TBSTYLE_CUSTOMERASE 0x2000
#endif
#if (_WIN32_IE $#@62;= 0x0400)
#define TBSTYLE_REGISTERDROP 0x4000
#define TBSTYLE_TRANSPARENT 0x8000
#define TBSTYLE_EX_DRAWDDARROWS 0x00000001
#endif
你会注意到其中的一些采用了条件编译,依赖于_WIN32_IE的值,它缺省指的是Internet Explorer 4.0(即取值为0x0400)。对于Internet Explorer 3.0(即取值为0x0300)以前的版本,大多数的TBSTYLE标识符指的是按钮或是一组按钮。Internet Explorer3.0引入了扁平钮、文本标签、下拉列表和自定义绘制。Internet Explorer 4.0增强了下拉列表和自定义绘制功能,并且增加了支持OLE拖动目标到一个工具条。
扁平钮和把手
在过去的18个月中我常常被问及该如何获得象Internet Explorer和Visual Studio中的工具条一样不使用浮雕按钮而是用扁平钮并且带有便于移动和定位的把手那样酷的界面。这些特色并不被MFC所支持,因此最简单获取的方法就是购买一个扩展库。而对于Visual C 6.0来说却无须多此一举,因为它使得CToolBar类实现了对扁平钮、把手和其它新的视觉效果的支持。
在预览版中,AppWizard并不会自动包括这些新特色,但它们却很容易被加入。表1显示了AppWizard创建的主框架窗口的OnCreate()函数,表2显示了需要做哪些修改以获得具有扁平钮和把手的工具条。图1显示了表1创建出的工具条,而图2显示出了表2实现的工具条。
表 1: CMainFrame::OnCreate as generated by AppWizard
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.Create(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)))
图1
表2: Adding flat buttons and the gripper
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if(CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if(!m_wndToolBar.CreateEx(this)||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if(!m_wndStatusBar.Create(this)||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
// TODO: Remove this if you dont want tool tips or a resizeable
toolbar
m_wndToolBar.SetBarStyle(m_wndToolBar.GetBarStyle() |
CBRS_GRIPPER | CBRS_BORDER_3D | CBRS_TOOLTIPS | CBRS_FLYBY |
CBRS_SIZE_DYNAMIC);
// TODO: Delete these three lines if you dont want the toolbar
to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return 0;
}
图2
为了作出扁平按钮我必须使用CreateEx()来代替Create()。这个新的函数在afxext.h中声明:
BOOL CreateEx
(
CWnd* pParentWnd, // parent window
DWORD dwCtrlStyle = TBSTYLE_FLAT, // extended style
DWORD dwStyle = // style
WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
CRect rcBorders = CRect(0,0,0,0), // border rectangle
UINT nID = AFX_IDW_TOOLBAR // identifier
);
因为扩展风格缺省指的就是TBSTYLE_FLAT,因此我要得到扁平按钮就只需要简单地将AppWizard形成的代码中的Create()改为CreateEx()即可。我将在后面实现其它的扩展风格。为了获得把手,我必须在调用SetBarStyle()函数时包含CBRS_GRIPPER标志,参看表2。这是CControlBar类的一个新风格,而CToolBar类是从它继承而来的。请注意到我也加入了CBRS_BORDER_3D标志,这是为了修正一个未知的绘制问题,该问题将会在工具条的边缘绘制一些多余的点。这也许意味着预览版确实有这个问题,因为一旦我将3D标志加入就立即解决了并且也似乎没有影响到别的什么。
上面所作的两个简单的改变是使得一个已存程序获得酷界面的最省力的方法。在一个程序具有了扁平钮和把手的同时,它也不会发生不应有的其它改变。(未完)
下载本文示例代码
Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色Visual C 版本6中工具条的新特色
阅读(159) | 评论(0) | 转发(0) |