工具栏的显示和隐藏
来源:互联网 发布:mac队 编辑:程序博客网 时间:2024/05/16 19:07
一直想不到合适的方法来解决孙鑫老师在第九课提出的问题:当工具栏在客户呈现浮动状态时,再次点击“新工具栏”按钮,会使工具栏重新放置在“工具栏”的下方。提示在CToolBar类或者它的父类中找到一些函数来解决该问题。查看MSDN发现CToolBar的父类为CControlBar,其中有两个成员函数FloatControlBar()和IsFloating()。只有你调用了FloatControlBar()后,IsFloating()才会返回TRUE,也就是说当你手动把“新工具栏”拖动到客户区时,虽然是呈现浮动状态,但是该函数的返回值仍然是FALSE。
后来自己想了一个方法:当“新工具栏”按钮添加成功后,在CMainFrame的OnCreate()中计算出“新工具栏”按钮与父窗口的间距dx和dy,再在OnNewtoolBar()函数中计算按钮与父窗口的间距DX和DY。根据DX与dx,DY与dy之间的比较,就可以判断“新工具栏”按钮是否移动了,移动到哪了?
环境:VS2008
步骤:1.资源视图的toolbar中添加一个工具栏,添加一些你想要的工具栏按钮,并在Menu中的视图下面添加一个“新 工具栏”按钮,ID为IDM_NEWTOOLBAR。
2.在CMainFrame中添加一个成员变量m_ToolBar,类型为CToolBar;
3.在OnCreate()函数中参照“工具栏”按钮的方法,添加“新工具栏按钮”;添加成员变量dx和dy,类型为int;添加成员变量rect_window和rect_toolbar,类型为CRect
if (!m_ToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_ToolBar.LoadToolBar(IDR_TOOLBAR1)){TRACE0("未能创建工具栏\n");return -1; // 未能创建}m_ToolBar.EnableDocking(CBRS_ALIGN_TOP);DockControlBar(&m_ToolBar);GetMenu()->GetSubMenu(2)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED);//设置复选标记//获得初始化时“新工具栏”与父窗口的间距m_ToolBar.GetWindowRect(&rect_toolbar);GetWindowRect(&rect_window);dx=rect_toolbar.left-rect_window.left;dy=rect_toolbar.top-rect_window.top+24;4.为“新工具栏”按钮添加消息响应函数OnNewtoolBar(),编辑代码
void CMainFrame::OnNewtoolbar(){// TODO: 在此添加命令处理程序代码if(m_ToolBar.IsWindowVisible()){GetWindowRect(&rect_window);m_ToolBar.GetWindowRect(&rect_toolbar);m_ToolBar.ShowWindow(SW_HIDE);DockControlBar(&m_ToolBar);GetMenu()->GetSubMenu(2)->CheckMenuItem(2,MF_BYPOSITION|MF_UNCHECKED);}else{int DX=rect_toolbar.left-rect_window.left;int DY=rect_toolbar.top-rect_window.top;if(((DX>dx)&&(DY>dy))||(rect_toolbar.left-2<rect_window.left)||(rect_toolbar.left>rect_window.right)||(rect_toolbar.bottom<rect_window.top)){CPoint point(rect_toolbar.left,rect_toolbar.top);m_ToolBar.ShowWindow(SW_SHOW);FloatControlBar(&m_ToolBar,point);}else {ScreenToClient(rect_toolbar);m_ToolBar.MoveWindow(rect_toolbar);m_ToolBar.ShowWindow(SW_SHOW);}GetMenu()->GetSubMenu(2)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED);}RecalcLayout(TRUE);//ShowControlBar(&m_ToolBar,!m_ToolBar.IsWindowVisible(),FALSE);}
当(DX>dx)&&(DY>dy)时,表明“新工具栏”按钮是朝着右下方的位置移动,当rect_toolbar.left-2<rect_window.left,表面浮动的工具栏移出了父窗口,且在父窗口的左边,其他的类似。
剩下的情况表明窗口没有拖动成浮动状态,应该继续让其停留在该停留的位置。
- 工具栏的显示和隐藏
- intellij idea 工具栏的隐藏和显示
- 显示隐藏工具栏
- iphone自动隐藏和显示工具栏和导航条
- 隐藏 gVim 的菜单栏和工具栏
- VC 显示 隐藏 工具栏 状态栏
- mac版本下的HBuilder工具栏的显示与隐藏
- Word中显示/隐藏图片工具栏的另类用法
- [IE 技巧] 显示/隐藏IE 的菜单/工具栏
- ckeditor 禁用和工具栏隐藏
- Emacs24隐藏工具栏菜单栏和滚动条无效的问题
- [Editing]动态显示、隐藏RCP工具栏
- [Editing]动态显示、隐藏RCP工具栏
- Android实现上下滑动隐藏/显示工具栏
- 工具栏的显示
- AndroidStudio 工具栏的显示
- ubuntu 下让gvim 自动最大化 全屏及隐藏菜单和工具栏 mac windows 全屏显示
- Iframe的隐藏和显示
- 南阳oj-29(求转置矩阵问题)解题报告
- hdu3709——数位dp
- FTPClient下载文件及目录
- 网线接法大全(RJ45型网线插头)
- hdu2546 01背包 重学背包
- 工具栏的显示和隐藏
- 打开RabbitMQ管理界面的注意点
- acmclub 2081 班级聚会上的游戏
- 【操作系统面试专题】:何谓死锁?产生死锁的原因和必要条件是什么?
- 记录一次mysql链接ERROR 2003错误
- uva 748 - Exponentiation 带小数点的大数乘法
- C++中的递归过程
- JDK环境变量配置
- 【操作系统面试专题】:分页和分段存储管理有何区别?