浮动状态栏 FloatControlBar()

本文介绍如何使用MFC创建并设置浮动工具栏,包括初始化工具栏、设置停靠选项及浮动位置等步骤。

浮动状态栏 FloatControlBar( &m_wndToolBar, pt):
 CToolBar    m_wndToolBar;


m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_LEFT/*左停靠也可不要*/
  | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
  !m_wndToolBar.LoadToolBar(IDR_MAINFRAME));

//如果是浮动状态栏,则设置停靠在哪可以不要(即不用CBRS_LEFT也行)

 

 //即使是浮动工具栏,下面二行EnableDocking()也要,否则运行时会出错.
nbsp;m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
 EnableDocking(CBRS_ALIGN_ANY);
 //DockControlBar(&m_wndToolBar);//DockControlBar是停靠在窗口的边框上,FloatControlBar()可浮动于任何位置
 CPoint pt( 100, 100);
 FloatControlBar( &m_wndToolBar, pt);//浮动工具栏,pt为工具栏的左上角点

 

效果如图所示:

写了一个自定义WsdkUiToolbarCtrlCls,应用层WsdkUiToolBarHandlerCls。 结合已有结构,实现长按Pin图标,以工具栏的形式显示子图标按钮以供选择,短按图标,直接执行当前图标按钮对应的函数。弹出的工具栏需要结合当前位置,自适应竖排或者横排。 头文件分别是“class WsdkUiToolBarCtrlCls : public CToolBar { DECLARE_DYNAMIC(WsdkUiToolBarCtrlCls) public: WsdkUiToolBarCtrlCls(); virtual ~WsdkUiToolBarCtrlCls(); //创建ToolBar工具栏,默认停靠在右侧 //注意:不再使用 TBSTYLE_TRANSPARENT 透明样式,以解决高版本CAD工具栏显示问题。 BOOL Create(CFrameWnd *pFrameWnd, CWnd *pHanlderWnd = NULL, const CString &strTitle = _T(""), int nIDResource = -1, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_SIZE_DYNAMIC | CBRS_FLYBY | CBRS_TOP | CBRS_TOOLTIPS | CBRS_GRIPPER | TBSTYLE_WRAPABLE | TBSTYLE_FLAT); public: //设置ToolBar标题 void SetTitle(const CString &strTitle); //初始化ToolBar按钮图标的图像列表。需在Creat()之后,务必初始化图像列表。 void InitImageList(int cx = 16, int cy = 16); //ToolBar创建指定数量按钮,并依此设置其命令ID。lpIDArray允许为NULL。 //务必注意:nIDCount 指定按钮的数量,务必确保后续SetButtonInfo()时索引在指定数量范围内容,否则按钮虽然可以设置,但是按钮的尺寸不正确。 BOOL SetButtons(const UINT *lpIDArray, int nIDCount); //ToolBar设置指定按钮为普通按钮,并设置其命令ID、图标资源、提示信息、状态栏提示信息。 //参数:nIndex 按钮的索引;nID 命令ID;ID_IconRes 图标资源;strToolTip 提示信息;strToolTipStatusBar 状态栏提示信息。 //务必注意:nIndex索引必须为有效索引,否则按钮虽然可以设置,但是按钮的尺寸不正确。 void SetButtonInfo(int nIndex, UINT nID, int ID_IconRes, const CString &strToolTip = _T(""), const CString &strToolTipStatusBar = _T("")); //按钮的状态栏提示信息 是否使能。默认 已使能 bool vIsToolTipStatusBarEnable() const{ return this->m_bToolTipStatusBarEnable; } void SetToolTipStatusBarEnable(bool bVal){ this->m_bToolTipStatusBarEnable = bVal; } //ToolBar设置指定按钮为分隔符,可以设置分隔符的宽度。 void SetSeparatorInfo(int nIndex, int nWidth = -1); /* 工具栏的切换、覆盖 */ //当前ToolBar切换、覆盖指定ToolBar,保持原ToolBar的停靠或浮动的状态、坐标,并隐藏原ToolBar。参数: bShow 是否显示当前ToolBar。 //如果原ToolBar初始状态为隐藏,则指定ToolBar保持隐藏状态。 bool ToolBarFullCover(WsdkUiToolBarCtrlCls *pToolBarOrig, BOOL bShow); /* ToolBar停靠或浮动 */ //ToolBar当前是否处于浮动 bool IsFloating() const{ return (TRUE == CControlBar::IsFloating()); } //ToolBar停靠,nDockBarID 可以为AFX_IDW_DOCKBAR_RIGHT或AFX_IDW_DOCKBAR_TOP等 void DockControlBar(UINT nDockBarID = AFX_IDW_DOCKBAR_RIGHT, LPCRECT lpRect = NULL); //ToolBar浮动 void FloatControlBar(CPoint point, DWORD dwStyle = CBRS_ALIGN_TOP); //重新计算布局 void RecalcLayout(BOOL bNotify = TRUE); //ToolBar是否可见 bool vIsVisible() const { return m_bIsVisible && WSDK_UI_IS_SHOW(this->GetParentFrame()); } //ToolBar显示或隐藏 void ShowControlBar(BOOL bShow, BOOL bDelay); //ToolBar启用或禁用指定按钮。注意,根据命令ID来指定按钮。 BOOL EnableButton(int nID, BOOL bEnable = TRUE); //ToolBar隐藏或显示指定的按钮。注意,根据命令ID来指定按钮。 BOOL HideButton(int nID, BOOL bHide = TRUE); //ToolBar是否有效、成功创建。注意,只有Create()成功创建后,才有效。 const bool& IsValid() const{ return m_bIsValid; } private: //ToolBar设置指定按钮的命令ID、样式和图标资源。 //参数:nIndex 按钮或分隔符的索引;nID 命令ID;nStyle 按钮样式,TBBS_BUTTON或TBBS_SEPARATOR等;ID_IconRes 图标资源 //务必注意:分隔符的设置方式,nID 必须为ID_SEPARATOR(即0),nStyle 按钮样式为TBBS_SEPARATOR。 // 如果分隔符nID不为ID_SEPARATOR,则ToolBar竖直放置时,分隔符无法自动横向。 //如果nStyle为TBBS_SEPARATOR时,ID_IconRes值作为分隔符的宽度。 void SetButtonInfo(int nIndex, UINT nID, UINT nStyle, int ID_IconRes); void _setVisible(bool bVal = true){ m_bIsVisible = bVal; } /* 成员变量 */ private: CWnd *m_pHandlerWnd; //当前ToolBar的拥有者、持有者,其将接受ToolBar的通知。一般为WsdkUiToolBarHandlerCls对象。 CFrameWnd *m_pFrameWnd; //主程序AutoCAD CMDIFrameWnd object。即acedGetAcadFrame()。 int m_nIDResource; //ToolBar资源ID。可以通过加载资源ID创建ToolBar,也可以动态创建ToolBar。 WsdkUiImageListCls *m_pIconList; //按钮的图标,仅支持ICON,不使用位图 std::vector<CString> *m_pToolTip; //按钮的提示信息 std::vector<CString> *m_pToolTipStatusBar; //按钮的状态栏提示信息 bool m_bToolTipStatusBarEnable; //按钮的状态栏提示信息 是否使能 bool m_bIsVisible; //当前ToolBar是否可见 bool m_bIsValid; //ToolBar是否成功创建 private: //不支持 赋值和拷贝。*必须,且必要。因为成员变量使用了指针*(内存资源) WsdkUiToolBarCtrlCls(const WsdkUiToolBarCtrlCls&) Wsdk_DELETE; WsdkUiToolBarCtrlCls& operator = (const WsdkUiToolBarCtrlCls&) Wsdk_DELETE; protected: DECLARE_MESSAGE_MAP() afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnUpdateToolBar(CCmdUI *pCmdUI); //----- See TN031 afx_msg BOOL OnToolTipNotify(UINT id, NMHDR * pNMHDR, LRESULT * pResult); };” “class WsdkUiToolBarHandlerCls : public CWnd { DECLARE_DYNAMIC(WsdkUiToolBarHandlerCls) public: WsdkUiToolBarHandlerCls() :m_pAcApDocObjShowed(NULL), m_pDocObjShowed(NULL), m_pToolbar(NULL), m_oToolbarBlank(), m_bVisibleOrig(TRUE){ } virtual ~WsdkUiToolBarHandlerCls(){} //显示或不显示 工具栏 bool vShowToolBar(); //工具栏 是否已显示 bool vIsVisible() const; //工具栏切换、显示指定文档。如果为NULL或无效AcApDoc对象,则仅显示About按钮。注意,pAcApDocObj允许不是项目文件 Wsdk::ErrorStatus vToolBarActivate(AcApDocument *pAcApDocObj, bool bRefresh = false); //工具栏关闭指定文档。 Wsdk::ErrorStatus vToolBarCloseAcApDoc(const AcApDocument *pAcApDocObj); protected: DECLARE_MESSAGE_MAP() afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); afx_msg void OnDestroy(); afx_msg void OnBtnAbout(); afx_msg void OnBtnAddDevice(); afx_msg void OnBtnAddConn(); afx_msg void OnBtnAddPin(); afx_msg void OnBtnAddNet(); private: AcApDocument *m_pAcApDocObjShowed; //当前显示的文档AcAp对象 const WsdkDocObjCls *m_pDocObjShowed; //当前显示的文档AcAp对象对应的DocObj WsdkUiToolBarCtrlCls *m_pToolbar; //ToolBar工具栏 WsdkUiToolBarCtrlCls m_oToolbarBlank; //ToolBar工具栏的空白成员变量(仅适用于非项目文件) BOOL m_bVisibleOrig; //原ToolBar工具是显示 private: //不支持 赋值和拷贝。*必须,且必要。因为成员变量使用了指针*(内存资源) WsdkUiToolBarHandlerCls(const WsdkUiToolBarHandlerCls&) Wsdk_DELETE; WsdkUiToolBarHandlerCls& operator = (const WsdkUiToolBarHandlerCls&) Wsdk_DELETE; };”
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值