2009-12-30 1 views
4

세션간에 도구 모음의 위치가 제대로 복원되지 않는 CMFCToolbar 클래스에 문제가 있습니다.세션간에 CMFC 도구 모음 레이아웃이 제대로 복원되지 않음

여기 alt text http://www.achavis.net/toolbar1.png

이 도구 모음은 응용 프로그램을 다시 시작할 때 복원하는 방법의 스크린 샷 : 여기

앱이 닫히기 전에 도구 모음이 배열하는 방법의 스크린 샷

alt text http://www.achavis.net/toolbar2.png

첫 번째 도구 모음 위에 나타나는 큰 간격과 두 번째 도구 모음이 바로 아래에 있지 않고 기본 도구 모음의 오른쪽에 있습니다.

내 응용 프로그램에 문제가있어서 응용 프로그램 마법사를 사용하여이 테스트 응용 프로그램을 생성 한 다음 두 번째 도구 모음을 수동으로 추가했습니다.

필자가 잘못하고있는 것이 있거나 기능 팩 코드의 버그가 많은 특성 때문인지 알고 싶습니다. 명시 적으로 ID를 상기와 같이 기본 매개 변수에 의존 반대로와 도구 모음 을 만들어이 문제는 해결되었습니다

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

    BOOL bNameValid; 

    // set the visual manager used to draw all user interface elements 
    CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerOffice2007)); 

    // set the visual style to be used the by the visual manager 
    CMFCVisualManagerOffice2007::SetStyle(CMFCVisualManagerOffice2007::Office2007_LunaBlue); 

    if (!m_wndMenuBar.Create(this)) 
    { 
     TRACE0("Failed to create menubar\n"); 
     return -1;  // fail to create 
    } 

    m_wndMenuBar.SetPaneStyle(m_wndMenuBar.GetPaneStyle() | CBRS_SIZE_DYNAMIC | CBRS_TOOLTIPS | CBRS_FLYBY); 

    // prevent the menu bar from taking the focus on activation 
    CMFCPopupMenu::SetForceMenuFocus(FALSE); 

    if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
     !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) 
    { 
     TRACE0("Failed to create toolbar\n"); 
     return -1;  // fail to create 
    } 

    CString strToolBarName; 
    bNameValid = strToolBarName.LoadString(IDS_TOOLBAR_STANDARD); 
    ASSERT(bNameValid); 
    m_wndToolBar.SetWindowText(strToolBarName); 

    m_wndToolBar.EnableTextLabels(); 

    if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) || 
     !m_wndToolBar2.LoadToolBar(IDR_TOOLBAR)) 
    { 
     TRACE0("Failed to create toolbar2\n"); 
     return -1;  // fail to create 
    } 

    CString strCustomize("Toolbar2"); 
    m_wndToolBar2.EnableCustomizeButton(TRUE, ID_VIEW_CUSTOMIZE, strCustomize); 

    // Allow user-defined toolbars operations: 
    InitUserToolbars(NULL, uiFirstUserToolBarId, uiLastUserToolBarId); 

    if (!m_wndStatusBar.Create(this)) 
    { 
     TRACE0("Failed to create status bar\n"); 
     return -1;  // fail to create 
    } 
    m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT)); 

    // TODO: Delete these five lines if you don't want the toolbar and menubar to be dockable 
    m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY); 
    m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY); 
    m_wndToolBar2.EnableDocking(CBRS_ALIGN_ANY); 
    EnableDocking(CBRS_ALIGN_ANY); 
    DockPane(&m_wndMenuBar); 
    DockPane(&m_wndToolBar); 
    DockPane(&m_wndToolBar2); 


    // enable Visual Studio 2005 style docking window behavior 
    CDockingManager::SetDockingMode(DT_SMART); 
    // enable Visual Studio 2005 style docking window auto-hide behavior 
    EnableAutoHidePanes(CBRS_ALIGN_ANY); 

    // Load menu item image (not placed on any standard toolbars): 
    CMFCToolBar::AddToolBarForImageCollection(IDR_MENU_IMAGES, theApp.m_bHiColorIcons ? IDB_MENU_IMAGES_24 : 0); 

    // create docking windows 
    if (!CreateDockingWindows()) 
    { 
     TRACE0("Failed to create docking windows\n"); 
     return -1; 
    } 

    m_wndFileView.EnableDocking(CBRS_ALIGN_ANY); 
    m_wndClassView.EnableDocking(CBRS_ALIGN_ANY); 
    DockPane(&m_wndFileView); 
    CDockablePane* pTabbedBar = NULL; 
    m_wndClassView.AttachToTabWnd(&m_wndFileView, DM_SHOW, TRUE, &pTabbedBar); 
    m_wndOutput.EnableDocking(CBRS_ALIGN_ANY); 
    DockPane(&m_wndOutput); 


    // Enable toolbar and docking window menu replacement 
    EnablePaneMenu(TRUE, ID_VIEW_CUSTOMIZE, strCustomize, ID_VIEW_TOOLBAR); 

    // enable quick (Alt+drag) toolbar customization 
    CMFCToolBar::EnableQuickCustomization(); 

    if (CMFCToolBar::GetUserImages() == NULL) 
    { 
     // load user-defined toolbar images 
     if (m_UserImages.Load(_T(".\\UserImages.bmp"))) 
     { 
      m_UserImages.SetImageSize(CSize(16, 16), FALSE); 
      CMFCToolBar::SetUserImages(&m_UserImages); 
     } 
    } 

    // enable menu personalization (most-recently used commands) 
    // TODO: define your own basic commands, ensuring that each pulldown menu has at least one basic command. 
    CList<UINT, UINT> lstBasicCommands; 

    lstBasicCommands.AddTail(ID_FILE_NEW); 
    lstBasicCommands.AddTail(ID_FILE_OPEN); 
    lstBasicCommands.AddTail(ID_FILE_SAVE); 
    lstBasicCommands.AddTail(ID_FILE_PRINT); 
    lstBasicCommands.AddTail(ID_APP_EXIT); 
    lstBasicCommands.AddTail(ID_EDIT_CUT); 
    lstBasicCommands.AddTail(ID_EDIT_PASTE); 
    lstBasicCommands.AddTail(ID_EDIT_UNDO); 
    lstBasicCommands.AddTail(ID_APP_ABOUT); 
    lstBasicCommands.AddTail(ID_VIEW_STATUS_BAR); 
    lstBasicCommands.AddTail(ID_VIEW_TOOLBAR); 
    lstBasicCommands.AddTail(ID_SORTING_SORTALPHABETIC); 
    lstBasicCommands.AddTail(ID_SORTING_SORTBYTYPE); 
    lstBasicCommands.AddTail(ID_SORTING_SORTBYACCESS); 
    lstBasicCommands.AddTail(ID_SORTING_GROUPBYTYPE); 

    CMFCToolBar::SetBasicCommands(lstBasicCommands); 

    return 0; 
} 

답변

3

: 여기

는 도구 모음을 설정 내 CMainFrame 클래스에서 코드입니다 암호.

도구 모음의 상태가 저장된 레지스트리 키는 ID를 기반으로하므로 두 번째 도구 모음은 첫 번째 도구 모음 맨 위에 상태를 저장하고있었습니다. 여기

문제 해결 코드 변경은 다음과 같습니다 ...

if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1,1,1,1), IDR_MAINFRAME) || 
    !m_wndToolBar.LoadToolBar(theApp.m_bHiColorIcons ? IDR_MAINFRAME_256 : IDR_MAINFRAME)) 
{ 
    TRACE0("Failed to create toolbar\n"); 
    return -1;  // fail to create 
} 

if (!m_wndToolBar2.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC, CRect(1,1,1,1), IDR_TOOLBAR) || 
    !m_wndToolBar2.LoadToolBar(IDR_TOOLBAR)) 
{ 
    TRACE0("Failed to create toolbar2\n"); 
    return -1;  // fail to create 
}