Плавающая панель инструментов MFC всегда активна

Я новичок в MFC. Мне нужно было создать плавающую панель инструментов (CToolBar) без возможности стыковки, сохранения и восстановления ее последней позиции.

Панель инструментов также должна быть активна все время, но ее НЕ.
Когда я открываю новое дочернее окно (например, диалоговое окно) с мэйнфрейма, плавающая панель инструментов становится неактивной (я не могу нажимать на ее кнопки или перетаскивать и т. Д.).

В прошлом я использовал CDiaolog в стиле Overlapped, и он был плавающим и всегда активным, как мне было нужно. Можно ли сделать то же самое с моей плавающей панелью инструментов? Спасибо

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();
}
}
}

1

Решение

  1. Вам может потребоваться отладка, чтобы просмотреть его координаты, если они установлены правильно. Быть независимым. :п
  2. Исходя из вашего текущего опубликованного кода, я не вижу смысла ваших сохраненных данных, попробуйте это

    • скрывая панель инструментов
    • сохранение своих данных о положении
    • изменение положения родительского окна и
    • перезагрузка сохраненных координат.

Сохраненные данные становятся неверными значениями.

Я предлагаю вам захватить позицию, к которой вы хотите добавить свою панель инструментов жить . Это делает ваше приложение панели инструментов более общим.
Так,

  1. Сохраняйте расстояние в верхнем левом углу панели инструментов до родительских окон, а не от его координат.
  2. Получите ваши родительские координаты окон
  3. Перезагрузите панель инструментов на основе сохраненного расстояния

Конечно, есть и другие способы сделать это, но я думаю, что это более тривиально, чтобы выполнить то, что вы можете искать.

1

Другие решения

Используйте 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
:

}
0