VS2008 CMFCOutlookBarTabCtrl界面开发你不知道的事

BOOL CMainFrame::CreateOutlookBar(CMFCOutlookBar& bar, UINT uiID, CMFCShellTreeCtrl& tree, CCalendarBar& calendar, int nInitialWidth)
{
	CWindowDC dc(NULL);

	bar.SetMode2003();

	BOOL bNameValid;
	CString strTemp;
	bNameValid = strTemp.LoadString(IDS_SHORTCUTS);
	ASSERT(bNameValid);
	if (!bar.Create(strTemp, this, CRect(0, 0, nInitialWidth, 32000), uiID, WS_CHILD | WS_VISIBLE | CBRS_LEFT))
	{
		return FALSE; // 未能创建
	}

	CMFCOutlookBarTabCtrl* pOutlookBar = (CMFCOutlookBarTabCtrl*)bar.GetUnderlyingWindow();

	if (pOutlookBar == NULL)
	{
		ASSERT(FALSE);
		return FALSE;
	}

	pOutlookBar->EnableInPlaceEdit(TRUE);

	static UINT uiPageID = 1;



// 	DWORD dwPaneStyle = AFX_DEFAULT_TOOLBAR_STYLE | CBRS_FLOAT_MULTI;
// 
// 	// can float, can autohide, can resize, CAN NOT CLOSE
// 	DWORD dwStylePane = AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE | AFX_CBRS_RESIZE;
//加载位图
// 	CImageList images;
// 	CBitmap bmp;
// 	if (!bmp.LoadBitmap(IDB_NAVIGATION_LARGE_HC))
// 	{
// 		return FALSE;
// 	}
// 
// 	BITMAP bm;
// 	bmp.GetBitmap(&bm);
// 
// 	UINT nFlags = ILC_MASK | ILC_COLOR24;
// 
// 	images.Create(32, bm.bmHeight, nFlags, 0, 0);
// 	images.Add(&bmp, RGB(255, 0, 255));
// 	pane1.Create(&bar, dwPaneStyle, uiPageID++, dwStylePane);
// 	pane1.SetOwner(this);
// 	pane1.EnableTextLabels();
// 	pane1.EnableDocking(CBRS_ALIGN_ANY);
// 	pane1.AddButton(images.ExtractIcon(0), "子功能1", ID_APP_EXIT);
// 	pane1.AddButton(images.ExtractIcon(1), "子功能2", ID_APP_EXIT);  
// 	//第三个参数,用的stringtable里面的程序退出项
// 	pane1.AddButton(images.ExtractIcon(2), "子功能3", ID_APP_EXIT);
// 	pOutlookBar->AddControl(&pane1, _T("功能1"), 0, TRUE, dwStylePane);
// 	pane1.EnableDocking(CBRS_ALIGN_ANY);
// 	pane1.SetDefaultState();
// 
// 	pane2.Create(&bar, dwPaneStyle, uiPageID++, dwStylePane);
// 	pane2.SetOwner(this);
// 	pane2.EnableTextLabels();
// 	pane2.EnableDocking(CBRS_ALIGN_ANY);
// 	pane2.AddButton(images.ExtractIcon(3), "子功能1", ID_APP_EXIT);
// 	pane2.AddButton(images.ExtractIcon(4), "子功能2", ID_APP_EXIT);
// 	pOutlookBar->AddControl(&pane2, _T("功能2"), 1, TRUE, dwStylePane);
// 	pane2.EnableDocking(CBRS_ALIGN_ANY);
// 	pane2.SetDefaultState();

 	DWORD dwPaneStyle = AFX_DEFAULT_TOOLBAR_STYLE | CBRS_FLOAT_MULTI;
//  //可浮动,可自动隐藏,可调整大小,但不能关闭
 	DWORD dwStyle = AFX_CBRS_FLOAT | AFX_CBRS_AUTOHIDE | AFX_CBRS_RESIZE;

	CRect rectDummy(0, 0, 0, 0);
	const DWORD dwTreeStyle = WS_CHILD | WS_VISIBLE | TVS_HASLINES | TVS_LINESATROOT | TVS_HASBUTTONS;

	tree.Create(dwTreeStyle, rectDummy, &bar, 1200);
	bNameValid = strTemp.LoadString(IDS_FOLDERS);
	ASSERT(bNameValid);
	pOutlookBar->AddControl(&tree, strTemp, 2, TRUE, dwStyle);

// 	treectrl.Create(dwTreeStyle,rectDummy,&bar,2012);
// 	TVINSERTSTRUCT tvInsert;
// 	tvInsert.hParent = NULL;
// 	tvInsert.hInsertAfter = NULL;
// 	tvInsert.item.mask = TVIF_TEXT;
// 	tvInsert.item.pszText = "河北";
// 	tvInsert.item.lParam=1;
// 	HTREEITEM hBridge = treectrl.InsertItem(&tvInsert);
// 	tvInsert.item.pszText = "山东";
// 	tvInsert.item.lParam=2;
// 	TVINSERTSTRUCT tNode;
// 	//tNode.hInsertAfter=hBridge;
// 
// 	tNode.hParent=hBridge;
// 	tNode.item.mask=TVIF_TEXT;
// 	tNode.item.pszText="石家庄";
// 	tNode.item.lParam=1;
// 	treectrl.InsertItem(&tNode);
// 	hBridge=treectrl.InsertItem(&tvInsert);
// 	treectrl.InsertItem(TVIF_TEXT,"济南", 0, 0, 0, 0, 0, hBridge, NULL);
// 	pOutlookBar->AddControl(&treectrl, "节点列表", 2, TRUE, dwStyle);

	calendar.Create(rectDummy, &bar, 1201);
	bNameValid = strTemp.LoadString(IDS_CALENDAR);
	ASSERT(bNameValid);
	pOutlookBar->AddControl(&calendar, strTemp, 3, TRUE, dwStyle);

	bar.SetPaneStyle(bar.GetPaneStyle() | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC);

	pOutlookBar->SetImageList(theApp.m_bHiColorIcons ? IDB_PAGES_HC : IDB_PAGES, 24);
	pOutlookBar->SetToolbarImageList(theApp.m_bHiColorIcons ? IDB_PAGES_SMALL_HC : IDB_PAGES_SMALL, 16);
	pOutlookBar->RecalcLayout();

	BOOL bAnimation = theApp.GetInt(_T("OutlookAnimation"), TRUE);
	CMFCOutlookBarTabCtrl::EnableAnimation(bAnimation);

	bar.SetButtonsFont(&afxGlobalData.fontBold);

	return TRUE;
}


代码本身没错,可是当我们把 整个函数里面的代码全部注视掉之后,再编译的时候运行,第一个发现控件确实显示不出来,因为没有代码。

当我们把注释的部分解除掉再编译,我们会发现编译的控件一样显示不出来,可是我们明明写了代码,为什么会显示不出来呢,还有,当我把控件的标题修改了之后,编译运行发现程序还是之前的标题,这一系列问题让我们不得不深入思考,很可疑的地方就是注册表,这里肯定存放了控件的信息,通过对注册表的监控,很快找到了问题的根源所在。

如下图所示:





解决办法,把注册表中和你程序名相同的键值,以及该键值的子键值全部删掉,再运行程序就OK了。


(不知道是不是VS2008的BUG,也不知道在VS2010是否也会存在这种BUG)。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值