关于分割窗口的问题 我要创建这样一个程序,刚开始不分割窗口,点击视图上一个按钮后调到下一个页面,页面被分割成两个窗口.现在看到的资料都是在开始时oncreateclient时就已经分割好了,我想在程序运行中 再分割,而且还能返回分割前的状态 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 void CMainFrame::ChangeView(UINT nViewID, void* hint){ if (nViewID == m_uCurrentViewID) { return; } //get old view info CView* pOldActiveView = GetActiveView(); CView* pOldLeftView = NULL; if (m_pwndSplitter) { CWnd* pWnd = m_pwndSplitter->GetPane(0, 0); pOldLeftView = STATIC_DOWNCAST(CView, pWnd); pWnd = m_pwndSplitter->GetPane(0, 1); pOldActiveView = STATIC_DOWNCAST(CView, pWnd); } //not active anymore, change it's id. ::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_uCurrentViewID); //get new view info, menu, toolbar, and if dialogbar need to be displayed. CRuntimeClass* pNewViewClass; CRuntimeClass* pNewLeftViewClass; switch (nViewID) { case ID_VIEW_SINGLE: pNewViewClass = RUNTIME_CLASS(CSingleView); pNewLeftViewClass = NULL; break; case ID_VIEW_SPLITTED: pNewLeftViewClass = RUNTIME_CLASS(CSplittedLeftView); pNewViewClass = RUNTIME_CLASS(CSplittedRightView); break; default: ASSERT(0); return; } CSplitterWnd* pOldSplitter = m_pwndSplitter; m_pwndSplitter = 0; // create the new view CCreateContext context; context.m_pCurrentDoc = GetActiveDocument(); if (pNewLeftViewClass) { m_pwndSplitter = new CSplitterWnd(); m_pwndSplitter->CreateStatic(this, 1, 2); context.m_pNewViewClass = pNewLeftViewClass; m_pwndSplitter->CreateView(0, 0, pNewLeftViewClass, CSize(160, 160), &context); context.m_pNewViewClass = pNewViewClass; m_pwndSplitter->CreateView(0, 1, pNewViewClass, CSize(160, 160), &context); m_pwndLeftView = STATIC_DOWNCAST(CNaviTreeView, m_pwndSplitter->GetPane(0, 0)); //set the initial hint m_pwndLeftView->SetInitialNaviHint(hint); m_pwndLeftView->ShowWindow(SW_SHOW); m_pwndLeftView->OnInitialUpdate(); m_pwndRightView = STATIC_DOWNCAST(CView, m_pwndSplitter->GetPane(0, 1)); } else { m_pwndLeftView = NULL; context.m_pNewViewClass = pNewViewClass; m_pwndRightView = STATIC_DOWNCAST(CView, CreateView(&context)); } m_pwndRightView->ShowWindow(SW_SHOW); m_pwndRightView->OnInitialUpdate(); SetActiveView(m_pwndRightView); RecalcLayout(); m_uCurrentViewID = nViewID; // destroy old views after new view created. or the doc would be closed if (pOldSplitter) { pOldLeftView->DestroyWindow(); pOldActiveView->DestroyWindow(); pOldSplitter->DestroyWindow(); delete pOldSplitter; } else { pOldActiveView->DestroyWindow(); }} 在点击第一个页面调出另个一页面同事把第一个页面隐藏起来 在你另外一个页面写入oncreateclient 把第二个页面分割在你关掉另一个页面时把第一个页面显示出来! http://blog.csdn.net/visualeleven/article/details/6460564 动态改变分割窗口。看看我的ChangeSplit.zip(要1分) 分割窗口基本没有问题了,就是我在主框架切换视图的时候,视图的ondraw函数不会被自动调用,我想知道 怎样让切换后的view自动调用ondraw绘图,我是这样切分窗口的void CMainFrame::switchform(int nID){CView *pOldActiveView=GetActiveView(); //保存旧视图 CView *pNewActiveView=(CView*)GetDlgItem(nID); //取得新视图 if(pNewActiveView==NULL) { switch(nID) //这些ID是对话框的标志符,但也可以用其他的标志 { case IDD_DIALOG1 : pNewActiveView=(CView*)new dlgview; break; case IDD_DIALOG2 : pNewActiveView=(CView*)new dlgview2; break; case IDD_DIALOG5 : pNewActiveView=(CView*)new dlgview22; break; case IDD_DIALOG4 : pNewActiveView=(CView*)new dlgview4; break; } CCreateContext context; //将文挡和视图相连 context.m_pCurrentDoc=pOldActiveView->GetDocument(); //rect=CFrameWnd::rectDefault; pNewActiveView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE , CFrameWnd::rectDefault, this, nID, &context); //context.m_pNewViewClass=RUNTIME_CLASS(dlgview2); pNewActiveView->OnInitialUpdate(); } SetActiveView(pNewActiveView); //改变活动的视图 pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图 pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview)) pOldActiveView->SetDlgCtrlID(IDD_DIALOG1); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview2)) pOldActiveView->SetDlgCtrlID(IDD_DIALOG2); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview22)) pOldActiveView->SetDlgCtrlID(IDD_DIALOG5); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview4)) pOldActiveView->SetDlgCtrlID(IDD_DIALOG4);int nSwitchChildID = pNewActiveView->GetDlgCtrlID();pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);//pNewActiveView->SetDlgCtrlID(nSwitchChildID);delete pOldActiveView; //删除旧视图 RecalcLayout(); //调整框架窗口} 是不是在initinstance里切换就不会出现这样的问题?求方法 父子进程用Event如何通信 ! 如何捕获网页跳转的链接? 如何在一个文件特定位置写入数据 VC中工具条的格式(CBRS_GRIPPER ) 如何得到别的进程中的TreeView的子项句柄? 可以用VC开放类似http://www.bb100.com的BT下载软件。。。 类似于flashget点击关闭的按钮。 ado兼容问题 怎样能够得到指针所指内存块的大小? 如何用VC++实现监控过程中图片的自动定时保存? 改变对话框ID后添加按钮双击无响应
{
if (nViewID == m_uCurrentViewID)
{
return;
}
//get old view info
CView* pOldActiveView = GetActiveView();
CView* pOldLeftView = NULL;
if (m_pwndSplitter)
{
CWnd* pWnd = m_pwndSplitter->GetPane(0, 0);
pOldLeftView = STATIC_DOWNCAST(CView, pWnd);
pWnd = m_pwndSplitter->GetPane(0, 1);
pOldActiveView = STATIC_DOWNCAST(CView, pWnd);
}
//not active anymore, change it's id.
::SetWindowLong(pOldActiveView->m_hWnd, GWL_ID, m_uCurrentViewID);
//get new view info, menu, toolbar, and if dialogbar need to be displayed.
CRuntimeClass* pNewViewClass;
CRuntimeClass* pNewLeftViewClass;
switch (nViewID)
{
case ID_VIEW_SINGLE:
pNewViewClass = RUNTIME_CLASS(CSingleView);
pNewLeftViewClass = NULL;
break;
case ID_VIEW_SPLITTED:
pNewLeftViewClass = RUNTIME_CLASS(CSplittedLeftView);
pNewViewClass = RUNTIME_CLASS(CSplittedRightView);
break;
default:
ASSERT(0);
return;
}
CSplitterWnd* pOldSplitter = m_pwndSplitter;
m_pwndSplitter = 0;
// create the new view
CCreateContext context;
context.m_pCurrentDoc = GetActiveDocument();
if (pNewLeftViewClass)
{
m_pwndSplitter = new CSplitterWnd();
m_pwndSplitter->CreateStatic(this, 1, 2);
context.m_pNewViewClass = pNewLeftViewClass;
m_pwndSplitter->CreateView(0, 0, pNewLeftViewClass, CSize(160, 160), &context);
context.m_pNewViewClass = pNewViewClass;
m_pwndSplitter->CreateView(0, 1, pNewViewClass, CSize(160, 160), &context);
m_pwndLeftView = STATIC_DOWNCAST(CNaviTreeView, m_pwndSplitter->GetPane(0, 0));
//set the initial hint
m_pwndLeftView->SetInitialNaviHint(hint);
m_pwndLeftView->ShowWindow(SW_SHOW);
m_pwndLeftView->OnInitialUpdate(); m_pwndRightView = STATIC_DOWNCAST(CView, m_pwndSplitter->GetPane(0, 1));
}
else
{
m_pwndLeftView = NULL;
context.m_pNewViewClass = pNewViewClass;
m_pwndRightView = STATIC_DOWNCAST(CView, CreateView(&context));
}
m_pwndRightView->ShowWindow(SW_SHOW);
m_pwndRightView->OnInitialUpdate();
SetActiveView(m_pwndRightView);
RecalcLayout();
m_uCurrentViewID = nViewID; // destroy old views after new view created. or the doc would be closed
if (pOldSplitter)
{
pOldLeftView->DestroyWindow();
pOldActiveView->DestroyWindow();
pOldSplitter->DestroyWindow();
delete pOldSplitter;
}
else
{
pOldActiveView->DestroyWindow();
}
}
看看我的ChangeSplit.zip(要1分)
{CView *pOldActiveView=GetActiveView(); //保存旧视图
CView *pNewActiveView=(CView*)GetDlgItem(nID); //取得新视图 if(pNewActiveView==NULL)
{ switch(nID)
//这些ID是对话框的标志符,但也可以用其他的标志
{
case IDD_DIALOG1 :
pNewActiveView=(CView*)new dlgview;
break;
case IDD_DIALOG2 :
pNewActiveView=(CView*)new dlgview2;
break;
case IDD_DIALOG5 :
pNewActiveView=(CView*)new dlgview22;
break;
case IDD_DIALOG4 :
pNewActiveView=(CView*)new dlgview4;
break;
} CCreateContext context; //将文挡和视图相连
context.m_pCurrentDoc=pOldActiveView->GetDocument();
//rect=CFrameWnd::rectDefault; pNewActiveView->Create(NULL, NULL, WS_CHILD|WS_VISIBLE ,
CFrameWnd::rectDefault, this, nID, &context);
//context.m_pNewViewClass=RUNTIME_CLASS(dlgview2);
pNewActiveView->OnInitialUpdate();
} SetActiveView(pNewActiveView); //改变活动的视图
pNewActiveView->ShowWindow(SW_SHOW); //显示新的视图
pOldActiveView->ShowWindow(SW_HIDE); //隐藏旧的视图if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG1); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview2))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG2); else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview22))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG5);
else if(pOldActiveView->GetRuntimeClass() ==RUNTIME_CLASS(dlgview4))
pOldActiveView->SetDlgCtrlID(IDD_DIALOG4);
int nSwitchChildID = pNewActiveView->GetDlgCtrlID();
pNewActiveView->SetDlgCtrlID(AFX_IDW_PANE_FIRST);
//pNewActiveView->SetDlgCtrlID(nSwitchChildID);
delete pOldActiveView; //删除旧视图 RecalcLayout(); //调整框架窗口
}