如何在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,讲的非常详细!



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