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

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

 2006-07-22 22:03:11 来源:WEB开发网   
核心提示: typedef CWinTraitsOR<LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER>CListTraits;class CClipSpyListCtrl :public CWindowImpl<CClipSpyListCt
typedef CWinTraitsOR<LVS_REPORT | LVS_SINGLESEL | LVS_NOSORTHEADER>
     CListTraits;
class CClipSpyListCtrl :
  public CWindowImpl<CClipSpyListCtrl, CListViewCtrl, CListTraits>,
  public CCustomDraw<CClipSpyListCtrl>
{
public:
  DECLARE_WND_SUPERCLASS(NULL, WC_LISTVIEW)
  BEGIN_MSG_MAP(CClipSpyListCtrl)
    MSG_WM_CHANGECBCHAIN(OnChangeCBChain)
    MSG_WM_DRAWCLIPBOARD(OnDrawClipboard)
    MSG_WM_DESTROY(OnDestroy)
    CHAIN_MSG_MAP_ALT(CCustomDraw<CClipSpyListCtrl>, 1)
    DEFAULT_REFLECTION_HANDLER()
  END_MSG_MAP()
//...
};

如果你看过前面的几篇文章就会很容易读懂这个类的代码。它响应WM_CHANGECBCHAIN消息,这样就可以知道是否启动和关闭了其它剪贴板查看程序,它还响应WM_DRAWCLIPBOARD消息,这样就可以知道剪贴板的内容是否改变。

由于分隔窗口窗格内的子窗口在程序运行其间一直存在,我们也可以将它们设为CMainFrame类的成员:

class CMainFrame : public ...
{
//...
protected:
  CSplitterWindow m_wndVertSplit;
  CClipSpyListCtrl m_wndFormatList;
  CRichEditCtrl  m_wndDataViewer;
};

创建一个窗格内的窗口

既然已经有了分隔窗口和子窗口的成员变量,填充分隔窗口就是一件简单的事情了。先创建分隔窗口,然后创建两个子窗口,使用分隔窗口作为它们的父窗口:

LRESULT CMainFrame::OnCreate ( LPCREATESTRUCT lpcs )
{
//...
  // Create the splitter window
const DWORD dwSplitStyle = WS_CHILD | WS_VISIBLE |
              WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
      dwSplitExStyle = WS_EX_CLIENTEDGE;
  m_wndVertSplit.Create ( *this, rcDefault, NULL,
              dwSplitStyle, dwSplitExStyle );
  // Create the left pane (list of clip formats)
  m_wndFormatList.Create ( m_wndVertSplit, rcDefault );
  // Create the right pane (rich edit ctrl)
const DWORD dwRichEditStyle =
       WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL |
       ES_READONLY | ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE;
  m_wndDataViewer.Create ( m_wndVertSplit, rcDefault,
               NULL, dwRichEditStyle );
  m_wndDataViewer.SetFont ( AtlGetStockFont(ANSI_FIXED_FONT) );
  // Set the splitter as the client area window, and resize
  // the splitter to match the frame size.
  m_hWndClient = m_wndVertSplit;
  UpdateLayout();
  m_wndVertSplit.SetSplitterPos ( 200 );
  return 0;
}

注意两个类的Create()函数都用m_wndVertSplit作为父窗口,RECT参数无关紧要,因为分隔窗口会重新调整它们的大小,所以可以使用CWindow::rcDefault。

上一页  2 3 4 5 6 7 8 9 10  下一页

Tags:MFC 程序员 WTL

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