• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            鐵觀音

            C++編程寶典

               ::  ::  ::  ::  :: 管理 ::
              1 隨筆 :: 19 文章 :: 0 評論 :: 0 Trackbacks
            簡 介】
              目前基于分割視圖的應用開發十分流行,分割視圖技術是在同一個框架窗口下同時顯示多個視圖的一項技術。運用分割視圖,可以在較短時間內給用戶更多的信息量,從而使得用戶界面更加的友好,增強了軟件的可操作性。本文提出一個分割視圖的通用創建框架。

            目前基于分割視圖的應用開發十分流行,分割視圖技術是在同一個框架窗口下同時顯示多個視圖的一項技術。運用分割視圖,可以在較短時間內給用戶更多的信息量,從而使得用戶界面更加的友好,增強了軟件的可操作性。本文提出一個分割視圖的通用創建框架。  

              1.分割視圖創建框架

              分割視圖的創建大體上分為兩個步驟:其一是創建分割窗體;然后就是處理鼠標和鍵盤等消息。

              1) 創建分割窗體

              MFC提供分割窗體類CsplitterWnd,它提供了很多對于分割窗體操作的成員函數,每一個分割窗體都是一個CsplitterWnd的對象。本文提出的框架由于需要對定制的分割窗體進行擴充處理,所以首先從CsplitterWnd繼承一個子類CFixSplitterWnd,然后每個分割窗體是一個CfixSplitterWnd的對象,這樣以后只需要對CfixSplitterWnd進行改寫后就可以增強分割窗體的功能。(后面將提出這種改寫)

              創建分割窗體最重要的函數是主框架類的OnCreateClient函數,它將在主框架創建的時候調用,本文將創建一個如下顯示的分割窗體:

            VC設計分割視圖通用創建框架
              

              則可以如下實現:  

              //成員變量聲明

              CFixSplitterWnd m_wndSplitterH; //用于橫向切割

              CFixSplitterWnd m_wndSplitterV; //用于縱向切割

              BOOL m_bCreateSplitter;  

              //分割窗體的實現

              BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)

              {

              //對整個主框架進行混合分割視圖

              BOOL bResult=m_wndSplitterV.CreateStatic(this,1,2);

              ASSERT(bResult);

              m_wndSplitterH.CreateStatic(&m_wndSplitterV,4,1,WS_CHILD   WS_VISIBLE,m_wndSplitterV.IdFromRowCol(0,1));

            //創建各自子窗片的對應的視圖

              m_wndSplitterV.CreateView(0,0,RUNTIME_CLASS(CSceneView),CSize(600,600),pContext);

              m_wndSplitterH.CreateView(0,0,RUNTIME_CLASS(CPitchView),CSize(100,100),pContext);

              m_wndSplitterH.CreateView(1,0,RUNTIME_CLASS(CYawView),CSize(100,100),pContext);

              m_wndSplitterH.CreateView(2,0,RUNTIME_CLASS(CRollView),CSize(100,100),pContext);

              m_wndSplitterH.CreateView(3,0,RUNTIME_CLASS(CControlView),CSize(100,100),pContext);

              //設置窗格的初始化的大小

              m_wndSplitterV.SetRowInfo(0,IDEAL_RAWHEIGHT,0);

              m_bCreateSplitter=TRUE;

              //激活sceneview使得其可以接受命令消息

              m_wndSplitterV.SetActivePane(0,0,NULL);

              return bResult;

              }

              //主框架窗體大小發生變化,調節相應的窗體大小

              void CMainFrame::OnSize(UINT nType, int cx, int cy)

              {

              CMDIFrameWnd::OnSize(nType, cx, cy);

              CRect rect;

              GetClientRect(rect);

              if (m_bCreateSplitter)?
            ??????{

              m_wndSplitterV.SetColumnInfo(0,rect.Width() *3/4,10);

              m_wndSplitterV.SetColumnInfo(1,rect.Width() *1/4,10);

              m_wndSplitterH.SetRowInfo(0,rect.Height() /6,10);

              m_wndSplitterH.SetRowInfo(1,rect.Height() /6,10);

              m_wndSplitterH.SetRowInfo(2,rect.Height() /6,10);

              m_wndSplitterH.SetRowInfo(3,rect.Height()/2,10);

              }

              m_wndSplitterV.RecalcLayout();

              m_wndSplitterH.RecalcLayout();

              }

              注意m_wndSplitterH.CreateView 中的第二個參數,這個參數將分割窗體和相應的視圖類相對應。

              通過上述的程序代碼即可創建圖1所示的分割窗體,那么由于這里每個分割窗體都是一個CfixSplitterWnd對象,所以可以通過改寫CfixSplitterWnd類的虛函數或消息處理函數來完成自己特定的應用實現。(注意,如果需要對定制有特定屬性的分割窗體,一定要派生自己的分割窗體類而不能是MFC的CsplitterWnd類)這里我們需要分割窗體不能隨鼠標拖動而改變其大小,即所有窗格的大小都是一定的,不能在運行時刻改變。所以必須在CfixSplitterWnd類的實現中加入如下代碼:  

              void CFixSplitterWnd::OnMouseMove(UINT nFlags, CPoint point)

              {

              CWnd::OnMouseMove(nFlags, point); //防止鼠標出現拖動狀

              // CSplitterWnd::OnMouseMove(nFlags, point); //鼠標會在窗體邊界出現拖動狀

              }

              至此,分割窗體已經創建完畢,下面需要在分割窗體里處理消息。

              2) 分割窗體處理消息

              在分割窗體里處理消息和一般的文檔視圖模型處理消息大致一樣,但它也有其特殊之處。具體來說,由于各個分割窗體已經與具體的視圖類相聯系了,所以在需要處理各個分割窗體中的消息時,可以直接到相應的視圖類中進行處理;另外,多視圖之間的切換會導致目標焦點之間的變更,這樣會影響菜單中與視圖有關的命令的執行。比如在圖1中所示的分割窗體中,有一個“開始”命令必須是焦點在CsceneView視圖上時才能執行,否則就應該讓該命令不能執行(即該菜單呈現灰色),則實現時可以首先對鼠標進行點擊測試,判斷是否在CsceneView視圖范圍內,如果是的話就允許執行,否則就不允許執行。

              2.結論

              通過本文提出的分割視圖創建框架,可以滿足對視圖進行復雜控制的需求,希望本文可以給大家一個啟發,從而能夠創建更為完美的分割視圖應用程序。
            posted on 2006-09-01 10:08 鐵觀音 閱讀(211) 評論(0)  編輯 收藏 引用 所屬分類: VC界面控件類
            午夜视频久久久久一区| 亚洲国产精品无码久久久秋霞2| 亚洲va久久久噜噜噜久久男同 | 久久久久女教师免费一区| 亚洲午夜无码AV毛片久久| 久久久无码精品亚洲日韩按摩| 精品久久一区二区三区| 香蕉久久久久久狠狠色| 久久香蕉国产线看观看精品yw| 国产高清美女一级a毛片久久w| 亚洲精品国产自在久久| 久久精品国产亚洲沈樵| 久久久久久久波多野结衣高潮 | 久久精品99无色码中文字幕| 色综合久久久久综合99| 狠狠色丁香久久婷婷综| 一本色综合久久| 亚洲国产天堂久久综合网站| 日韩精品久久久久久久电影蜜臀 | 亚洲AV日韩精品久久久久久| 久久精品国产99久久久香蕉| 久久综合香蕉国产蜜臀AV| 午夜精品久久久久久影视777 | 亚洲精品无码久久久久| 久久精品国产亚洲5555| 99久久精品日本一区二区免费| 国产精品久久久久免费a∨| 久久99热这里只有精品国产 | 久久久青草青青国产亚洲免观| 国产麻豆精品久久一二三| 性高湖久久久久久久久| 色欲av伊人久久大香线蕉影院| 无码精品久久一区二区三区| 久久精品夜色噜噜亚洲A∨| 国产成人99久久亚洲综合精品| 九九久久99综合一区二区| 色偷偷久久一区二区三区| 久久天天躁狠狠躁夜夜网站| 伊人久久大香线蕉av一区| 性高湖久久久久久久久| 国产精品国色综合久久|