Mfc 使用CSplitterWndEx向固定面板(CDockablePane)添加两个对话框(CDialog)
在MFC应用程序中, 有一个可停靠窗格,使用CSplitterWndEx将其分为两行。我尝试使用此拆分器添加两个对话框:Mfc 使用CSplitterWndEx向固定面板(CDockablePane)添加两个对话框(CDialog),mfc,dialog,split,dockable-windows,Mfc,Dialog,Split,Dockable Windows,在MFC应用程序中, 有一个可停靠窗格,使用CSplitterWndEx将其分为两行。我尝试使用此拆分器添加两个对话框: BOOL CPaneSplitter::AddWindow(int row, int col, CWnd* pWnd , CString clsName , DWORD dwStyle,DWORD dwStyleEx, SIZE sizeInit) { // set the initial size for that pane m_pColInfo[col]
BOOL CPaneSplitter::AddWindow(int row, int col, CWnd* pWnd , CString clsName ,
DWORD dwStyle,DWORD dwStyleEx, SIZE sizeInit)
{
// set the initial size for that pane
m_pColInfo[col].nIdealSize = sizeInit.cx;
m_pRowInfo[row].nIdealSize = sizeInit.cy;
ASSERT(pWnd->m_hWnd == NULL); // not yet created
// Create with the right size (wrong position)
CRect rect(CPoint(0,0), sizeInit);
if (!pWnd->CreateEx(dwStyleEx,clsName,NULL,dwStyle,rect,this,IdFromRowCol(row, col)))
{
return FALSE;
}
}
编辑:
下面是创建拆分器的代码:
int CSplitePane::OnCreate(LPCREATESTRUCT lp)
{
if(CDockablePane::OnCreate(lp)==-1)
return -1;
m_wndSplitter.CreateStatic(this,2,1);
DWORD dwStyle = WS_CHILD | WS_VISIBLE ;
if(!m_wndSplitter.AddWindow(0,0,&m_ChildDlg1,_T("My_Dailog_Pane"),dwStyle,0,CSize(100,100)))
return -1;
m_ChildDlg1.ShowWindow(SW_SHOWDEFAULT);
dwStyle = WS_CHILD | WS_VISIBLE | LVS_REPORT | LVS_SHAREIMAGELISTS;
if(!m_wndSplitter.AddWindow(1,0,&m_wndList,WC_LISTVIEW,dwStyle,0,CSize(100,100)))
return -1;
m_wndList.ModifyStyle(LVS_TYPEMASK, LVS_ICON);
return 0 ;
}
void CSplitePane::OnSize(UINT nType,int cx,int cy)
{
CDockablePane::OnSize(nType,cx,cy);
int cyTlb =0;// m_wndToolbar.CalcFixedLayout(FALSE, TRUE).cy;
CRect rect;
GetClientRect(rect);
m_ChildDlg1.SetWindowPos(NULL,rect.left, rect.top, rect.Width(),rect.Height(),SWP_NOACTIVATE|SWP_NOZORDER);
m_wndSplitter.SetWindowPos(NULL,rect.left
, rect.top + cyTlb
, rect.Width() , rect.Height() - cyTlb , SWP_NOZORDER | SWP_NOACTIVATE);
}
此方法接受CWnd作为参数,但我传递对话框本身,因此当应用程序运行时,窗格被分割,但对话框控件不在其中
所以我的问题是:
是否可以使用CSplitterWndEx将CDialog对象添加到窗格中 也许你要找的是
cpaedialog
。查看VS2008功能包示例中的SetPaneSize示例。样本中的例外项:
void CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
...
if (!m_wndDlgBar.Create (_T("DialogBar"), this, TRUE,
MAKEINTRESOURCE (IDD_DLG_BAR),
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI,
ID_VIEW_DLGBAR))
{
TRACE0("Failed to create Dialog Bar\n");
return FALSE; // fail to create
}
m_wndDlgBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndDlgBar.DockToWindow (&m_wndWorkSpace, CBRS_ALIGN_BOTTOM);
...
}
void CMainFrame::OnViewDialogBar()
{
ShowPane (&m_wndDlgBar, !(m_wndDlgBar.IsVisible ()), FALSE, TRUE);
RecalcLayout ();
}
...
使用CFormView派生类怎么样?是否
dwStyle
包含WS\u VISIBLE
?谢谢用户,是的。我用创建拆分器的方法更新了问题。谢谢,如果我在cpaedialog上使用上述AddWindow方法,创建了CWnd,但对话框上没有显示任何内容,当鼠标在对话框内移动时,它会在HitTest方法中崩溃:CDockingManager*pDockManager=afxGlobalUtils.GetDockingManager(GetDockSiteFrameWnd());确保(pDockManager!=NULL | | afxGlobalUtils.m|u bDialogApp);如果我使用CPaneDialog“Create”方法来创建对话框,那么它会在GetPane方法中崩溃:CWnd*pView=GetDlgItem(IdFromRowCol(row,col));断言(pView!=NULL);我试着用标签栏来显示窗格,而不是将对话框放在一个窗格中。我想你忘了一些代码来正确地集成cpaedialog。我真的建议您检查SetPaneSize示例,看看它是如何工作的。我找不到那个例子。我应该在哪里买?(我使用VS2013)。你有这个例子吗?也许可以寄给我?它来自VS2008功能包。以错误的顺序安装VS SP1和Features Pack时出现问题,导致示例未安装到您的文档文件夹(如果我没有记错的话)。