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

  孙鑫老师的第九课,留下的一个作业:当工具栏在悬浮和停靠状态的显示和隐藏,显示前的位置需要和隐藏(关闭)前的位置保持一致。

  其实,关于工具栏的隐藏与显示问题,只需要考虑三种状态:(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

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_COMMAND(ID_TEST, &CMainFrame::OnTest)
	ON_COMMAND(IDM_VIEW_NEWTOOL, &CMainFrame::OnViewNewtool)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_NEWTOOL, &CMainFrame::OnUpdateViewNewtool)//
	ON_MESSAGE(UM_PROGRESS, &OnProgress)
	ON_WM_PAINT()
END_MESSAGE_MAP()

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());//改变菜单的选中状态
}

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值