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

teleinfor teleinfor 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
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);
...全文

相关推荐

评论 6
收藏 已收藏
分享
返回顶部
teleinfor
界面 15,976 成员 115,866 内容