<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jasmine214--love

    只有當你的內(nèi)心總是充滿快樂、美好的愿望和寧靜時,你才能擁有強壯的體魄和明朗、快樂或者寧靜的面容。
    posts - 731, comments - 60, trackbacks - 0, articles - 0

    CsplitterWnd--拆分窗口

    Posted on 2010-08-28 19:06 幻海藍夢 閱讀(3184) 評論(0)  編輯  收藏 所屬分類: C++

    http://www.cnblogs.com/feisky/archive/2010/03/07/1680222.html

    MFC支持兩種類型的拆分窗口:靜態(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ù)。

    你應(yīng)按如下步驟創(chuàng)建一個CSplitterWnd對象:

           1. 在父框架中嵌入一個CSplitterWnd成員變量。

      2. 重載父框架的CFrameWnd::OnCreateClient成員函數(shù)。

      3. 從重載的OnCreateClient函數(shù)中調(diào)用類CSplitterWnd的Create或CreateStatic成員函數(shù),并調(diào)用CreateView來創(chuàng)建視圖。

     

    使用靜態(tài)拆分窗口的一個優(yōu)點是由于您自己給窗格添加視圖,所以可以控制放入視圖的種類。

    關(guān)鍵函數(shù)

       BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle =
      WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );
      函數(shù)有5個參數(shù),意義如下:
      ● pParentWnd:切分窗口的父窗口指針
      ● nRows:水平方向分隔窗口的數(shù)目
      ● nCols:垂直方向分隔窗口的數(shù)目
      ● dwStyle:切分窗口的風(fēng)格
      ● nID:子窗口的ID值,默認為系統(tǒng)定義的AFX_IDW_PANE_FIRST
      返回值:如果創(chuàng)建成功,返回非零值(TRUE),否則返回0(FALSE)。
      m_wndSplitter.CreateStatic(this, 2,1); // 切分為2行1列
      
      virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass,
     SIZE sizeInit, CCreateContext* pContext );
      函數(shù)有5個參數(shù),意義如下:
      ● row:窗格的行標,從0開始
      ● col:窗格的列標,從0開始
      ● pViewClass:視圖的執(zhí)行期類CRuntimeClass指針,可以用宏RUNTIME_CLASS獲得
      ● sizeInit:一個SIZE(或者CSize)類型的數(shù)據(jù),指定窗格的初始大小
      ● pContext:一般是由父窗口傳遞過來,包含窗口的創(chuàng)建信息
      返回值:如果創(chuàng)建成功,返回非零值(TRUE),否則返回0(FALSE)。
       m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTest),CSize(190,100),pContext)

     

    image 

    實現(xiàn)的關(guān)鍵代碼

    BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
    {
    // TODO: Add your specialized code here and/or call the base class
    if(!m_wndSplitter.CreateStatic(this,1,2))
    {
    return FALSE;
    }
    CRect rect;
    GetClientRect(&rect);
    if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CTest),
                     CSize(rect.Width()/4,rect.Height()),pContext)||
    !m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CSplitterSDIView), 
                        CSize(rect.Width()/4*3,rect.Height()),pContext))
    {
    return FALSE;
    }
    return TRUE;
    }
    
    重載該函數(shù)之前需要做的步驟:
    1. 在CMainFrame類中添加protected成員CSplitterWnd m_wndSplitter;
    2. 建立對話框資源(IDD_FORMVIEW),并以CFormView類為基類建立相應(yīng)的視類;
    3. 重載OnCreateClient函數(shù)(如上述代碼)。
    4. 如果需要更多的劃分,則再添加其他的CSplitterWnd成員變量,但在m_wndSplitter2.CreateStatic()
       函數(shù)里的第一個參數(shù)則采用需要劃分的那個子視圖,如m_wndSplitter2.CreateStatic(&m_wndSplitter1,
       1, 2, WS_CHILD|WS_VISIBLE, m_wndSplitter1.IdFromRowCol(0,0)) ),當然也需要自己創(chuàng)建需要的所
       有視圖。

    多視類之間的交互

    在MFC程序中,各個視類之間進行數(shù)據(jù)交互是通過Doc類來完成的,由CDocument類來處理文檔,

    而由CView類來顯示。即將數(shù)據(jù)存儲到CDocument類中,而用到數(shù)據(jù)的時候再從該類中讀取。

    處理按鈕事件:
    void CTest::OnShowInt()
    {
    // TODO: Add your control notification handler code here
    CSplitterSDIDoc* pDoc =(CSplitterSDIDoc*) GetDocument();
    UpdateData(TRUE);
    pDoc->x=m_int;
    pDoc->UpdateAllViews(NULL);
    }
    在CSplitterSDIView中顯示:
    void CSplitterSDIView::OnDraw(CDC* pDC)
    {
    CSplitterSDIDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    // TODO: add draw code for native data here
    CString str;
    str.Format("%d", pDoc->x);
    pDC->TextOut(0,0,str);
    }
     

    CSplitterWnd類的其他成員信息

    有關(guān)該類的其他成員函數(shù),可以參考MSDN。

    其他信息

    鎖定切分條
    當用戶創(chuàng)建好分割窗口后,有時并不希望通過拖動切分條來調(diào)節(jié)窗口的大小。這時就必須鎖定切分條。鎖定切分條的最簡單的
    方法莫過于不讓CSplitterWnd來處理WM_LBUTTONDOWN,WM_MOUSEMOVE,WM_SETCURSOR消息,而是將這些消
    息交給CWnd窗口進行處理,從而屏蔽掉這些消息。拿WM_LBUTTONDOWN處理過程來說。修改為如下:
    void CXXSplitterWnd::OnLButtonDown(UINT nFlags,CPoint point) 
    { CWnd::OnLButtonDown(nFlags,point);}
    其余的處理方法類似。
    切分條的定制 
    由Window自己生成的切分條總是固定的,沒有任何的變化,我們在使用一些軟件比如ACDSee的時候卻能發(fā)現(xiàn)它們的切分條
    卻是和自動生成的切分條不一樣的。那么如何定制自己的切分條呢?通過重載CSplitterWnd的虛方法OnDrawSplitter和
    OnInvertTracker可以達到這樣的目的。下面的代碼生成的效果是分割窗口的邊界顏色為紅色,分割條的顏色為綠色.代碼如下:
    void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &rectArg){ 
                     if(pDC==NULL)
                       {
                       RedrawWindow(rectArg,NULL,RDW_INVALIDATE|RDW_NOCHILDREN);
                      return;
                      } 
                      ASSERT_VALID(pDC); 
                     CRect rc=rectArg; 
                     switch(nType)
                       { 
                      case splitBorder: 
                     //重畫分割窗口邊界,使之為紅色 
                              pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0));  
                            rc.InflateRect(-CX_BORDER,-CY_BORDER); 
                              pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0)); 
                                        return;
                       case splitBox:  
                            pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
                              rc.InflateRect(-CX_BORDER,-CY_BORDER); 
                              pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0)); 
                             rc.InflateRect(-CX_BORDER,-CY_BORDER);
                              pDC->FillSolidRect(rc,RGB(0,0,0)); 
                              pDC->Draw3dRect(rc,RGB(0,0,0),RGB(0,0,0));
                              return; 
                      case splitBar:  
                     //重畫分割條,使之為綠色  
                             pDC->FillSolidRect(rc,RGB(255,255,255));
                              rc.InflateRect(-5,-5); 
                              pDC->Draw3dRect(rc,RGB(255,0,0),RGB(255,0,0)); 
                                        return;  
                     default:
                               ASSERT(FALSE);
                       } 
                      pDC->FillSolidRect(rc,RGB(0,0,255));
    }
     void CSplitterWndEx::OnInvertTracker(CRect &rect) 
    {                   ASSERT_VALID(this); 
                     ASSERT(!rect.IsRectEmpty()); 
                      ASSERT((GetStyle()&WS_CLIPCHILDREN)==0);
                      CRect rc=rect;  
                     rc.InflateRect(2,2);
                      CDC* pDC=GetDC(); 
                      CBrush* pBrush=CDC::GetHalftoneBrush(); 
                     HBRUSH hOldBrush=NULL; 
                     if(pBrush!=NULL) hOldBrush=(HBRUSH)SelectObject(pDC->m_hDC,pBrush->m_hObject);
                      pDC->PatBlt(rc.left,rc.top,rc.Width(),rc.Height(),BLACKNESS);  
                               if(hOldBrush!=NULL)
                       SelectObject(pDC->m_hDC,hOldBrush);
                      ReleaseDC(pDC); 
    } 
    同樣我們只要繼承CSplitterWnd中的其余的一些虛擬方法就可以生成具有自己個性的分割窗口了。
    主站蜘蛛池模板: h片在线免费观看| 夫妻免费无码V看片| 亚洲视频在线免费看| 无码人妻一区二区三区免费手机 | 亚洲视频在线免费看| 免费观看的av毛片的网站| 污视频网站在线观看免费| 亚洲国产精品一区二区第一页 | 国产亚洲午夜精品| 亚洲人JIZZ日本人| 两个人的视频高清在线观看免费 | 免费无码婬片aaa直播表情| 国产亚洲AV夜间福利香蕉149| 99爱在线精品视频免费观看9| 亚洲免费综合色在线视频| 久久久久国产亚洲AV麻豆| 国产高清免费视频| 人妖系列免费网站观看| 亚洲成a人片在线网站| 亚洲精品无码你懂的网站| 天天影视色香欲综合免费| 九九视频高清视频免费观看| 亚洲国产超清无码专区| 国产精品亚洲精品日韩已方| 久久精品女人天堂AV免费观看| 怡红院免费全部视频在线视频| 亚洲精品天堂无码中文字幕| 亚洲av永久无码精品网站| 四虎影视在线永久免费看黄| 蜜臀AV免费一区二区三区| 一区二区三区免费视频网站| 在线观看日本亚洲一区| 亚洲电影一区二区| 亚洲人成网男女大片在线播放| 亚洲国产午夜中文字幕精品黄网站| 精品免费久久久久久久| 野花香高清在线观看视频播放免费| 国产精品手机在线亚洲| 亚洲人成网站在线观看播放动漫 | 亚洲一级特黄无码片| 成年18网站免费视频网站|