65.9K
CodeProject 正在变化。 阅读更多。
Home

Sheet Tab 视图

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.22/5 (3投票s)

2002年8月2日

2分钟阅读

viewsIcon

98435

downloadIcon

3255

创建您自己的类似 MS Dev Studio 输出窗口的 Sheet Tab 视图

Sample Image - sheettabwithscroll.jpg

引言

我利用机会扩展了我早期一篇文章的范围,该文章基于 CFlatTabCtrl,创建了一个类似于 Microsoft Developer Studio 输出视图的选项卡式工作表视图。一个新的控件,名为 CSheetTabWindow,封装了 CFlatTabCtrl、分割条和 CScrollBar。然后,该控件(CSheetTabWindow)可以与主视图控件(例如 CEdit 控件)一起使用,以提供选项卡式工作表视图。附带的示例使用 CEdit 控件和选项卡(参见 CSheetTabWithScrollView)。

要求

您需要 WTL 库,可以从 Microsoft 网站下载。网上有很多文章介绍如何操作,所以我就不赘述了。

如何在你的 WTL 应用中使用此视图

  1. 你需要在你的 stdafx.h 文件中包含 atlmisc.h

  2. 创建一个类似于 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 来完成此操作。

  3. 使用 GetFlatTabCtrl()->InsertItem(..) 添加选项卡。

  4. 通过将 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;
    }
  5. 要接收选项卡被选中时的事件,请将 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;
    }

就这些

演示应用程序向你展示了如何完全使用它。

© . All rights reserved.