MFC浮动工具栏始终有效

时间:2015-01-21 11:42:43

标签: c++ mfc toolbar floating always-on-top

我' MFC的新功能。我需要创建一个浮动工具栏(CToolBar),没有对接选项,保存并恢复其最后一个位置。

工具栏也应始终处于活动状态,但不是。 当我从大型机打开一个新的子窗口(例如对话框)时,浮动工具栏变为未激活(我无法单击其按钮,或拖动它等等。)。

过去我曾使用过重叠风格的CDiaolog,它是浮动的,并且在我需要时始终处于活动状态。我的浮动工具栏是否可以这样做?感谢

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{     
   if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
   return -1;

   toolbarIconSize.cx = toolbarIconSize.cy = TOOLBAR_MAIN_ICON_SIZE;
   if ( !m_wndMyFloatingToolbar.Create(this,m_wndMyFloatingToolbar.GetBarStyle() |WS_EX_PALETTEWINDOW  | WS_EX_TOPMOST  |CBRS_FLOATING | WS_VISIBLE) ||
    !m_wndMyFloatingToolbar.LoadToolBar(IDR_GENERAL_TOOLBAR, toolbarIconSize))
    {
       TRACE0("Failed to create My Floating Toolbar\n");
       return -1;      // fail to create
    }

   m_wndMyFloatingToolbar.EnableDocking(0);
   EnableDocking(0);

   if (!CreateCtrlBar())
   {
       TRACE0("Failed to create ctrl toolbar\n");
       return -1;      // fail to create
   }

   // ...
   //...
   return 0; 
}

void CMainFrame::OnViewToolBar()
{
   // ...
   //...

   CPoint Pos = MyFloatingToolbarGetLastPosition(); \\Get last pos 
   FloatControlBar( &m_wndMyFloatingToolbar, Pos, CBRS_ALIGN_LEFT );
   MyFloatingToolbarSetIsVisible();
   FloatControlBar( &m_wndMyFloatingToolbar, Pos, CBRS_ALIGN_LEFT );
}
void CMainFrame::MyFloatingToolbarSetIsVisible()
{
   WINDOWPLACEMENT wp;
   m_wndMyFloatingToolbar.GetParent()->GetParent()->GetWindowPlacement(&wp);
   wp.showCmd = SW_SHOW;
   m_wndMyFloatingToolbar.GetParent()->GetParent()->SetWindowPlacement(&wp);

   m_wndMyFloatingToolbar.GetParent()->GetWindowPlacement(&wp);
   wp.showCmd = SW_SHOW;
   m_wndMyFloatingToolbar.GetParent()->SetWindowPlacement(&wp);

   m_wndMyFloatingToolbar.GetWindowPlacement(&wp);
   wp.showCmd = SW_SHOW;
   m_wndMyFloatingToolbar.SetWindowPlacement(&wp);
}
void CWJToolBar::OnWindowPosChanging(WINDOWPOS FAR* lpwndpos)
{ 
   CToolBar::OnWindowPosChanging(lpwndpos); 

   if ( GetBarStyle() & CBRS_FLOATING )
   {
       if((lpwndpos->flags & SWP_HIDEWINDOW) && ((this->GetParentFrame())->m_hWnd !=(this->GetTopLevelFrame())->m_hWnd)) 
       { 
           CMainFrame* mf = (CMainFrame*)(AfxGetApp()->GetMainWnd());
           mf->MyFloatingToolbarSavePosition();         
       }
   }
}

2 个答案:

答案 0 :(得分:1)

  1. 如果设置正确,您可能需要调试以查看其坐标。独立。 :P
  2. 根据您当前发布的代码,我看不到您存储数据的重点,请尝试此操作

    • 隐藏工具栏
    • 保存其位置数据
    • 更改父窗口位置和
    • 重新加载已保存的坐标。
  3. 然后保存的数据变为不正确的值。

    我建议您捕捉要添加工具栏直播的位置。这使您的工具栏应用程序更通用。 所以,

    1. 将工具栏保存到其父窗口的左上角距离,而不是其坐标
    2. 获取您的父窗口坐标
    3. 根据已保存的距离重新加载工具栏
    4. 当然有其他方法可以做到这一点,但我认为完成你可能正在寻找的东西更为微不足道。

答案 1 :(得分:0)

使用CMFCToolBar(而不是CToolBar),那么你只需要2个命令来实现这一点。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
  if (CMDIFrameWndEx::OnCreate(lpCreateStruct) == -1)
     return -1;

    :
    m_wndToolBar.SetPermament(TRUE);   // it removes CloseButton (=always active)

    CRect rect;
    GetClientRect(&rect);
    ClientToScreen(rect);
    rect.OffsetRect(100, 20);
    m_wndToolBar.FloatPane(rect);      // Float and move it to your wished coordinates
    :

}