如何调整CDockablePane的大小?

时间:2018-01-12 13:54:09

标签: c++ mfc

我正在Visual Studio 2012上编写SDI应用程序.MFC向导生成了两个CDockablePane派生的对象。右侧CPropertiesWndCDockablePane - 派生)对象名为m_wndProperties。我在m_wndProperties CPropertySheet个对象中嵌入了CPageNoneCPropertyPage - 派生的)对象标题" HELP" like this(我直接使用CPropertySheet类)。但是,CPropertySheet对象的实际大小为bigger

我尝试在对话框编辑器中调整与CPageNone对象(名为m_pageNone)相关的对话框的大小。这没有效果。在MainFrm.cpp中,我能找到的与m_wndProperties相关的唯一行是:

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    .....
    m_wndProperties.EnableDocking(CBRS_ALIGN_RIGHT);
    DockPane(&m_wndProperties);
    .....
}

.....

BOOL CMainFrame::CreateDockingWindows()
{
    .....
    CString strPropertiesWnd;
    bNameValid = strPropertiesWnd.LoadString(IDS_PROPERTIES_WND);
    ASSERT(bNameValid);
    if (!m_wndProperties.Create(strPropertiesWnd, this, CRect(0, 0, 200, 200), TRUE, ID_VIEW_PROPERTIESWND, WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_RIGHT | CBRS_FLOAT_MULTI))
    {
        TRACE0("無法建立 [屬性] 視窗\n");
        return FALSE; // 無法建立
    }
    .....
}

.....

void CMainFrame::SetDockingWindowIcons(BOOL bHiColorIcons)
{
    .....
    HICON hPropertiesBarIcon = (HICON) ::LoadImage(::AfxGetResourceHandle(), MAKEINTRESOURCE(bHiColorIcons ? IDI_PROPERTIES_WND_HC : IDI_PROPERTIES_WND), IMAGE_ICON, ::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON), 0);
    m_wndProperties.SetIcon(hPropertiesBarIcon, FALSE);

}

以下是我AdjustLayout()中的PropertiesWnd.cpp

void CPropertiesWnd::AdjustLayout()
{
    if (GetSafeHwnd () == NULL || (AfxGetMainWnd() != NULL && AfxGetMainWnd()->IsIconic()))
    {
        return;
    }

    CRect rectClient;
    GetClientRect(rectClient);

    m_PropertySheet.SetWindowPos (NULL, rectClient.left, rectClient.top, rectClient.Width (), rectClient.Height (), SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE);
}

在我的PageNone.cpp中,我只有三个函数:默认构造函数,默认析构函数和DoDataExchange

我的问题是如何调整m_wndPropertiesm_pageNone的大小以适应彼此?非常感谢你。

2 个答案:

答案 0 :(得分:0)

我以不同的方式工作(代码太大而无法提供此答案,但主要观点是:

a)在CMainFrame::OnCreate()

中不做任何事情

b)在CMainFrame::CreateDockingWindows()之后,在m_wndProperties.Create()之后添加以下代码

m_PropertySheet.Create(...);
CRect rc;
m_PropertySheet.GetRect(&rc);
m_wndProperties.SetMinSize(rc.Width(), rc,Height());
m_wndProperties.EnableDocking(CBRS_ALIGN_RIGHT);
DockPane(&m_wndProperties);
ShowPane(&m_wndProperties, TRUE, FALSE, TRUE);

答案 1 :(得分:0)

AdjustLayout()中的代码是正确的,但我认为在启动过程中它会被称为太早。因为默认大小将从CWinAppEx::LoadState()读取,CWinAppEx::EnableLoadWindowPlacement(FALSE)始终从注册表中读取以前的大小。它可能会被InitInstance()禁用。未经测试。

CMainFrame::Create() .. SetTimer(123,2000,NULL);末尾发布用户定义的消息。或者只是尝试使用void CMainFrame::OnTimer(UINT_PTR nIDEvent) { if (nIDEvent == 123) { m_wndProperties.SetWindowPos(this, 0, 0, 400, 200, SWP_NOZORDER | SWP_FRAMECHANGED); RecalcLayout(); KillTimer(123); } CFrameWndEx::OnTimer(nIDEvent); }

中的计时器
devDependencies