因爲要做圖形學大作業,所以又和MFC槓上了。這次打算做一個嵌套在基於CDialog創建的FormView類裏的propertysheet,以前沒做過,所以也是小小折騰了一下,特此記錄以備忘
先上最後的效果圖吧~
左邊的屬性框就是這次做出的效果啦~
左右兩個子窗口是在MainFrm裏用CSplitterWnd分出來的,左邊的窗口是FormView類,裏面包含着一個PropertySheet類,而在PropertySheet類裏又包含着兩個PropertyPage類。
具體建立方法:
先在資源窗口裏插入一個新的Dialog,右鍵添加類名叫CSelectFormView,基類爲FormView。然後在項目->類嚮導->添加類,新建一個PropertySheet類,起名爲SelectSheet。再回到資源窗口,新建兩個Dialog,右鍵添加類,起名CSelectPage1和2,基類都是PropertyPage類。要特別注意建立對話框的時候style都要把默認的popup改成child,
好了,準備工作做完了,現在的解決方案管理器應該長這樣:
現在我們可以開始代碼部分了~
拆分窗口部分的代碼我就象徵性地貼一下,不做解釋記錄
//MainFrm.h
public:
CSplitterWnd m_wndSplitter;
//MainFrm.cpp
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加專用代碼和/或調用基類
if (!m_wndSplitter.CreateStatic(this,1,2,WS_CHILD|WS_VISIBLE))
{
TRACE("Failed to create static splitter\n");
return FALSE;
}
if (!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CSelectFormView),CSize(340,200),pContext))
{
TRACE("Failed to create property view\n");
return FALSE;
}
if (!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CRenderScene),CSize(1020,200),pContext))
{
TRACE("Failed to create render view\n");
return FALSE;
}
return TRUE;
}
好啦,現在我們有了兩個子窗口~接下來就是正戲!
首先在SelectFormView類嚮導裏添加虛函數OnInitialUpdate
//SelectFormView.cpp
void CSelectFormView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
// TODO: 在此添加專用代碼和/或調用基類
CSelectSheet *pSheet = new CSelectSheet(_T("TEST"),this,NULL);
//pSheet ->Create(this, WS_CHILD | WS_VISIBLE/*|WS_TILEDWINDOW*/, WS_EX_TOPMOST);
pSheet ->Create(this,WS_CHILD | WS_VISIBLE);
RECT rect;
this->GetClientRect(&rect);
//pSheet->SetWindowPos(NULL,0,0,rect.right-rect.left,rect.bottom-rect.top,SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE);
pSheet->MoveWindow(0,0,rect.right-rect.left,rect.bottom-rect.top,TRUE);
pSheet ->ShowWindow(SW_SHOW);
}
之前我沒有添加pSheet->MoveWindow,用的是SetWindowPos。雖然選項卡的樣子出來了,但是位置並不對齊FormView窗口的左上角。具體原因還沒搞清楚……另外pSheet的Create函數,第三個參數用默認初始值就可以,所以我把第一個Create函數註釋掉了。
這塊函數只是在FormView裏放了個Sheet,接下來是在Sheet裏放兩個Page
//SelectSheet.h
public:
CSelectPage1 m_SelectPage1;
CSelectPage2 m_SelectPage2;
//SelectSheet.cpp
CSelectSheet::CSelectSheet(UINT nIDCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(nIDCaption, pParentWnd, iSelectPage)
{
AddPage(&m_SelectPage1);
AddPage(&m_SelectPage2);
}
CSelectSheet::CSelectSheet(LPCTSTR pszCaption, CWnd* pParentWnd, UINT iSelectPage)
:CPropertySheet(pszCaption, pParentWnd, iSelectPage)
{
AddPage(&m_SelectPage1);
AddPage(&m_SelectPage2);
}
好啦,這麼幾行代碼下來,就可以建立開頭的那個窗口了。
關於MFC的內容,查看http://www.jizhuomi.com/software/257.html,講的非常詳細!