互動 MFC視窗位置分析

2021-06-19 00:10:05 字數 2706 閱讀 9567

一、單文件子視窗 

onsize()中通過傳送wm_sizeparent訊息給子視窗,對於單文件而言,子視窗是ccontrolbar的派生類和檢視view類,controlbar的子視窗切去自己占有的矩形區,並用::enddeferwindowpos()來設定,設定之後,對於還有有子窗體,會傳送wm_windowposchanged和wm_size,通知下面的子窗體。

cdoctemplate::initialupdateframe()

activateframe(1)//裡面呼叫了乙個showwindow,顯示所有視窗,傳送wm_size訊息

cframewnd::onsize()//cmainframe收到wm_size,交給cframewnd::onsize()處理

afxrepositionwindow(&layout, hwndleftover, &layout.rect);//放置最後乙個視窗,hwndleftover是上面遍歷所有視窗之後,最後乙個id = afx_idw_pane_first的視窗

}}//repositionbars(0, 0xffff, afx_idw_pane_first, repo***tra, &m_rectborder);afx_idw_pane_first是獲得最後空間的視窗id,m_rectborder是可供分配的視窗矩形區。

單文件工具條

//*******建立之後

class ccontrolbar : cwnd//*******、cdockbar(類名為afx)父類

cmainframe::oncreate()//建立m_pdockbar、m_pdockcontext

dockcontrolbar(&m_wnd*******);//裡面cmainframe會去檢索m_listcontrolbars,根據m_wnd*******

//的m_dwstyle看是否有一樣的cdockbar,然後再 pdockbar->dockcontrolbar(pbar, lprect);裡面會改

//變*******的父視窗為cdockbar即afxcontrolbar。 }

class cdockbar : public ccontrolbar

class cframewnd : cwnd

//*******窗體建立,oncreate()訊息,讓主窗體的乙個鍊錶儲存controls物件指標,並儲存pframewnd到m_pdocksite中

ccontrolbar::oncreate()

}

總結:各資料物件關係如下

cframewnd::cptrllist m_listcontrolbars  //儲存所有controlbars的物件,getparent()就可獲得framewnd,controlbars::oncreate新增到list中,同時controlbar::m_pdocksite指向cframewnd窗體

cdockbar::m_arrbars //在dockcontrolbar(&yourcontrols),新增controlbars物件到m_arrbars中,同時將controlbars::m_pdockbar儲存所在的cdockbar物件指標

cmainframe中recalclayout()會把wm_sizeparent訊息傳送給狀態列的ccontrolbar::onsizeparent(),dockbar的cdockbar::onsizeparent()。staturbar和afxcontrolbar都是派生於這個函式把子視窗的位置排好,::deferwindowpos()或者setwindowpos()會把最後乙個視窗的位置設定好。

關於位置排列:cdockbar即afxcontrolbar42d,收到onsize()訊息,然後它會利用m_arrbars裡面去把各個工具欄遍歷,然後來計算位置,然後排列工具條。

cdockbar相當於乙個容器,可以容納多個工具欄等窗體。並且有4個已建立容器,隨時可以出現。

二、單文件多檢視

單文件中,多個檢視進行排列時,如下

cframewnd::onsize()

csplitterwnd::onsize()//被觸發

::enddeferwindowpos對視窗0發訊息,通過getdlgitem(子視窗id號)來獲取子視窗1、2,這個函式只能獲取一層的子視窗,::enddeferwindowpos(layout.hdwp)設定完畢之後,

會繼續向子視窗2,傳送poschanged、csplitterwnd::onsize訊息,這時,負責重排的視窗是視窗2

第一級   視窗0

第二級:子視窗1 子視窗2

第**:2.1 2.2

在程式執行的過程中,cframewnd::recalclayout()會呼叫兩次 

cmainframe::oncreate()//建立

//建立工具條、狀態列

//泊位工具條

}csingledoctemplate::opendocumentfile//第2次呼叫,

}

參考:1、mfc視窗位置管理詳細分析及例項

2、理解mfc控制條窗體布局原理

3、mfc技術系列(四)--frame視窗只control bar(2)

4、ccontrolbar和cdockbar的應用

5、mfc工具條和狀態列

6、mfc工具條和狀態列-深入淺出 mfc(李久進)

7、單文件程式執行流程

MFC中設定視窗大小位置

第一種方法 使用setwindowpos函式 cwnd setwindowposbool setwindowpos const cwnd pwndinsertafter,int x,int y,int cx,int cy,uint nflags 返回值如果函式成功,則返回非零值 否則返回0。說明 呼...

MFC中設定視窗大小位置

第一種方法 使用setwindowpos函式 cwnd setwindowposbool setwindowpos const cwnd pwndinsertafter,int x,int y,int cx,int cy,uint nflags 返回值如果函式成功,則返回非零值 否則返回0。說明 呼...

MFC視窗位置和大小的獲取

最近在做乙個專案,需要控制項隨對話方塊大小的變化而變化,因此需要準確獲取對話方塊視窗 控制項的大小和位置。經過好一番查尋 測試,終於看到了希望。下面是一些獲取視窗位置和大小的函式,示例如下 1 獲取螢幕解析度 下邊兩個函式獲取的是顯示螢幕的大小,但不包括工作列等區域 int cx getsystem...