WEB开发网
开发学院软件开发VC MFC程序员WTL指南(8)分隔窗口 阅读

MFC程序员WTL指南(8)分隔窗口

 2008-01-19 20:26:47 来源:WEB开发网   
核心提示:在分隔窗口中使用窗格容器为了说明窗格容器的使用方法,我们将向ClipSpy的分隔窗口的左窗格添加一个窗格容器,MFC程序员WTL指南(8)分隔窗口(6),我们将一个窗格容器指派给左窗格取代原来使用的list控件,而将list控件指派给窗格容器,将m_wndVertSplitter创建成m_wndHorzSplitter

在分隔窗口中使用窗格容器

为了说明窗格容器的使用方法,我们将向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控件

上一页  1 2 3 4 5 6 7  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接