再发一个CTabView的问题。。。最近跟vs2008 sp1杠上了。。。

teleinfor 2010-09-07 10:07:58
CTabView有一个RemoveView函数实现关闭一个视图。这里VS2008 feature pack sample
D:\Program Files\AllVCLanguageSamples\C++\MFC\Visual C++ 2008 Feature Pack\TabbedView
有一个问题。执行RemoveView后,由于默认的m_bAutoDestroyWindow为FALSE,所以并没有销毁view。我就设置了
wndTab.AutoDestroyWindows(TRUE);
结果发现执行RemoveView时候问题就来了,报错数组引用越界了。有兴趣的朋友可以试试。添加如下函数:


void CTabbedViewView::OnContextMenu(CWnd*, CPoint point)
{
//theApp.ShowPopupMenu (IDR_CONTEXT_MENU, point, this);
CMenu PopupMenu;
PopupMenu.CreatePopupMenu();
PopupMenu.AppendMenu(MF_STRING|MF_ENABLED,1,L"Close");
int nCmdID = PopupMenu.TrackPopupMenu(TPM_LEFTALIGN|TPM_RETURNCMD|TPM_LEFTBUTTON,point.x,point.y,this);

CMFCTabCtrl& wndTab = GetTabControl();
CPoint ptTab = point;
wndTab.ScreenToClient(&ptTab);

const int nTab = wndTab.GetTabFromPoint(ptTab);

if (nCmdID == 1)
{
if (nTab >= 0)
{
wndTab.SetActiveTab(nTab);
RemoveView(nTab);
}
}

}

同时修改sample的函数:

int CTabbedViewView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CTabView::OnCreate(lpCreateStruct) == -1)
return -1;

CMFCTabCtrl& wndTab = GetTabControl();
wndTab.AutoDestroyWindow(TRUE);

AddView (RUNTIME_CLASS (CView1), _T("Simple"), 100);
AddView (RUNTIME_CLASS (CView2), _T("List"), 101);
AddView (RUNTIME_CLASS (CView3), _T("Form"), 102);
AddView (RUNTIME_CLASS (CView4), _T("ScrollView"), 102);

return 0;
}

增加
CMFCTabCtrl& wndTab = GetTabControl();
wndTab.AutoDestroyWindow(TRUE);
...全文
144 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Howard_Liu 2012-05-23
  • 打赏
  • 举报
回复
搜到了你的贴。我也发现这个问题,结果造成一个Tab页里总是有两个View。所以我在集成CTabView的类里声明了一个方法DeleteView,完成删除Tab页和释放View的工作。
CGridView *tmp = GetPointedView(n);
if(RemoveView(n))
{
tmp->DestroyWindow();
}
teleinfor 2010-10-05
  • 打赏
  • 举报
回复
或者哪位朋友能够推荐一种实现tabview的方法。我就跳过MFC的tabview自己实现也行,就是觉得麻烦,想使用现成的CTabView类来做,延续性和兼容性都不错。没想到遇到这个讨厌的问题。
teleinfor 2010-10-05
  • 打赏
  • 举报
回复
但是按照MFC FEATURE PACK的说法,提供了一个动态的RemoveView()来删除制定的View。我就是想使用带有tab功能的view功能来组合一系列相关的视图,然后可以动态的打开或者删除tab内的视图。

结果发现了这个意外的问题。看起来大家研究sp1或者vc++ 2010的朋友不多。
无幻 2010-10-04
  • 打赏
  • 举报
回复
wndTab.SetActiveTab(nTab);
RemoveView(nTab);
好像不能在当前Tab关闭此Tab
teleinfor 2010-10-04
  • 打赏
  • 举报
回复
真的没人使用sp1的tabview发现动态removeview的问题么?
teleinfor 2010-09-13
  • 打赏
  • 举报
回复
sp1的东西看来大家使用的不多,没人学习研究这个东东么?

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧