Toolbar从Top到left的问题

zhaori 2009-03-03 01:18:22
建一个MFC对话框工程
新建一个Toolbar,Toolbar中有9个按钮

1.在对话框的初始化函数OnInitDialog中,加入Toolbar(工具栏),并设置为Top的状态
部分code如下:

m_pToolBar = new CToolBar;
m_pToolBar->Create(this);
m_pToolBar->LoadToolBar(IDR_TOOLBAR1);
m_pToolBar->ShowWindow(SW_SHOW);
//工具栏顶端停靠,CBRS_ALIGN_TOP
m_pToolBar->SetBarStyle(CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);



2.加入menu,加入消息函数
做动作

void CToolBarTestDlg::OnFullview()
{
// TODO: Add your command handler code here
bFullView = TRUE;
SendMessage(WM_SIZE,0,0);
}

即给函数void CToolBarTestDlg::OnSize(UINT nType, int cx, int cy) 发送消息
在OnSize函数中做如下动作:

void CToolBarTestDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here
if (bFullView&&bInitOK)
{
//工具栏左边停靠,CBRS_ALIGN_LEFT
m_pToolBar->SetBarStyle(CBRS_ALIGN_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY);

RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_1 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_2 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_3 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_4 , TBSTATE_HIDDEN);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_5 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_6 , TBSTATE_HIDDEN);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_7 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_8 , TBSTATE_HIDDEN);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_9 , TBSTATE_ENABLED);
}
else
{
if (bInitOK)
{
m_pToolBar->SetBarStyle(CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_1 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_2 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_3 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_4 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_5 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_6 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_7 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_8 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_9 , TBSTATE_ENABLED);
}
}
}


问题:
单击一次menu,使OnFullview工作。
显示是OK的,即工具栏左边停靠

对话框最小化后,还原,工具栏就只剩下一个按钮了。其他的按钮消失了。
不知是不是函数RepositionBars的使用有问题,哪位朋友对这个了解的,麻烦帮忙看看,谢谢。

...全文
110 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaori 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 cnzdgs 的回复:]
用EnableButton和HideButton代替SetState:
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_1);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_2);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_3);
m_pToolBar->GetToolBarCtrl().HideButton(ID_BTN_4);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_5);
m_pToolBar->GetToolBarCtrl().HideButton(ID_BTN_6);
m_pToolBar->GetToolBarCtrl().…
[/Quote]
还是有问题
cnzdgs 2009-03-03
  • 打赏
  • 举报
回复
用EnableButton和HideButton代替SetState:
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_1);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_2);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_3);
m_pToolBar->GetToolBarCtrl().HideButton(ID_BTN_4);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_5);
m_pToolBar->GetToolBarCtrl().HideButton(ID_BTN_6);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_7);
m_pToolBar->GetToolBarCtrl().HideButton(ID_BTN_8);
m_pToolBar->GetToolBarCtrl().EnableButton(ID_BTN_9);
zhaori 2009-03-03
  • 打赏
  • 举报
回复
这里又有一个问题:
在函数void CToolBarTestDlg::OnBtn5() 加入如下code

void CToolBarTestDlg::OnBtn5()
{
// TODO: Add your command handler code here
int iDis = m_pToolBar->GetToolBarCtrl().GetState(ID_BTN_5);
if (iDis == TBSTATE_ENABLED )
{
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_6 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_5 , TBSTATE_HIDDEN);
}
else
{
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_5 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_6 , TBSTATE_HIDDEN);
}
}

在点击一次FullView使得Toolbar变成左边竖排的状态后
点击两次5按钮以上,就发现问题了(5和7按钮不见了)
跟踪代码将发现一些奇怪的东西
第一次会发现iDis 的值是36
第二次iDis 是4(好像这个才是正常值)

zhaori 2009-03-03
  • 打赏
  • 举报
回复
我把代码独立出来(原先onsize中的代码屏蔽掉)

void CToolBarTestDlg::ReSetToolBar()
{
if (bFullView)
{
m_pToolBar->SetBarStyle(CBRS_ALIGN_LEFT | CBRS_TOOLTIPS | CBRS_FLYBY);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_1 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_2 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_3 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_4 , TBSTATE_HIDDEN);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_5 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_6 , TBSTATE_HIDDEN);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_7 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_8 , TBSTATE_HIDDEN);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_9 , TBSTATE_ENABLED);
}
else
{

m_pToolBar->SetBarStyle(CBRS_ALIGN_TOP | CBRS_TOOLTIPS | CBRS_FLYBY);
RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_1 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_2 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_3 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_4 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_5 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_6 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_7 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_8 , TBSTATE_ENABLED);
m_pToolBar->GetToolBarCtrl().SetState(ID_BTN_9 , TBSTATE_ENABLED);
}
}



void CToolBarTestDlg::OnFullview()
{
// TODO: Add your command handler code here
bFullView = TRUE;
//SendMessage(WM_SIZE,0,0);
ReSetToolBar();//调用
}
void CToolBarTestDlg::OnNormalview()
{
// TODO: Add your command handler code here
bFullView = FALSE;
//SendMessage(WM_SIZE,0,0);
ReSetToolBar();//调用
}

点击两次FullView后,先最小化,然后还原,还是有问题。
cnzdgs 2009-03-03
  • 打赏
  • 举报
回复
知道问题了,你把处理代码放到OnFullview里面,不要放在OnSize中,因为OnSize经常会被调用(例如最小化、还原等)。
zhaori 2009-03-03
  • 打赏
  • 举报
回复
cnzdgs 大哥

我把工程上传到资源中了
http://download.csdn.net/source/1063339

如果你能帮忙看看,非常感谢。
zhaori 2009-03-03
  • 打赏
  • 举报
回复
我没有多余的控件

一个对话框,对话框中有两个 “确定”“取消”button
一个Toolbar
一个menu

cnzdgs 2009-03-03
  • 打赏
  • 举报
回复
没注意你用的是对话框,EnableDocking是框架用的。你的代码看起来是没问题的,是不是有其它控件或子窗口与工具栏重叠了?
zhaori 2009-03-03
  • 打赏
  • 举报
回复
另外一点
我建的是MFC Dialog 工程
这样的工程是否可用EnableDocking?
zhaori 2009-03-03
  • 打赏
  • 举报
回复
谢谢cnzdgs
不过我不知这个函数如何使用,在哪个地方使用。
能否详细点,谢谢
(在这之前的10多分钟里有在搜索如何使用这个函数,可是无果)
cnzdgs 2009-03-03
  • 打赏
  • 举报
回复
EnableDocking(CBRS_ALIGN_ANY);

15,978

社区成员

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

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