Visual C++中Tab View的多种实现方法(2)
在切换时,通过函数SetWindowPos()中设置参数SWP_SHOWWINDOW或SWP_HIDEWINDOW来显示选中的新视图,或隐藏旧视图。采用这种方法,使对视图操作更加灵活,可以很方便在Tab View中添加和删除不同视图。
三、CSheetCtrl标签选择窗口实现Tab View
CSheetCtrl不是MFC类库中的类,用它来实现Tab View的方法和上一个方法基本相同。在程序员大本营网站的VC编程源代码集的[其它控制]分类中,” A Tab-like Sheet Ctrl”程序含有该类源代码,但在使用时要将窗口的切换改为视图切换。
1.标签窗口的创建
CSheetCtrl实现的Attach( )函数,是它与外部的接口。在CTabSheetCtrl 中定义CSheetsWnd m_Sheet ,初始化过程中,通过调用m_Sheet.Attach( this)将CSheetCtrl创建为CTabSheetCtrl窗口的子窗口。
{
//确定了标签窗口的大小和位置
CRect rect = GetRect(pWndParent);
…
BOOL bResult = Create( … , rect , …);
…
return bResult;
}
CRect CSheetsWnd::GetRect(CWnd* pWndParent)
{
CRect rect;
pWndParent->GetClientRect(rect);
rect.top = rect.bottom - GetSystemMetrics(SM_CYVTHUMB);
return rect;
}
2.查找所选视图窗口
CSheetCtrl实现了类似于CTabCtrl的功能,如绘制标签窗口、判断用户的选择等。它本身并没有保存任何有关视图的信息,在视图切换时,它通过其父窗口来查找用户所选的视图窗口。
CWnd* CSheetsWnd::GetFirstView()
{
m_pViewFind = GetParent()->GetWindow(GW_CHILD);
// m_hWnd存放的是CSheetCtrl标签窗口
//排除CSheetCtrl标签窗口
while (m_pViewFind && m_pViewFind->m_hWnd == m_hWnd)
m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
return m_pViewFind;
}
//得到下一个视图窗口指针函数
CWnd* CSheetsWnd::GetNextView()
{
if (m_pViewFind)
{
m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
while (m_pViewFind && m_pViewFind->m_hWnd == m_hWnd)
m_pViewFind = m_pViewFind->GetWindow(GW_HWNDNEXT);
return m_pViewFind;
}
return NULL;
}
按一定的顺序得到所有父窗口(CTabSheetCtrl)的子窗口(CMyView1、CMyView2)指针后,根据每个子窗口的标题所占空间位置,来确定所选择的视图窗口。
CWnd* pChild = GetFirstView();
while (pChild)
{
CRect rect(cx,0,0,0);
//rect返回绘制该窗口的标题所需的矩形大小
pDC->DrawText(GetViewTitle(pChild), rect, DEFAULTFORMATDRAWTEXT | DT_CALCRECT);
rect.top = 0;
rect.bottom = m_DrawRect.Height();
if ((aPointX > cx - LRB) && (aPointX <= cx + rect.Width() + LRB))// aPointX鼠标位置的横坐标
break;//找到所选视图
//获得下一个视图窗口的指针
pChild = GetNextView();
int next = rect.Width() + 6 + LRB;
cx += next;
}
四、静态分割窗口实现Tab View