实现类似Excel和Visual C++里文件夹式样的标签控制(二)
2007-11-01 20:23:07 来源:WEB开发网核心提示:接下来,你必须自己添加一些视图代码,实现类似Excel和Visual C++里文件夹式样的标签控制(二)(3),其中最重要的事情是从CFolderView派生自己的视类,而不是从CScrollView类派生,如果你想用其它的算法也未尝不可,你可以计算宽度,因为要让标签控制和滚动条协调操作,所以这是问题的重点所在
接下来,你必须自己添加一些视图代码。其中最重要的事情是从CFolderView派生自己的视类,而不是从CScrollView类派生。因为要让标签控制和滚动条协调操作,所以这是问题的重点所在。如果你不使用滚动视图,那就不存在这个问题——你可以将标签控制创建成一个子视图。一旦你从CFolderView派生了自己的视类,那么便可以处理来自标签控制的通知消息。为此改写虚拟函数CFolderView::OnChangedFolder即可。当用户点击新的标签时,CFolderView便调用这个函数。这个函数的实现细节很简单,主要负责存储新标签页并重画视图:
void CDIBView::OnChangedFolder(int iPage)
{
m_iPage = iPage;
UpdateScrollSizes();
Invalidate();
}
记住不要忘了修改视图的OnDraw函数,让它绘制正确的标签页,改进后的程序需要在标签页之间来回切换,m_iPage表示页索引,它的值分别为0,1,2,三个标签页分别用来绘制图像、显示BITMAPINFOHEADER结构信息和显示十六进制数据。最后,你必须在CDIBView::OnInitialUpdate中加一行显示CFolderFrame框架控制的代码:
// 在 CDIBView::OnInitialUpdate 函数中
GetFolderFrame()->ShowControls(pDIB ? CFolderFrame::bestFit : CFolderFrame::hide);
CFolderFrame::ShowControls可以让你隐藏和显示标签控制和滚动条。这样当程序为SDI并且启动空框架时——也就是说没有文档/视。这时程序中的pDIB==NULL,CDIBView::OnInitialUpdate传递CFolderFrame::hide来隐藏控制;否则传递CFolderFrame::bestFit来指示CFolderFrame根据需要的宽度显示所有标签,然后用剩下的宽度显示滚动条。如果你想用其它的算法也未尝不可,你可以计算宽度,然后用这个调用CFolderFrame::ShowControls。
更多精彩
赞助商链接