我正在Visual Studio 2012上编写SDI应用程序.MFC向导生成了两个CDockablePane
派生的对象。右侧CPropertiesWnd
(CDockablePane
- 派生)对象名为m_wndProperties
。我在m_wndProperties
CPropertySheet
个对象中嵌入了CPageNone
(CPropertyPage
- 派生的)对象标题" 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_wndProperties
或m_pageNone
的大小以适应彼此?非常感谢你。
答案 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