Sheet Tab 视图






3.22/5 (3投票s)
2002年8月2日
2分钟阅读

98435

3255
创建您自己的类似 MS Dev Studio 输出窗口的 Sheet Tab 视图
引言
我利用机会扩展了我早期一篇文章的范围,该文章基于 CFlatTabCtrl,创建了一个类似于 Microsoft Developer Studio 输出视图的选项卡式工作表视图。一个新的控件,名为 CSheetTabWindow
,封装了 CFlatTabCtrl
、分割条和 CScrollBar
。然后,该控件(CSheetTabWindow
)可以与主视图控件(例如 CEdit
控件)一起使用,以提供选项卡式工作表视图。附带的示例使用 CEdit
控件和选项卡(参见 CSheetTabWithScrollView
)。
要求
您需要 WTL 库,可以从 Microsoft 网站下载。网上有很多文章介绍如何操作,所以我就不赘述了。
如何在你的 WTL 应用中使用此视图
你需要在你的 stdafx.h 文件中包含 atlmisc.h。
创建一个类似于
CSheetTabWithScrollView
的视图类。如果你不需要CEdit
控件,请将其替换为你选择的控件。在OnCreate
方法中创建CSheetTabWindow
控件和主视图控件(例如CEdit
),然后在OnSize
方法中调整它们的大小。LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LRESULT lRes = DefWindowProc(uMsg,wParam,lParam); CRect rcPos(0, 0, 0, 0); m_ctlEdit.Create(*this, rcPos, NULL, WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_WANTRETURN); // set the scrolling information for the edit control m_ctlEdit.SetFont(m_Font); m_ctlEdit.SetScrollRange(SB_HORZ, 0, 1000); m_ctlEdit.SetScrollPos(SB_HORZ, 0); // importnat - need to hide the scroll bar on the edit contol as we are // going to use our own m_ctlEdit.ShowScrollBar(SB_HORZ, FALSE); m_ctlSheet.Create(*this,rcPos, NULL,WS_CHILD| WS_VISIBLE); m_ctlSheet.GetFlatTabCtrl()->InsertItem(0,_T("Build")); m_ctlSheet.GetFlatTabCtrl()->InsertItem(1, _T("Debug")); m_ctlSheet.GetFlatTabCtrl()->InsertItem(2, _T("FindinFile 1")); m_ctlSheet.GetFlatTabCtrl()->InsertItem(3, _T("FindinFile 2")); m_ctlSheet.GetFlatTabCtrl()->InsertItem(4,_T("Results")); m_ctlSheet.GetFlatTabCtrl()->InsertItem(5, _T("SQL Debugging")); m_ctlSheet.SetViewScrollRange(0, 1000, 100); WriteLotsofText(); return lRes; }
你需要为你的主控件设置滚动信息,只需使用
SetScrollRange
即可。另外请注意,你必须隐藏主控件的滚动条,可以使用ShowScrollBar
来完成此操作。使用
GetFlatTabCtrl()->InsertItem(..)
添加选项卡。通过将
OnHScroll
宏添加到消息映射中来处理主控件的滚动事件。MESSAGE_HANDLER(WM_HSCROLL, OnHScroll)
在
OnHScroll
处理程序中,滚动你的主控件。LRESULT OnHScroll(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { if (m_ctlSheet.m_hWnd) { // Simply send the scrolling info to the edit control m_ctlEdit.SendMessage(uMsg, wParam, lParam); } return 0; }
要接收选项卡被选中时的事件,请将
OnNotify
宏添加到消息映射中。MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
在
OnNotify
处理程序中,捕获这些事件。LRESULT OnNotify(UINT /*uMsg*/, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { ATLASSERT(::IsWindow(m_hWnd)); NMHDR* pNMHDR = (NMHDR*)lParam; LRESULT lResult = 0; // handle messages from the flat tab control itself if (IDC_FLATTAB == (UINT)wParam) { CString sBuff; int nChoice; switch(pNMHDR->code) { case TCN_SELCHANGING: break; case TCN_SELCHANGE: nChoice = m_ctlSheet.GetFlatTabCtrl()->GetCurSel(); sBuff.Format("Selected Tab Index %d", nChoice); if (nChoice == 1) WriteLotsofText(); else m_ctlEdit.SetWindowText(sBuff); break; default: bHandled = FALSE; // not handled } } return lResult; }
就这些
演示应用程序向你展示了如何完全使用它。