分割视,在OnSize函数的GetColumnInfo出错,在OnSizing中竟没有问题

keyek 2002-11-26 10:31:02
我想试着将视静态分割成2*2的,并且在改变子窗口的时候保持比例(包括resize和min,max).但用在OnSize函数
的GetColumnInfo出错,在OnSizing中竟没有问题.经跟踪在OnSizing对GetColumnInfo的调用中的m_pColInfo
显示为+ m_wndSplitter {CSplitterWnd hWnd=0x001e035c} CSplitterWnd,
里面的m_pColInfo为
- m_pColInfo 0x003879d0 CSplitterWnd::CRowColInfo * .

而在OnSize函数对GetColumnInfo的调用中
+ m_pColInfo 0x00000000 CSplitterWnd::CRowColInfo *
没有m_wndSplitter,添加监视后显示
m_wndSplitter CXX0017: 错误:没有找到符号“m_wndSplitter”

代码如下,请帮帮忙,操作系统xp,语言vc.net:
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{

//将子窗口最大化
//CMDIChildWnd::ActivateFrame(SW_SHOWMAXIMIZED);

CRect rect;
GetClientRect(&rect);
m_wndSplitter.CreateStatic(this,2,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyMtSrbView),CSize(rect.Width() -100,rect.Height()/2),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyMtSrbView),CSize(100,rect.Height()/2),pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CMyMtSrbView),CSize(rect.Width() -100,rect.Height()/2),pContext);
m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CMyMtSrbView),CSize(100,0),pContext);

return true;
}

void CChildFrame::OnResizeSplitter(void)
{

//稳健检查
HWND hWnd=m_wndSplitter.GetSafeHwnd();
if (hWnd==NULL || !::IsWindow(hWnd))
{
return;
}

CRect rect;
GetClientRect(&rect);

int cxCur,cxMin;

m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
m_wndSplitter.SetColumnInfo(0,rect.Width() -100,cxMin);
m_wndSplitter.GetColumnInfo(1,cxCur,cxMin);
m_wndSplitter.SetColumnInfo(1,100,cxMin);

int cyCur,cyMin;
m_wndSplitter.GetRowInfo(0,cyCur,cyMin);
m_wndSplitter.SetRowInfo(0,rect.Height()/2,cyMin);
m_wndSplitter.GetRowInfo(1,cyCur,cyMin);
m_wndSplitter.SetRowInfo(1,rect.Height()/2,cyMin);

m_wndSplitter.RecalcLayout();
}

void CChildFrame::OnSizing(UINT fwSide, LPRECT pRect)
{
CMDIChildWnd::OnSizing(fwSide, pRect);

// TODO: 在此添加消息处理程序代码
OnResizeSplitter();//在此可以正常调用

}

void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
CMDIChildWnd::OnSize(nType, cx, cy);

// TODO: 在此添加消息处理程序代码
OnResizeSplitter();//在此不能正常调用
}
...全文
208 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
keyek 2002-11-28
  • 打赏
  • 举报
回复
怪了,我psusong兄40分,freekany2002兄10分,怎么直接点看不到,点管理就看到分已经指派了啊,不过我有点加入文档视框架的FAQ.小弟初次发贴要是有什么不对,两位兄台没收到分请见谅啊.
keyek 2002-11-28
  • 打赏
  • 举报
回复
怎么一不小心写了这么多字,谁看本文章请爱惜眼睛分3次看完,呵呵
keyek 2002-11-28
  • 打赏
  • 举报
回复
感谢psusong的热心帮助,在你的提醒下我成功的解决了问题.昨晚我翻来覆去有几个问题不明:1.你的这种视的切割方法能普遍应用于常见的视切割.因为这个方法不是(1,2)切就是(2,1)切,我姑且称为"日"切割.保存这样的数据结构只用的着保存"日"字中的那分割条的长度.然而在m_wndSplitter里的m_pColInfo采用的是数组结构.对于这样的使用方法来说是不必要的.2.在使用上,不论怎样的分割,"日"分割都要定义(n-1)个CSplitterWnd.而且必须要一步步的做分割和保持比例的工作,即便用CSplitterWnd数组也不行.要是在正矩形的视分割中,能采用我原来的办法,可以只用两个双重嵌套的for语句就可以漂亮完成分割和保持比例了.3.我前面说过提供的程序不能在OnSize里运行,但屏蔽掉OnSize里的OnResizeSplitter后可以成功分割,且用鼠标拖拉边框可以保持比例,但最大化/还原就不行,这就是OnSize的工作.所以看上去,这样分割还应该是可以的呀.原来跟踪数据的时候就发现OnSize调用zeSplitter时m_wndSplitter里的m_pColInfo是数据为0x00000000,点开后发现"表达式计算错误"字样.总怀疑没有初始化.而明显的OnSize比OnSizing要更早的调用,所以这是相当可能的.所以今天我再尝试翻阅msdn便发现了解决方法:首先肯定我前面的思路,直接的2*2窗体分割是可行的.确实是OnSize调用时,还没初始化的原因,换句话说就是OnCreateClient还没有调用.那么我们添加一个boolean变量初始为false,在OnCreateClient的最后赋值true,然后在OnSize对OnResizeSplitter调用前对boolean变量判断就行了.另外感谢reekany2002给我提供了好网站,就是人少了点,呵呵
freekany2002 2002-11-26
  • 打赏
  • 举报
回复
这里找不到答案吗?来这里试试看!
这里有问必答
http://systemer.51.net/cgi-bin/leoboard.cgi
希望你能在这里找到你满意的答案
GoogleGeek 2002-11-26
  • 打赏
  • 举报
回复
老兄!
你着那叫分割成2*2的窗口呀!
分隔成2*2需要3个splitterWnd 呀!
-------------------------------
下面是分隔成T型窗口的代码!保持第一个窗口的比例不变
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
//实现窗口的静态三拆分
if(!this->m_FixSplitterWnd.CreateStatic(this,2,1))
return false;
if(!this->m_FixSplitterWnd.CreateView(0,0,RUNTIME_CLASS(CThreeWndView),CSize(50,50),pContext))
return false;
if(!this->m_ResizeSplitterWnd.CreateStatic(&this->m_FixSplitterWnd,1,2,WS_CHILD|WS_VISIBLE,this->m_FixSplitterWnd.IdFromRowCol(1,0)))
return false;
if(!this->m_ResizeSplitterWnd.CreateView(0,0,RUNTIME_CLASS(CThreeWndView),CSize(500,100),pContext))
return false;
if(!this->m_ResizeSplitterWnd.CreateView(0,1,RUNTIME_CLASS(CThreeWndView),CSize(100,100),pContext))
return false;
return true;
// return CFrameWnd::OnCreateClient(lpcs, pContext);
}

void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);

//必须有此步!实现稳健性检查,因为在主窗口创建时将首先触发消息wm_size
//而此时的分割窗口还没有创建完成,从而将引发异常!
HWND hWnd1=this->m_FixSplitterWnd.GetSafeHwnd();
HWND hWnd2=this->m_ResizeSplitterWnd.GetSafeHwnd();
if(hWnd1==NULL||!IsWindow(hWnd1)||hWnd2==NULL||!IsWindow(hWnd2))
return ;

//计算理想的分割窗口的大小!
CRect ClientRect;
GetClientRect(&ClientRect);
CSize size=ClientRect.Size();
size.cx=3*size.cx/4;
size.cy=3*size.cy/5;

int length=size.cy;
//改变第一个分割窗口(固定大小窗口)第一列的大小,
int cyCur,cyMin;
this->m_FixSplitterWnd.GetRowInfo(0,cyCur,cyMin);
this->m_FixSplitterWnd.SetRowInfo(0,length,cyMin);

//重新计算窗口布局
this->m_FixSplitterWnd.RecalcLayout();
// TODO: Add your message handler code here

}

void CMainFrame::OnShowHideToolbar()
{
// TODO: Add your command handler code here
if(m_wndToolBar.IsWindowVisible())
m_wndToolBar.ShowWindow(SW_HIDE);
else
m_wndToolBar.ShowWindow(SW_SHOW);
this->RecalcLayout();

}

void CMainFrame::OnUpdateShowHideToolbar(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_wndToolBar.IsWindowVisible());
}
GoogleGeek 2002-11-26
  • 打赏
  • 举报
回复
瞧一下!
keyek 2002-11-26
  • 打赏
  • 举报
回复
原先写的乱,现整理一遍
我想试着将视静态分割成2*2的,并且在改变子窗口的时候保持比例(包括resize和min,max).但用在OnSize函数的GetColumnInfo出错,在OnSizing中竟没有问题.经跟踪发现问题根结在OnSize对GetColumnInfo(或SetColumnInfo)的调用中,m_wndSplitter里的m_pColInfo是数据为0x00000000,点开后发现"表达式计算错误"字样.

代码如下,请帮帮忙,操作系统xp,语言vc.net:
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{

//将子窗口最大化
//CMDIChildWnd::ActivateFrame(SW_SHOWMAXIMIZED);

CRect rect;
GetClientRect(&rect);
m_wndSplitter.CreateStatic(this,2,2);
m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyMtSrbView),CSize(rect.Width() -100,rect.Height()/2),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyMtSrbView),CSize(100,rect.Height()/2),pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CMyMtSrbView),CSize(rect.Width() -100,rect.Height()/2),pContext);
m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CMyMtSrbView),CSize(100,0),pContext);

return true;
}

void CChildFrame::OnResizeSplitter(void)
{

//稳健检查
HWND hWnd=m_wndSplitter.GetSafeHwnd();
if (hWnd==NULL || !::IsWindow(hWnd))
{
return;
}

CRect rect;
GetClientRect(&rect);

int cxCur,cxMin;

m_wndSplitter.GetColumnInfo(0,cxCur,cxMin);
m_wndSplitter.SetColumnInfo(0,rect.Width() -100,cxMin);
m_wndSplitter.GetColumnInfo(1,cxCur,cxMin);
m_wndSplitter.SetColumnInfo(1,100,cxMin);

int cyCur,cyMin;
m_wndSplitter.GetRowInfo(0,cyCur,cyMin);
m_wndSplitter.SetRowInfo(0,rect.Height()/2,cyMin);
m_wndSplitter.GetRowInfo(1,cyCur,cyMin);
m_wndSplitter.SetRowInfo(1,rect.Height()/2,cyMin);

m_wndSplitter.RecalcLayout();
}

void CChildFrame::OnSizing(UINT fwSide, LPRECT pRect)
{
CMDIChildWnd::OnSizing(fwSide, pRect);

// TODO: 在此添加消息处理程序代码
OnResizeSplitter();//在此可以正常调用

}

void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
CMDIChildWnd::OnSize(nType, cx, cy);

// TODO: 在此添加消息处理程序代码
OnResizeSplitter();//在此不能正常调用
}

16,465

社区成员

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

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

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