c++ - CDockablePane 重启程序后不调整大小

标签 c++ mfc

我启动了一个单文档 MFC 项目,并创建了两个 CDockablePane
我遇到的问题是,如果我移动或调整 Pane 大小并退出程序,当我重新启动程序时它们的布局不会重置。他们的布局保持修改。

我猜我要么做错了什么,要么 Visual Studio 生成了一些我没有找到的代码。

我的 CMainFrame::OnCreate 函数:

// Headers...

#define IDC_MYPANE_1 100
#define IDC_MYPANE_2 101

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    // A lot of pre-generated code...

    if (this->InitMyPane1 () == FALSE) {
        return -1 ;
    }

    if (this->InitMyPane2 () == FALSE) {
        return -1 ;
    }

    return 0;   
}

我的面板初始化函数:

BOOL CMainFrame::InitMyPane1 ()
{
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_LEFT | CBRS_FLOAT_MULTI ;

    BOOL bOk = m_MyPane1.Create (
        _T ("MyPane 1"), this, 
        CRect (0, 0, 100, 300), TRUE, IDC_MYPANE_1, dwStyle
    ) ;

    if (bOk == FALSE) {
        return FALSE ;
    }

    m_MyPane1.EnableDocking (CBRS_ALIGN_ANY) ;
    this->DockPane ((CBasePane *) &m_MyPane1, AFX_IDW_DOCKBAR_LEFT) ;
    this->RecalcLayout () ;

    return bOk ;
}

BOOL CMainFrame::InitMyPane2 ()
{
    DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_LEFT | CBRS_FLOAT_MULTI ;

    BOOL bOk = m_MyPane2.Create (
        _T ("MyPane 2"), this, 
        CRect (0, 0, 200, 300), TRUE, IDC_MYPANE_2, dwStyle
    ) ;

    if (bOk == FALSE) {
        return FALSE ;
    }

    m_MyPane2.EnableDocking (CBRS_ALIGN_ANY) ;
    m_MyPane2.DockToWindow (&m_MyPane1, CBRS_ALIGN_RIGHT) ;

    this->RecalcLayout () ;

    return bOk ;
}

MyPane1OnCreateOnSize 函数:

int MyPane1::OnCreate (LPCREATESTRUCT lp)
{
    if (CDockablePane::OnCreate (lp) == -1) {
        return -1 ;
    }

    // Creates a CListCtrl for this pane (I have a member CListCtrl.)
    return this->CreateCListCtrl () ;
}

void MyPane1::OnSize (UINT nType, int cx, int cy)
{
    CDockablePane::OnSize (nType, cx, cy) ;

    CRect rect ;
    this->GetClientRect (&rect) ;

    m_MyList.SetWindowPos 
        (NULL, rect.left, rect.top, rect.Width (), rect.Height (), SWP_NOACTIVATE) ;

    m_MyList.SetColumnWidth (0, LVSCW_AUTOSIZE) ;
    m_MyList.SetColumnWidth (1, LVSCW_AUTOSIZE_USEHEADER) ;
}

MyPane2OnCreateOnSize 函数:

int MyPane2::OnCreate (LPCREATESTRUCT lp)
{
    if (CDockablePane::OnCreate (lp) == -1) {
        return -1 ;
    }

    // Creates a CListCtrl for this pane (I have a member CListCtrl.)
    return this->CreateCListCtrl () ;   
}

void MyPane2::OnSize (UINT nType, int cx, int cy)
{
    CDockablePane::OnSize (nType, cx, cy) ;

    CRect rect ;
    this->GetClientRect (&rect) ;

    m_MyList.SetWindowPos 
        (NULL, rect.left, rect.top, rect.Width (), rect.Height (), SWP_NOACTIVATE) ;

    m_MyList.SetColumnWidth (0, LVSCW_AUTOSIZE_USEHEADER) ;
    m_MyList.SetColumnWidth (1, LVSCW_AUTOSIZE_USEHEADER) ;
    m_MyList.SetColumnWidth (2, LVSCW_AUTOSIZE_USEHEADER) ;
    m_MyList.SetColumnWidth (3, LVSCW_AUTOSIZE_USEHEADER) ;
    m_MyList.SetColumnWidth (4, LVSCW_AUTOSIZE_USEHEADER) ;
    m_MyList.SetColumnWidth (5, LVSCW_AUTOSIZE_USEHEADER) ;
    m_MyList.SetColumnWidth (6, LVSCW_AUTOSIZE_USEHEADER) ;
    m_MyList.SetColumnWidth (7, LVSCW_AUTOSIZE_USEHEADER) ;
}

最佳答案

我认为停靠面板默认会记住它们的状态。看看herehere

关于c++ - CDockablePane 重启程序后不调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20641907/

相关文章:

C++ Linux 异步 HTTP POST (Boost::asio)

C++:用于循环打印地址而不是值的数组

c++ - SubclassWindow() 函数断言

C++ : Running a background task all the time on machine

c++ - 将静态控件子类化到对话框窗口

c++ - gcov 没有生成所有 gcda 文件

c++ - 为什么链表重新排序失败?

c++ - 与 gfortran 链接时未定义对 `std::chrono::_V2::system_clock::now()' 的引用

c++ - MFC CFindFile::FindNextFile 用法

c++ - 如何在CFormView中捕获ScrollToPosition事件?