有關MFC中靜態分割視窗的一點總結

2021-06-20 19:17:08 字數 3802 閱讀 2121

這兩天遇到在mfc中靜態分割視窗的操作,需要把以前專案中的四分平均視窗重新劃分為三分視窗,去掉其中乙個不需要的檢視類,使得左側為乙個檢視類,佔整個視窗的一半;右側為上下兩個均分檢視類,每個檢視類佔四分之一視窗。

在修改過程中遇到了一點問題,現在說一下。

開始的專案中視窗布局是這樣的:

**如下:

crect rc;

getclientrect(&rc);

m_wndsplitter.createstatic(this,2,1);

m_wndsplitter1.createstatic(&m_wndsplitter,1,2,ws_child|ws_visible,m_wndsplitter.idfromrowcol(0,0));

m_wndsplitter1.createview(0,0,runtime_class(cvideograbview),csize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pcontext);

m_wndsplitter1.createview(0,1,runtime_class(cvideoview1),csize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pcontext);

m_wndsplitter2.createstatic(&m_wndsplitter,1,2,ws_child|ws_visible,m_wndsplitter.idfromrowcol(1,0));

m_wndsplitter2.createview(0,0,runtime_class(cpicview),csize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pcontext);

m_wndsplitter2.createview(0,1,runtime_class(cgisview),csize((rc.right-rc.left)/2, (rc.bottom-rc.top)/2),pcontext);

ps:cvideograbview為主檢視類,cvideoview1、cpicview、cgisview

為自己新增的檢視類。

現在需要把右下角的檢視類放到左側,把左上和右上的兩個檢視類放到右側上下均分,去掉cpicview檢視類,如圖所示:

開始的**如下:

crect rc;

getclientrect(&rc);

//建立分割視窗1行2列

if(m_wndsplitter.createstatic(this,1,2) == null)

return false;

//建立gis的檢視位置

m_wndsplitter.createview(0,0,runtime_class(cgisview),csize(rc.width()/2,rc.height()), pcontext);

//為子視窗建立分割視窗 idfromrowcol(0,1)中的(0,1)記錄的是將要分割的位置,即未顯示的那個部分(0,1)

m_wndsplitter1.createstatic(&m_wndsplitter,2,1,ws_child|ws_visible,m_wndsplitter.idfromrowcol(0,1));

//建立監視器檢視位置

m_wndsplitter1.createview(0,0,runtime_class(cvideograbview),csize(rc.width()/2, rc.height()/2),pcontext);

m_wndsplitter1.createview(1,0,runtime_class(cvideoview1),csize(rc.width()/2, rc.height()/2),pcontext);

可編譯後執行時軟體鎖死無法執行,上網查了查資料,覺得有可能是因為必須先把cvideograbview主檢視類建立後才能繼續分割,所以把**調整如下:

crect rc;

getclientrect(&rc);

//建立分割視窗1行2列

if(m_wndsplitter.createstatic(this,1,2) == null)

return false;

//建立gis的檢視位置

m_wndsplitter.createview(0,0,runtime_class(cvideograbview),csize(rc.width()/2,rc.height()), pcontext);

//為子視窗建立分割視窗 idfromrowcol(0,1)中的(0,1)記錄的是將要分割的位置,即未顯示的那個部分(0,1)

m_wndsplitter1.createstatic(&m_wndsplitter,2,1,ws_child|ws_visible,m_wndsplitter.idfromrowcol(0,1));

//建立監視器檢視位置

m_wndsplitter1.createview(0,0,runtime_class(cgisview),csize(rc.width()/2, rc.height()/2),pcontext);

m_wndsplitter1.createview(1,0,runtime_class(cvideoview1),csize(rc.width()/2, rc.height()/2),pcontext);

把兩個檢視類交換了位置,這樣一來能夠順利執行了,可是沒有按照既定的位置顯示檢視區域,如圖所示。

如何解決這個問題呢?難道必須先建立主檢視類再分割才可以麼?經過查閱和研究,突然想,要是先分割再建立不知道可以不?於是**修改為了這樣:

crect rc;

getclientrect(&rc);

//建立分割視窗1行2列

if(m_wndsplitter.createstatic(this,1,2) == null)

return false;

//為子視窗建立分割視窗 idfromrowcol(0,1)中的(0,1)記錄的是將要分割的位置,即未顯示的那個部分(0,1)

m_wndsplitter1.createstatic(&m_wndsplitter,2,1,ws_child|ws_visible,m_wndsplitter.idfromrowcol(0,1));

//建立gis的檢視位置

m_wndsplitter.createview(0,0,runtime_class(cgisview),csize(rc.width()/2,rc.height()), pcontext);

//建立監視器檢視位置

m_wndsplitter1.createview(0,0,runtime_class(cvideograbview),csize(rc.width()/2, rc.height()/2),pcontext);

m_wndsplitter1.createview(1,0,runtime_class(cvideoview1),csize(rc.width()/2, rc.height()/2),pcontext);

這樣便得到了預期的分割位置。

最後別忘記了在傳送命令的時候修改檢視的位置,否則會出現報錯。

有關生活的一點討論

今天和同事在一起討論生活難易的問題,看到乙個帖子,國外的乙個快50歲的軟體工程師寫的,說他失業也,再就業的難題,然後我們就發散開來了。今年28歲了,不知不覺,還感覺自己很年輕,但是其實已經不小了啊,之前一直都在逃避,逃避在上海買房的問題,逃避未來的發展,因為現在在一家外企做研發,自我感覺還很好,也許...

有關MVC的一點理解

被老闆敲了一頓,你對於mvc的理解還是不夠透徹。後台傳至前台的json竟然包含頁面dom元素。好吧,自我反省下 懶惰 圖省事,所以沒有完全解耦 對於mvc的理解。對於mvc,v為檢視,只管處理資料的顯示問題。mc,負責資料與資料庫的互動。為什麼要這個樣子捏?那是如果後台傳至前台的資料如果包含頁面顯示...

有關隧道的一點感悟

兩年前寫過一篇文章,大意是感慨了一下打浦路隧道的破舊和天天堵車的情況,而對延安東路隧道大加了一番讚賞。彼時我想除了加複線大概沒有辦法解決打浦路隧道的擁堵情況了,而加複線似乎又無可能,因為周圍也沒有這個空間。因而我以為打浦路隧道大約屬於無藥可救的了,所以也日復一日習慣了堵車。不想世事無常,時至今日此文...