版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huanhuanxiaoxiao/article/details/84679745
孙鑫老师的第九课,留下的一个作业:当工具栏在悬浮和停靠状态的显示和隐藏,显示前的位置需要和隐藏(关闭)前的位置保持一致。
其实,关于工具栏的隐藏与显示问题,只需要考虑三种状态:(1)在停靠状态下工具栏的显示与隐藏;(2)在悬浮状态下工具栏的显示与隐藏;(3)在悬浮状态下,通过点击关闭按钮去关闭工具栏,然后在显示工具栏的问题。
对于上面所述的第二种情况,要记住工具栏在将要隐藏时刻的窗口坐标(x,y),这一点可以在点击菜单项去隐藏工具栏的时候可以做到。同样对于第三种情况,要记住工具栏在关闭时刻的坐标位置,在这里我们可以自己创建一个类CMyToolbar,这个类继承于CToolbar,在这个类里面添加WM_WINDOWPOSCHANGED消息处理函数OnWindowPosChanged。这个消息每当工具栏的大小或者位置发生变化是就会触发,因此我们在每次触发这个消息的时候,在其处理函数里面先判读是否为悬浮状态,如果是再获取当前窗口的位置,然后保存起来。
最后,对于菜单上选中状态的改变,我们只需要对该菜单的ID相应UPDATE_COMMAND_UI,判断工具栏是否为显示、关闭。ps:这个之前在网上找了好久没有找到,后面孙老师在后面讲了。
代码:
MyToolbar.h:
#pragma once
#include "atltypes.h"
// CMyToolBar
class CMyToolBar : public CToolBar
{
DECLARE_DYNAMIC(CMyToolBar)
public:
CMyToolBar();
virtual ~CMyToolBar();
protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnWindowPosChanged(WINDOWPOS* lpwndpos);
CPoint m_point;//保存关闭时的坐标
};
MyToolbar.cpp:
// MyToolBar.cpp : 实现文件
//
...
BEGIN_MESSAGE_MAP(CMyToolBar, CToolBar)
ON_WM_WINDOWPOSCHANGED()
// ON_WM_DESTROY()
// ON_WM_CLOSE()
END_MESSAGE_MAP()
// CMyToolBar 消息处理程序
void CMyToolBar::OnWindowPosChanged(WINDOWPOS* lpwndpos)
{
CToolBar::OnWindowPosChanged(lpwndpos);
// TODO: 在此处添加消息处理程序代码
if (IsFloating())
{
CRect rect;
GetDockingFrame()->GetWindowRect(&rect);
m_point.x = rect.left;
m_point.y = rect.top;
}
}
MainFrame.h
private:
CRect m_rect; //保存在即将隐藏时窗口的位置
bool m_bIsFloating; //保存在工具栏窗口在隐藏式的状态(悬浮/停靠)
bool m_bIsVisble; //指示当前应该隐藏还是显示工具栏
MainFram.cpp
CMainFrame::CMainFrame()
{
// TODO: 在此添加成员初始化代码
m_bIsFloating = false;
m_bIsVisble = true;
}
...
void CMainFrame::OnViewNewtool()
{
// TODO: 在此添加命令处理程序代码
if (m_wndNewToolBar.IsWindowVisible() && m_bIsVisble)
{//工具栏是显示的,需要隐藏
if (m_wndNewToolBar.IsFloating())
{//工具栏是悬浮的
m_bIsFloating = true;
m_wndNewToolBar.GetDockingFrame()->GetWindowRect(&m_rect);//获取悬浮的位置
}
m_wndNewToolBar.ShowWindow(SW_HIDE);
DockControlBar(&m_wndNewToolBar);//使得工具栏停留在框架窗口
m_bIsVisble = false;//
}
else if(!m_wndNewToolBar.IsWindowVisible() && !m_bIsVisble)
{//工具栏是隐藏的,需要显示
if (m_bIsFloating)
{//隐藏前是悬浮的
m_wndNewToolBar.ShowWindow(SW_SHOW);
CPoint cp(m_rect.left, m_rect.top);
FloatControlBar(&m_wndNewToolBar, cp, CBRS_ALIGN_ANY);//工具栏显示的位置
}
else
{
m_wndNewToolBar.ShowWindow(SW_SHOW);
}
m_bIsVisble = true;
m_bIsFloating = false;
}
else
{//工具栏之前是关闭的
m_wndNewToolBar.ShowWindow(SW_SHOW);
FloatControlBar(&m_wndNewToolBar, m_wndNewToolBar.m_point, CBRS_ALIGN_RIGHT);
}
RecalcLayout();//当标准控制条打开或关闭或调整框架窗口的大小时,由框架调用。
}
void CMainFrame::OnUpdateViewNewtool(CCmdUI *pCmdUI)
{
// TODO: 在此添加命令更新用户界面处理程序代码
pCmdUI->SetCheck(m_wndNewToolBar.IsWindowVisible());//改变菜单的选中状态
}
这样就可以实现(悬浮)工具栏的显示、隐藏,以及菜单选中状态的改变