MFC—工具栏的显示、隐藏以及浮动工具栏关闭时改变菜单的选中状态

版权声明:本文为博主原创文章,未经博主允许不得转载。 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());//改变菜单的选中状态
}

这样就可以实现(悬浮)工具栏的显示、隐藏,以及菜单选中状态的改变

猜你喜欢

转载自blog.csdn.net/huanhuanxiaoxiao/article/details/84679745
今日推荐