工具栏1放置对话框,对话框上再放个工具条2,当工具栏1浮动时,不知道怎么收工具条2的消息

春天到了冬天还远吗 2009-10-16 09:15:19
如题,简单的说下,
工具栏1派生于CControlBar,并且在工具栏1上创建了一个对话框
再在对话框上添加一个工具条2

在对话框源码内用ON_COMMAND无效,工具条2按钮为灰
后来我改在CMainFrame内用ON_COMMAND,当工具栏1停靠时,工具条2按钮有效,CMainFrame可以收到消息
当工具栏2浮动时,按钮就无效,如何解决?

谢谢
...全文
177 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
用户 昵称 2009-10-20
  • 打赏
  • 举报
回复
我现在做界面方面,很多都是frame,分隔view,view中嵌dialog,dialog中再嵌frame,frame有可能再分隔,dock不同的view............乱死了。
  • 打赏
  • 举报
回复
经过我近两天的非持续性研究,终于解决了
派生CToolbar 处理 WM_IDLEUPDATECMDUI消息

LRESULT CControlBar::OnIdleUpdateCmdUI(WPARAM wParam, LPARAM)
{
// handle delay hide/show
BOOL bVis = GetStyle() & WS_VISIBLE;
UINT swpFlags = 0;
if ((m_nStateFlags & delayHide) && bVis)
swpFlags = SWP_HIDEWINDOW;
else if ((m_nStateFlags & delayShow) && !bVis)
swpFlags = SWP_SHOWWINDOW;
m_nStateFlags &= ~(delayShow|delayHide);
if (swpFlags != 0)
{
SetWindowPos(NULL, 0, 0, 0, 0, swpFlags|
SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER|SWP_NOACTIVATE);
}

// the style must be visible and if it is docked
// the dockbar style must also be visible
if ((GetStyle() & WS_VISIBLE) &&
(m_pDockBar == NULL || (m_pDockBar->GetStyle() & WS_VISIBLE)))
{
CFrameWnd* pTarget = (CFrameWnd*)GetOwner();
if (pTarget == NULL || !pTarget->IsFrameWnd())
pTarget = GetParentFrame();
if (pTarget != NULL)
OnUpdateCmdUI(pTarget, (BOOL)wParam);
}
return 0L;
}

把CFrameWnd* pTarget = (CFrameWnd*)GetOwner();中的GetOwner()改为AfxGetMainWnd()
当然还有其他的方法,我还没研究完,先暂时放下了



[Quote=引用 12 楼 jennyvenus 的回复:]
你可以在controlbar中再建一个cframewnd,这样就可以再dock toolbar了。

[/Quote]
貌似vs2005的output就是这样的,我就是仿它的
用户 昵称 2009-10-18
  • 打赏
  • 举报
回复
你可以在controlbar中再建一个cframewnd,这样就可以再dock toolbar了。
MoXiaoRab 2009-10-18
  • 打赏
  • 举报
回复
要是我,我就用CDialogBar,想怎么放怎么放
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 cheng_fengming 的回复:]
Button也可以做的相当漂亮啊
[/Quote]
太麻烦了,绘来绘去的
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 txk1452 的回复:]
在对话框程序内,没有像CMainFrame的命令更新机制了

建议在对话框内处理WM_KIKEIDLE消息,并调用工具栏的命令更新函数

void CXXXDlg::OnKikeIdle()
{
    m_wndToolBar.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
}

[/Quote]
明天去公司试试,估计可以吧
txk1452 2009-10-18
  • 打赏
  • 举报
回复
在对话框程序内,没有像CMainFrame的命令更新机制了

建议在对话框内处理WM_KIKEIDLE消息,并调用工具栏的命令更新函数

void CXXXDlg::OnKikeIdle()
{
m_wndToolBar.OnUpdateCmdUI((CFrameWnd*)this, TRUE);
}
cheng_fengming 2009-10-18
  • 打赏
  • 举报
回复
Button也可以做的相当漂亮啊
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
悲剧~~~~~
  • 打赏
  • 举报
回复


  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dirdirdir3 的回复:]
用button模拟工具条就是了
[/Quote]
主要考虑到美化方面的东西
本来是用button的
后来用Ctoolbar来代替
Conry 2009-10-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wtx_sonery 的回复:]
引用 1 楼 dirdirdir3 的回复:
用button模拟工具条就是了

主要考虑到美化方面的东西
本来是用button的
后来用Ctoolbar来代替
[/Quote]
如果考虑美化的问题,我觉得button比ctoolbar好用多了
dirdirdir3 2009-10-16
  • 打赏
  • 举报
回复
用button模拟工具条就是了

15,979

社区成员

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

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