MFC程序员WTL指南(8)分隔窗口
2008-01-19 20:26:47 来源:WEB开发网介绍
随着使用两个分隔的视图管理文件系统的资源管理器在Windows 95中第一次出现,分隔窗口逐渐成为一种流行的界面元素。MFC也有一个复杂的功能强大的分隔窗口类,但是要掌握它的用法确实有点难,并且它和文档/视图框架联系紧密。在第七章我将介绍WTL的分隔窗口,它比MFC的分隔窗口要简单一些。WTL的分隔窗口没有MFC那么多特性,但是易于使用和扩展。
本章的例子工程是用WTL重写的ClipSpy,如果你对这个程序不太熟悉,现在可以快速浏览一下本章内容,因为我只是复制了ClipSpy的功能而没用深入的解释它是如何工作的,毕竟这篇文章的重点是分隔窗口,不是剪贴板。
WTL 的分隔窗口
头文件atlsplit.h含有所有WTL的分隔窗口类,一共有三个类:CSplitterImpl,CSplitterWindowImpl和CSplitterWindowT,不过你通常只会用到其中的一个。下面将介绍这些类和它们的基本方法。
相关的类
CSplitterImpl是一个有两个参数的模板类,一个是窗口界面类的类名,另一个是布尔型变量表示分隔窗口的方向:true表示垂直方向,false表示水平方向。CSplitterImpl类包含了几乎所有分隔窗口的实现代码,它的许多方法是可重载的,重载这些方法可以自己绘制分隔条的外观或者实现其它的效果。CSplitterWindowImpl类是从CWindowImpl和CSplitterImpl两个类派生出来的,但是它的代码不多,有一个空的WM_ERASEBKGND消息处理函数和一个WM_SIZE处理函数用于重新定位分隔窗口。
最后一个是CSplitterWindowT类,它从CSplitterImpl类派生,它的窗口类名是“WTL_SplitterWindow”。还有两个自定义数据类型通常用来取代上面的三个类:CSplitterWindow用于垂直分隔窗口,CHorSplitterWindow用于水平分隔窗口。
创建分割窗口
由于CSplitterWindow是从CWindowImpl类派生的,所以你可以像创建其他子窗口那样创建分隔窗口。分隔窗口将存在于整个主框架窗口的生命周期,应该在CMainFrame类添加一个CSplitterWindow类型的变量。在CMainFrame::OnCreate()函数内,你可以将分隔窗口作为主窗口的子窗口创建,然后将其设置为主窗口的客户区窗口:
LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
{
// ...
const DWORD dwSplitStyle = WS_CHILD | WS_VISIBLE |
WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
dwSplitExStyle = WS_EX_CLIENTEDGE;
m_wndSplit.Create ( *this, rcDefault, NULL,
dwSplitStyle, dwSplitExStyle );
m_hWndClient = m_wndSplit;
}
创建分隔窗口之后,你就可以为每个窗格指定窗口或者做其他必要的初始化工作。
基本方法
bool SetSplitterPos(int xyPos = -1, bool bUpdate = true)
int GetSplitterPos()
可以调用SetSplitterPos()函数设置分隔条的位置,这个位置表示分割条距离分隔窗口的上边界(水平分隔窗口)或左边界(垂直分隔窗口)有多少个象素点。你可以使用默认值-1将分隔条设置到分隔窗口的中间,使两个窗格大小相同,通常传递true给bUpdate参数表示在移动分隔条之后相应的改变两个窗格的大小。GetSplitterPos()返回当前分隔条的位置,这个位置也是相对于分隔窗口的上边界或左边界。
bool SetSinglePaneMode(int nPane = SPLIT_PANE_NONE)
int GetSinglePaneMode()
更多精彩
赞助商链接