如何获取拆分后的视图的尺寸?CSplitterWnd使用的问题

tomPeakz 2002-08-15 03:22:40
CCreateContext *pContext = (CCreateContext*)lpCreateStruct->lpCreateParams;
//lpCreateStruct->style |= WS_OVERLAPPED;

if(!m_spWnd.CreateStatic(this,1,2))
{
m_spWnd.DestroyWindow();
TRACE(_T("CreateStatic Err "));
return -1;
}
if(!m_spWnd.CreateView(0,0,RUNTIME_CLASS(CLeftView),
CSize(LEFT_VIEW_LEN,0),pContext))
{
m_spWnd.DestroyWindow();
TRACE(_T("CreateView Left Err "));
return -1;
}
if(!m_spWnd.CreateView(0,1,RUNTIME_CLASS(CRightView),
CSize(0,0),pContext))
{
m_spWnd.DestroyWindow();
TRACE(_T("CreateView Right Err "));
return -1;
}

创建了左右两个窗口,都是继承自CListView,在左右两个视图中的操作中,需要知道目前的尺寸,可是:
CListCtrl &theCtrl = GetListCtrl();
CRect rect;
theCtrl.GetClientRect(&rect);
居然得到的值是0?
为什么呢?
还有这个分割视图和其它视图做切换后,我原来添加的内容居然都变成空的了?除非我在切换前点击一下。气死我了。
...全文
102 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomPeakz 2002-08-15
  • 打赏
  • 举报
回复
找到问题:CView * pOldActiveView = pMainWnd->GetActiveView();
返回的是被点击的子视图的指针!
tomPeakz 2002-08-15
  • 打赏
  • 举报
回复
我发现问题了:SP++跟踪发现,我切换后,被点击的视图的Control ID变成了
0!所以出错。
这是怎么造成的呢?
tomPeakz 2002-08-15
  • 打赏
  • 举报
回复
可是我现在并不需要调用这两个方法啊?
我的主框架管理多个视图,每个视图单独被CSplitterWnd拆分,我的主
框架仅仅做切换工作,但是,切换后的视图显示有问题:很怪,
我在哪个ListView中点击,那个VIEW中的东西在切换后就消失了!
kingzai 2002-08-15
  • 打赏
  • 举报
回复
在CMainFrame中增加这两个方法,调用时:
CRightView*pRightView=GetRightPane();
pRightView->...
在CMainFrame.cpp创建之后调用,具体你试试就知道了

tomPeakz 2002-08-15
  • 打赏
  • 举报
回复
to kingzai() 出色!
告诉兄弟,在哪里写这些代码呢?
我在进行分割的视图中重载了方法:
OnCreate(LPCREATESTRUCT lpCreateStruct)//这里分割
OnInitialUpdate()

OnSize(UINT nType, int cx, int cy)
{

CView::OnSize(nType, cx, cy);
if(::IsWindow(m_spWnd.m_hWnd) && m_spWnd.IsWindowVisible())
{
m_spWnd.MoveWindow(0, 0, cx, cy);
}

}
tomPeakz 2002-08-15
  • 打赏
  • 举报
回复
看看我视图切换的代码。

/*
更换VIEW
*/
CFrameWnd * pMainWnd = (CFrameWnd *)AfxGetMainWnd();
CView * pOldActiveView = pMainWnd->GetActiveView();
if(pOldActiveView->IsKindOf(pNewView))
{
//Current Active view is equal to Newone
return TRUE;
}
//查找是否在VIEWLIST缓冲内
for(int i = 0; i < m_lstViewCache.size(); i++)
{
if(m_lstViewCache[i]->IsKindOf(pNewView))
{
//found
pMainWnd->SetActiveView(m_lstViewCache[i]);

m_lstViewCache[i]->ShowWindow(SW_SHOW);
pOldActiveView->ShowWindow(SW_HIDE);
::SetWindowLong(pOldActiveView->m_hWnd,GWL_ID,0);
//pOldActiveView->SetDlgCtrlID(0);
m_lstViewCache[i]->SetDlgCtrlID(AFX_IDW_PANE_FIRST);

pMainWnd->RecalcLayout();
return TRUE;
}
}
//Create it
::SetWindowLong(pOldActiveView->m_hWnd,GWL_ID,0);

CCreateContext context;
context.m_pNewViewClass = pNewView;
context.m_pCurrentDoc = this;
CView * pView = STATIC_DOWNCAST(CView,pMainWnd->CreateView(&context));
if(!pView)
{
return FALSE;
}
pOldActiveView->ShowWindow(SW_HIDE);
pView->ShowWindow(SW_SHOW);
pView->OnInitialUpdate();
pMainWnd->SetActiveView(pView);
pMainWnd->RecalcLayout();

m_lstViewCache.push_back(pView);
//pOldActiveView->DestroyWindow(); //As cache ,not delete
kingzai 2002-08-15
  • 打赏
  • 举报
回复
先得到两个视图的指针,再进行操作,such as
//得到右视图指针
CNetMonitorView* CMainFrame::GetRightPane()
{
CWnd* pWnd = wndSplitter.GetPane(0, 1);
CNetMonitorView* pView = DYNAMIC_DOWNCAST(CNetMonitorView, pWnd);
return pView;
}
//得到左视图指针
CGfxOutBarCtrl* CMainFrame::GetLeftPane()
{
CWnd* pWnd = wndSplitter.GetPane(0, 0);
CGfxOutBarCtrl* pView = DYNAMIC_DOWNCAST(CGfxOutBarCtrl, pWnd);
return pView;
}
tomPeakz 2002-08-15
  • 打赏
  • 举报
回复
哦,这样,谢谢。
那为何我的东西变成空的了呢?这时候我拖动分割条,
居然报告:pView为空。

CWnd* CSplitterWnd::GetPane(int row, int col) const
{
ASSERT_VALID(this);

CWnd* pView = GetDlgItem(IdFromRowCol(row, col));
ASSERT(pView != NULL); // panes can be a CWnd, but are usually CViews
return pView;
}
masterz 2002-08-15
  • 打赏
  • 举报
回复
int cur,min;
m_wndSplitter.GetRowInfo(0,cur,min);

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧