MFC程序员WTL指南(8)分隔窗口
2008-01-19 20:26:47 来源:WEB开发网在分隔窗口中使用窗格容器
为了说明窗格容器的使用方法,我们将向ClipSpy的分隔窗口的左窗格添加一个窗格容器,我们将一个窗格容器指派给左窗格取代原来使用的list控件,而将list控件指派给窗格容器。下面是在CMainFrame::OnCreate()中为支持窗格容器而添加的代码。
LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
{
//...
m_wndVertSplit.Create ( *this, rcDefault, NULL, dwSplitStyle, dwSplitExStyle );
// Create the pane container.
m_wndPaneContainer.Create ( m_wndVertSplit, IDS_LIST_HEADER );
// Create the left pane (list of clip formats)
m_wndFormatList.Create ( m_wndPaneContainer, rcDefault );
//...
// Set up the splitter panes
m_wndPaneContainer.SetClient ( m_wndFormatList );
m_wndVertSplit.SetSplitterPanes ( m_wndPaneContainer, m_wndDataViewer );
注意,现在list控件的父窗口是m_wndPaneContainer,同时m_wndPaneContainer被设定成分隔窗口的左窗格。
下面是修改后的左窗格的外观,由于窗格容器在顶部的文本区域自己画了一个三维边框,所以我还要稍微修改一下边框的样式。这样看起来不是很好看,你可以自己调整样式知道你满意为止。(当然,你需要在Windows XP 上测试一下哪个界面主题可以使得分隔窗口看起来“更有意思”。)
关闭按钮和消息处理
当用户用鼠标单击Close按钮时,窗格容器向父窗口发送一个WM_COMMAND消息,命令的ID是ID_PANE_CLOSE。如果你在分隔窗口中使用了窗格容器,你需要响应整个消息,调用SetSinglePaneMode()隐藏这个窗格。(但是,不要忘了提供用户一个重新显示窗格的方法!)
CPaneContainer的消息链也用到了FORWARD_NOTIFICATIONS()宏,和CSplitterWindow一样,窗格容器在客户窗口和它的父窗口之间传递通知消息。在ClipSpy这个例子中,在list控件和主框架窗口之间隔了两个窗口(窗格容器和分隔窗口),但是FORWARD_NOTIFICATIONS()宏可以确保所有的通知消息被送到主框架窗口。
高级功能
在这一节,我将介绍一些如何使用WTL的高级界面特性。
嵌套的分隔窗口
如果你要编写一个email的客户端程序,你可能需要使用嵌套的分隔条,一个水平的和一个垂直的分隔条。使用WTL很容易做到这一点:创建一个分隔窗口作为另一个分隔窗口的子窗口。
为了演示这种效果,我将为ClipSpy添加一个水平分隔窗口。首先,添加一个名为m_wndHorzSplitter的CHorSplitterWindow类型的成员,像创建垂直分隔窗口m_wndVertSplitter那样创建这个水平分隔窗口,使水平分隔窗口m_wndHorzSplitter成为顶层窗口,将m_wndVertSplitter创建成m_wndHorzSplitter的子窗口。最后将m_hWndClient设置为m_wndHorzSplitter,因为现在水平分隔窗口占据整个主框架窗口的客户区。
LRESULT CMainFrame::OnCreate()
{
//...
// Create the splitter windows.
m_wndHorzSplit.Create ( *this, rcDefault, NULL,
dwSplitStyle, dwSplitExStyle );
m_wndVertSplit.Create ( m_wndHorzSplit, rcDefault, NULL,
dwSplitStyle, dwSplitExStyle );
//...
// Set the horizontal splitter as the client area window.
m_hWndClient = m_wndHorzSplit;
// Set up the splitter panes
m_wndPaneContainer.SetClient ( m_wndFormatList );
m_wndHorzSplit.SetSplitterPane ( SPLIT_PANE_TOP, m_wndVertSplit );
m_wndVertSplit.SetSplitterPanes ( m_wndPaneContainer, m_wndDataViewer );
//...
}
最终的结果是这个样子的:
在窗格中使用ActiveX控件
更多精彩
赞助商链接