小弟初到csdn发贴子,望各位大虾多多关照。
我在一个mfc的单文档工程中出现这样一个问题:
我在资源中创建两个工具条(其中一个是系统的IDR_MAINFRAME),在CMainFrame::OnCreate()中增加了以下代码: if (!m_cmbVideoBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP|CBRS_TOOLTIPS,NULL))
{
return -1;
}
//m_cmbVideoBar在MainFrm.h中声明为:CToolBar ,是自己创建的
//IDR_TOOLBAR_VIDEOPRIVIEW --对应的资源。
m_cmbVideoBar.LoadToolBar(IDR_TOOLBAR_VIDEOPRIVIEW);
EnableWindow(FALSE);
EnableWindow();
m_cmbVideoBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_cmbVideoBar); 发现每次启动时程序运行到
LoadBarState(_T("Bar State Information"));
语句时报错退出,如果屏蔽此语句,则不能实现界面中放置工具条在上次程序退出的位置。
我在一个mfc的单文档工程中出现这样一个问题:
我在资源中创建两个工具条(其中一个是系统的IDR_MAINFRAME),在CMainFrame::OnCreate()中增加了以下代码: if (!m_cmbVideoBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP|CBRS_TOOLTIPS,NULL))
{
return -1;
}
//m_cmbVideoBar在MainFrm.h中声明为:CToolBar ,是自己创建的
//IDR_TOOLBAR_VIDEOPRIVIEW --对应的资源。
m_cmbVideoBar.LoadToolBar(IDR_TOOLBAR_VIDEOPRIVIEW);
EnableWindow(FALSE);
EnableWindow();
m_cmbVideoBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_cmbVideoBar); 发现每次启动时程序运行到
LoadBarState(_T("Bar State Information"));
语句时报错退出,如果屏蔽此语句,则不能实现界面中放置工具条在上次程序退出的位置。
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
} //left toolbar
if (!m_wndToolBarLeft.CreateEx(this,TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_BORDER_LEFT) ||
!m_wndToolBarLeft.LoadToolBar(IDR_TOOLBARLEFT))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
} //button statusbar
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
} // TODO: Delete these three lines if you don't want the toolbar to
// be dockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar); //LEFT toolbar
m_wndToolBarLeft.SetWindowText("图象工具栏1");
m_wndToolBarLeft.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBarLeft,AFX_IDW_DOCKBAR_LEFT);
ShowControlBar(&m_wndToolBarLeft,TRUE,FALSE);
int nColumns = 1;
int nCount = m_wndToolBarLeft.GetToolBarCtrl().GetButtonCount();
for (int i = 0; i < nCount; i++)
{
UINT nStyle = m_wndToolBarLeft.GetButtonStyle(i);
BOOL bWrap = (((i + 1) % nColumns) == 0);
if (bWrap)
nStyle |= TBBS_WRAPPED;
else
nStyle &= ~TBBS_WRAPPED;
m_wndToolBarLeft.SetButtonStyle(i, nStyle);
}
if (!m_cmbVideoBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_cmbVideoBar.LoadToolBar(IDR_TOOLBAR_VIDEOPRIVIEW))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
区别只是LoadToolBar()的调用先后顺序。
{
LoadBarState(_T("MyToolbar"));
}
BOOL CMainFrame::VerifyBarState(LPCTSTR lpszProfileName)
{
CDockState state;
state.LoadState(lpszProfileName);
for (int i = 0; i < state.m_arrBarInfo.GetSize(); i++)
{
CControlBarInfo* pInfo = (CControlBarInfo*)state.m_arrBarInfo[i];
ASSERT(pInfo != NULL);
int nDockedCount = pInfo->m_arrBarID.GetSize();
if (nDockedCount > 0)
{
// dockbar
for (int j = 0; j < nDockedCount; j++)
{
UINT nID = (UINT) pInfo->m_arrBarID[j];
if (nID == 0) continue; // row separator
if (nID > 0xFFFF)
nID &= 0xFFFF; // placeholder - get the ID
if (GetControlBar(nID) == NULL)
return FALSE;
}
}
if (!pInfo->m_bFloating) // floating dockbars can be created later
if (GetControlBar(pInfo->m_nBarID) == NULL)
return FALSE; // invalid bar ID
}
return TRUE;
}