因为要做图形学大作业,所以又和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,讲的非常详细!