乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      CSplitterWnd 輕松實現(xiàn)單文檔拆分視圖

       waxcumt 2012-01-05
      CSplitterWnd 輕松實現(xiàn)單文檔拆分視圖
      2009-04-16 下午 6:41

      該部分主要介紹一些基本概念和創(chuàng)建拆分視圖的一般過程。

      MFC支持兩種類型的拆分窗口:靜態(tài)的和動態(tài)的。這里只探討靜態(tài)拆分,不過首先還是要熟悉一下這些概念。

      靜態(tài)拆分窗口的行列數(shù)在拆分窗口被創(chuàng)建時就設(shè)置好了,用戶不能更改。但是用戶可以縮放各行各列。一個靜態(tài)拆分窗口最多可以包含16行16列。要找一個使用了靜態(tài)拆分窗口的應(yīng)用程序,只要看一下windows管理器即可。

      動態(tài)拆分窗口最多可以有兩行兩列,但它們可以相互拆分和合并。Vc就使用了動態(tài)拆分窗口使得可以同時編輯源程序文件的兩個以上不同的部分。

      選擇靜態(tài)或動態(tài)拆分的一個準則是是否希望用戶能夠交互地修改拆分窗口的行列配置。 另一個決定因素是計劃在拆分窗口中使用的視圖種類。在靜態(tài)拆分窗口中很容易使用兩個以上不同種類的視圖,因為您可以在每個窗格中指定所用的視圖類型。但是 在動態(tài)拆分窗口中,MFC管理著視圖,除非從 CsplitterWnd派生一個新類并修改拆分窗口的默認操作性能,否則拆分窗口中的所有視圖使用的都是相同的視圖類。

      靜態(tài)拆分窗口是用CsplitterWnd::CreateStatic而不是 CsplitterWnd::Create創(chuàng)建,并且由于MFC不會自動創(chuàng)建靜態(tài)拆分窗口中顯示的視圖,所以您要親自在CreateStatic返回之后 創(chuàng)建視圖。CsplitterWnd為此提供了名為 CreateView的函數(shù)。給框架窗口添加靜態(tài)拆分視圖的過程如下:

      給框架窗口類添加一個CsplitterWnd數(shù)據(jù)成員。

      覆蓋框架窗口的OnCreateClient函數(shù),并調(diào)用CsplitterWnd::CreateStatic來創(chuàng)建靜態(tài)拆分視圖。

      使用CsplitterWnd:: CreateView在每個靜態(tài)拆分窗口的窗格中創(chuàng)建視圖。

      使用靜態(tài)拆分窗口的一個優(yōu)點是由于您自己給窗格添加視圖,所以可以控制放入視圖的種類。
      下列中創(chuàng)建的靜態(tài)拆分窗口包含了兩種不同的視圖:

      BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CcreateContext* pContext)
      {
      if(!m_wndSplitter.CreateStatic(this, 1, 2) ||
      !m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CtextView), Csize(128, 0), pContext) ||
      !m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CpictureView), Csize(0, 0),pContext) )
      return FALSE;
      return TRUE;
      }

      傳遞給CreateStatic的參數(shù)指定了拆分窗口的父親以及拆分窗口包含的行 列數(shù)。對每個窗格調(diào)用一次CreateView。用從0開始的行列編號來標示窗格。在上面的代碼中,第一次調(diào)用CreateView在左窗格(0行0列) 中加入類型為CtextView的視圖,第二次調(diào)用在右窗格(0行 1列)加入類型為CpictureView的視圖。傳遞給CreateView的Csize對象指定了窗格的初始尺寸。在上面的代碼 中,CtextView窗格的初始寬度為128象素,CpictureView窗格將占據(jù)剩余的窗口寬度。指定右窗格寬度的值和指定兩個窗格高度的值都是 0,這是因為主結(jié)構(gòu)會忽略它們。

      下面以一個單文檔程序為例,說明靜態(tài)拆分視圖的實現(xiàn)過程:

      1. 首先建立一個單文檔應(yīng)用程序SplitWnd,視圖CSplitWndView類型為列表視圖。利用 CSplitWndView ::OnInitialUpdate初始化列表視圖。

      2. 為該工程新增一個樹型視圖類CMyTreeView,并在該類中添加HTREEITEM類型的成員變量 m_hSubTree[2],該成員變量用來保存樹型視圖的子樹句柄。利用CMyTreeView ::OnInitialUpdate初始化樹型視圖,為該樹型視圖添加一個樹根,兩個子樹,參考代碼如下:

      HTREEITEM hRoot = GetTreeCtrl().InsertItem(_T("樹根"), 。。。, 。。。, TVI_ROOT);

      m_hSubTree[0] = GetTreeCtrl().InsertItem(_T("子樹1"), 。。。, 。。。, hRoot);

      m_hSubTree [1] = GetTreeCtrl().InsertItem(_T("子樹2"), 。。。, 。。。, hRoot);

      在框架類中添加一個CSplitterWnd 類型的成員變量m_wndSplitter1,并重載OnCreateClient函數(shù)來拆分視圖,代碼如下:

      BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
      {
      if(!(m_wndSplitter1.CreateStatic(this, 1, 2) ) ||

                    !(m_wndSplitter1.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) ) ||

                    !(m_wndSplitter1.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) ) )

             {
                    return FALSE;
             }
            return TRUE;
      }

      如果你設(shè)計的程序需要更多的拆分視圖,可以再在框架類中添加CSplitterWnd 類型的成員變量m_wndSplitter2,再次利用CreateStatic拆分視圖,代碼如下:

      BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
      {
      if(!(m_wndSplitter1.CreateStatic(this, 2, 1) ) ||

                    !(m_wndSplitter1.CreateView(1, 0, RUNTIME_CLASS(CMyListView), CSize(0,0), pContext) ) ||

                    !(m_wndSplitter2.CreateStatic(&m_wndSplitter1, 1, 2, WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0)) ) ||

                    !(m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CMyTreeView), CSize(180 ,0), pContext) ) ||

                    !(m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(CSplitWndView), CSize(0,0), pContext) )
             )

      {
                    return FALSE;
             }

             m_wndSplitter1.SetRowInfo(0, 350, 0); //重新設(shè)置行寬
             m_wndSplitter1.RecalcLayout();
             return TRUE;
      }

      現(xiàn)在基本的界面就建立好了,有關(guān)初始化列表視圖的代碼要根據(jù)具體情況來添加。另外,別忘記在框架.cpp中包含視圖類的頭文件。
      當你在CMainFrame中加入 #include "CSplitWndView.h"可能會報錯
      error C2143: syntax error   : missing ';' before '*'
      error C2501: 'CSplitWndDoc' : missing storage-class or type specifiers
      error C2501: 'GetDocument' : missing storage-class or type specifiers
      因為我要在CChildFrame的onCreateClient中創(chuàng)建窗口的靜態(tài)分割。
      最后的解決方法是:
      是在自己要使用的View類的.h文件中加入下面一句聲明:
      class CSplitWndDoc;


      為了視類之間的通訊,我們讓這些視類共用一個文檔類,現(xiàn)在來編寫視圖之間通訊的代碼:

      1.在文檔類中添加int m_nViewType,表示要顯示的類型。當用戶單擊“子樹1”或“子樹2”時改變其值。

      2.建立樹型視圖通知TVN_SELCHANGED響應(yīng)函數(shù)OnSelchanged,添加如下代碼:

      CSplitWndDoc* m_pDoc = (CSplitWndDoc*)GetDocument();

      HTREEITEM hTmp = GetTreeCtrl().GetSelectedItem(); //得到當前選中的子樹句柄


      //將m_pDoc->m_nViewType復(fù)位

      m_pDoc->m_nViewType = 1000;

      if(hTmp == m_hSubTree [0] && m_pDoc)
      {
             m_pDoc->m_nViewType = 0;       //將顯示類型設(shè)置為子樹1
      }
      if(hTmp == m_hSubTree [1] && m_pDoc)  
      {
      m_pDoc->m_nViewType = 1; //將顯示類型設(shè)置為子樹2
      }
      //在改變子樹的情況下才刷新CSplitWndView視圖
      if(hTmp == m_hSubTree [0] || hTmp == m_hSubTree [1] && m_pDoc)
      {
             //通知視圖更新CSplitWndView
             m_pDoc->UpdateAllViews(this);
      }

      3.在CSplitWndView中重載OnUpdate函數(shù),響應(yīng)UpdateAllViews。
      CSplitWndDoc* pDoc = GetDocument();
      GetListCtrl().DeleteAllItems();            //刪除列表視圖中的項
             switch(pDoc->m_nViewType)        //查看視圖類型
             {
             case 0:
                    //將與子樹1相關(guān)的項添加到列表視圖中
                    break;
             case 1:
                    //將與子樹2相關(guān)的項添加到列表視圖中
                    break;
             }

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多