小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

如何在MFC單文檔中創(chuàng)建多視圖

 浮 生 2009-06-10

如何在MFC單文檔中創(chuàng)建多視圖 2009-03-19 21:16

字號(hào):    

基本步驟如下:

1.首先創(chuàng)建一個(gè)MFC單文檔應(yīng)用程序。

2.添加4個(gè)MFC類TopLView、BottomLView、TopRView、BottomRView,基類為CView。

3.添加一個(gè)MFC類CControlForm,基類為CFormView,對(duì)話框ID默認(rèn)。

4.創(chuàng)建一個(gè)切分類,如MySplitter,基類為CSplitterWnd(默認(rèn)基類選項(xiàng)中無此類,自己添加即可)。

5.在框架類Cmainframe的頭文件中,添加2個(gè)MySplitter的變量(因?yàn)橄旅嬉M(jìn)行兩次切分操作)。

6.重寫框架類Cmainframe的OnCreateClient函數(shù),如下:

 //第一次靜態(tài)切分CreateStatic,一行兩列

if (!m_wndSplitter.CreateStatic(this,1,2)) 

  return FALSE;

//第二次靜態(tài)切分(將第一次切分后的第二列再分為2*2)及所有的子視圖創(chuàng)建(CreateView函數(shù))。

 if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CControlForm), CSize(100, 100), pContext) ||
  !m_wndSplitter2.CreateStatic(&m_wndSplitter,2,2,WS_CHILD|WS_VISIBLE,m_wndSplitter.IdFromRowCol(0, 1))||
  !m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(TopLView), CSize(350, 240), pContext) ||
  !m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(BottomLView), CSize(350, 240), pContext) ||
  !m_wndSplitter2.CreateView(0, 1, RUNTIME_CLASS(TopRView), CSize(350, 240), pContext) ||
  !m_wndSplitter2.CreateView(1, 1, RUNTIME_CLASS(BottomRView), CSize(350, 240),  pContext))
 {
  m_wndSplitter.DestroyWindow();
  return FALSE;
 }

// return CFrameWnd::OnCreateClient(lpcs, pContext);      //注釋掉原有的響應(yīng)函數(shù)

注意:記得在Mainfrm.h中添加以上五個(gè)視圖類的頭文件:

#include "CControlForm.h"
#include "TopLView.h"
#include "TopRView.h"
#include "BottomLView.h"
#include "BottomRView.h"

6. 切分視圖完成,結(jié)果如下:

 如何在MFC單文檔中創(chuàng)建多視圖 - 老柯 - 菜鳥的朝圣之路

其中,最左的視圖為FormView類型,操作類似對(duì)話框(可以在Resource-Dialog看到其對(duì)應(yīng)的對(duì)話框資源);右邊四個(gè)的操作則類似普通視圖。

 

補(bǔ)充內(nèi)容:

a. 此時(shí)創(chuàng)建的各個(gè)子視圖之間的分割條可以拖動(dòng),以改變視圖其大小。如果想固定分割條,則需要重載MySplitter類的鼠標(biāo)響應(yīng)函數(shù)??梢酝ㄟ^一個(gè)Bool型變量來控制是否可以拖動(dòng)分割條:

 if (Isvisable)  //Isvisable在構(gòu)造函數(shù)中已被初始為FALSE
 {
  CSplitterWnd::OnLButtonDown(nFlags, point);
 }

b. 還可以通過重載MySplitter類的OnDrawSplitter函數(shù)來改變分割條的樣式。以下為該函數(shù)代碼:

 #define LP RGB(128,128,128)
 #define RB RGB(192,192,192)

 //如果pDC 為 NULL則僅使分割窗口區(qū)域無效
 if (pDC == NULL)
 {
  RedrawWindow(rect, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
  return;
 }
 ASSERT_VALID(pDC);

 CRect rc = rect;
 
 switch(nType)
 {
 case splitBorder:
  //重畫分割窗口邊界
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1);
  pDC->Draw3dRect(rc,RB,RB);
  return;
 case splitBox:
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1);
  pDC->Draw3dRect(rc,LP,LP);
  rc.InflateRect(-1,-1);
  pDC->FillSolidRect(rc,RGB(128,128,128));
  pDC->Draw3dRect(rc,RB,RB);
  return;
 case splitBar:
  //重畫分割條
  pDC->FillSolidRect(rc,RGB(192,192,192));
  rc.InflateRect(-1,-1);
  pDC->Draw3dRect(rc,RB,RB);  
  return;
 default:
  ASSERT(FALSE);
 }
 //填充中間的部分
 pDC->Draw3dRect(rect, GetSysColor(COLOR_BTNSHADOW), GetSysColor(COLOR_BTNHIGHLIGHT));

注:以上程序在vs2008上調(diào)試成功。

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

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多