(MFC)Vs2010制作Visual Studio风格的停靠侧栏窗口(CDockablePane里嵌套FormView表单视图) (三)

2014-11-24 07:57:36 · 作者: · 浏览: 5
ionWnd;
bNameva lid = strSolutionWnd.LoadString(IDS_SOLUTION_WND);
ASSERT(bNameva lid);
if(!m_wndSolution.Create(strSolutionWnd,this,CRect(0,0,200,200),TRUE,1234,WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
{
TRACE0("未能创建“解决方案窗口\n");
return FALSE;
}既然我们要创建CDockablePane那必然需要改写OnCreate函数和OnSize函数,原因是,通过CDockablePane的创建必然会调用OnCreate函数,在OnCreate函数里创建FormView,在OnSize里面调整FormView的大小,覆盖整个CDockablePane。

利用类向导在CSolution声明里添加消息映射函数

public:  
 
DECLARE_MESSAGE_MAP()
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
afx_msg void OnSize(UINT nType, int cx, int cy);
int CSolutionWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)  
 
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
return 0;
}
void CSolutionWnd::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
}

利用类向导在CMfcFormView里添加消息映射函数OnCreate以及改写虚函数Create

afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);  
 
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
// CMfcFormView 消息处理程序   
 
int CMfcFormView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFormView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
return 0;
}
BOOL CMfcFormView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
return CFormView::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}

在CSolution.h里声明CMfcFormView*类型的指针变量

protected:  
 
CMfcFormView* m_pformView;
在CSolution的构造函数里创建CMfcFormView对象

CSolutionWnd::CSolutionWnd()  
 
{
m_pformView = (CMfcFormView*) (RUNTIME_CLASS(CMfcFormView)->CreateObject());
}

在CSolution的OnCreate函数里创建FormView

int CSolutionWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)  
 
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: 在此添加您专用的创建代码
RECT rect;
GetClientRect(&rect);
m_pformView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE, rect, this, 123, NULL);
return 0;
}
在CSolution的OnSize函数里调整FormView填充整个DockablePane区域

void CSolutionWnd::OnSize(UINT nType, int cx, int cy)  
 
{
CDockablePane::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if (GetSafeHwnd() == NULL)
{
return;
}
if(m_pformView->GetSafeHwnd()!=NULL)
{
CRect rect;
GetClientRect(rect);
m_pformView->SetWindowPos(NULL, rect.left, rect.top, rect.Width(), rect.Height(), S WP_NOACTIVATE | SWP_NOZORDER);
}
}

至此结束。。。回答一些疑问。

为什么要改写CMfcFormView的Create虚函数呢?

因为我们要用到这句函数。

m_pformView->Create(NULL, NULL, WS