2015-01-21 2 views
1

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

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

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

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

Возможно, вы должны преобразовать x и y в координаты экрана с использованием функции ClientToScreen либо перед их сохранением, либо после прочтения их из файла. –

+0

Почему вы не используете CMFCToolbar? –

ответ

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

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

Сохраненные данные становятся неправильные значения тогда.

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

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

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

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 
    : 

} 
Смежные вопросы