
在Visual C ++自动生成的MFC框架应用程序中,将浮动工具栏拖离主框架窗口时,通常在工具栏的右上角有一个“关闭”按钮. 应该说这个按钮是完全按照应用程序的用户界面(UI)设计规范设计的,这意味着所有窗口都应该有一个供用户关闭此窗口的位置. 但是一些开发人员建议不要使用此“关闭”按钮. 本示例通过自定义扩展的工具栏类达到删除工具栏上“关闭”按钮的目的. 程序编译并运行后的界面效果如图1所示:

图1.没有“关闭”按钮的浮动工具栏
I. 实施方法
首先,对于删除工具栏上的“关闭”按钮的问题,让我们确定实施思路. 因为我们要实现的功能与工具栏有关,所以所涉及的类必须与CToolBar有关. 其次,为了确定工具栏浮动后“关闭”按钮的状态,我们需要一个表示状态的成员变量. 第三,要实现工具栏的浮动特性,我们需要处理工具栏窗口的ON_WM_WINDOWPOSCHANGED消息. 此消息负责CToolBar窗口的大小,位置或Z坐标的更改. 为什么不使用WM_SIZE / OnSize来处理窗口大小的变化?因为仅在更改窗口大小且不更改窗口位置时才调用它,所以不必在每次浮动工具栏时都调用WM_SIZE / OnSize. 我们可以使用基类CControlBar的m_pDockBar成员变量来调用GetParent()以获取工具栏的父窗口. 为了更改父级窗口的样式,请达到系统菜单的目的,即删除“关闭”按钮.
有了这个主意mfc对话框去掉关闭按钮,让我们看一下具体的实现代码. 让我们从CToolBar派生一个新的类CToolBarEx. 因为我们的目的是在工具栏浮动时删除“关闭”按钮,所以我们仅判断工具栏是否浮动. 是的,可以使用CControlBar类的属性判断函数: BOOL IsFloating()const来完成此操作. 在新类中添加一个成员变量以使用它来指示“关闭”按钮的状态: BOOL m_bMenuRemoved. 当我们删除主机的系统菜单属性时,其值为TRUE. 接下来,我们使用m_pDockBar来确定父窗口类型是否为CMiniFrameWnd. 此类表示浮动工具栏周围的框架窗口. 经过上述处理,我们可以安全地从CToolBar中删除系统菜单. 这是处理ON_WM_WINDOWPOSCHANGED消息的代码:
void CToolBarEx :: OnWindowPosChanged(WINDOWPOS FAR * lpwndpos)
{
CToolBar :: OnWindowPosChanged(lpwndpos);
//浮动时只能调用一次.
if(IsFloating())
{
如果(m_pDockBar &&!m_bMenuRemoved)
{
CWnd * pParent = m_pDockBar-> GetParent();
如果(pParent-> IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)))
{
pParent-> ModifyStyle(WS_SYSMENU,0,0);
m_bMenuRemoved = TRUE;
}
}
}
否则,如果(m_bMenuRemoved){

m_bMenuRemoved =否;
}
}
两个编程步骤
1. 启动Visual C ++ 6.0,生成单个文档视图结构应用程序,并将程序命名为“ FltTBClsBtn”;
2. 使用类向导将新类CtoolBarEx添加到项目中,该类的基类为CToolBar;
3mfc对话框去掉关闭按钮,在CMainFrme类中,将成员变量m_wndToolBar的类型修改为CtoolBarEx;
4. 添加代码,编译并运行程序.
三,程序代码
///////////////////////////////////////////////// //// //////////////////////////////
// ToolBarEx.h: 头文件
#ifndef __TOOLBAREX_H __
#define __TOOLBAREX_H __
#if _MSC_VER> = 1000
#pragma一次
#endif // _MSC_VER> = 1000
CToolBarEx类: 公共CToolBar
{
DECLARE_DYNAMIC(CToolBarEx)
//施工
公开
:
CToolBarEx();

//属性
受保护的:
BOOL m_bMenuRemoved;
//操作
公开
:
//替代
// ClassWizard生成的虚函数重写
// {{AFX_VIRTUAL(CToolBarEx)
//}} AFX_VIRTUAL
//实施
公开
:
虚拟〜CToolBarEx();
//生成的消息映射功能
受保护的:
// {{AFX_MSG(CToolBarEx)
afx_msg void OnWindowPosChanged(WINDOWPOS FAR * lpwndpos);
//}} AFX_MSG
DECLARE_MESSAGE_MAP()
};
#endif // __TOOLBAREX_H __
///////////////////////////////////////////////// //// ////////////////////////// ToolBarEx.cpp: 实施文件

#include“ StdAfx.h”
#include“ ToolBarEx.h”
#include
#ifdef _DEBUG
#define新的DEBUG_NEW
#undef THIS_FILE
静态字符THIS_FILE [] = __FILE __;
#endif
CToolBarEx :: :: CToolBarEx()
{
// TODO: 在此处添加构造代码.
m_bMenuRemoved =否;
}
CToolBarEx ::〜CToolBarEx()
{
// TODO: 在此处添加销毁代码.
}
IMPLEMENT_DYNAMIC(CToolBarEx,CToolBar)
BEGIN_MESSAGE_MAP(CToolBarEx,CToolBar)
// {{AFX_MSG_MAP(CToolBarEx)
ON_WM_WINDOWPOSCHANGED()
//}} AFX_MSG_MAP
END_MESSAGE_MAP()
// CToolBarEx消息处理程序
void CToolBarEx :: OnWindowPosChanged(WINDOWPOS FAR * lpwndpos)
{
CToolBar :: OnWindowPosChanged(lpwndpos);
//浮动时只能调用一次.
if(IsFloating())
{
如果(m_pDockBar &&!m_bMenuRemoved)
{
CWnd * pParent = m_pDockBar-> GetParent();
如果(pParent-> IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)))
{
pParent-> ModifyStyle(WS_SYSMENU,0,0);
m_bMenuRemoved = TRUE;
}
}
}
否则,如果(m_bMenuRemoved){
m_bMenuRemoved =否;
}
}
四个摘要
此示例使用自定义类处理Windows中的窗口位置更改消息,以达到删除浮动工具栏上的“关闭”按钮的目的. 在上述过程中,主要任务是确定当前窗口的父窗口是否为浮动工具栏的框架窗口类-CMiniFrameWnd类.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-160176-1.html
淘宝上买小米4
#fx_4walls#加油
太爱你了