如何在formview裏顯示屬性選項卡propertysheet

因爲要做圖形學大作業,所以又和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,講的非常詳細!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章