关于窗口分隔的问题

lxzygz 2009-07-27 12:34:23
SDI程序,分隔窗口,代码如下:

BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT /*lpcs*/,
CCreateContext* pContext)
{
CRect rect;

GetClientRect(&rect);

//产生第一次静态切分

m_wndSplitter.CreateStatic(this, //父窗口指针

1, // 切分的行数

2); // 切分的列数

//为第一个窗格产生视图

m_wndSplitter.CreateView(0,0, // 窗格的行列序数

RUNTIME_CLASS(CMyFromView),//视图类

CSize(rect.Width()/3,rect.Height()),//初始化大小

pContext);//父窗口的创建参数

//为第二个窗格产生视图

m_wndSplitter.CreateView(0,1,

RUNTIME_CLASS(CMyView),

CSize(rect.Width()*2/3,rect.Height()),

pContext);

return TRUE;
}

问题:当改变主框架窗口大小(如最大化),分隔条未按想要划分的窗口大小比例变动位置,请问可以在哪个消息函数中加什么代码实现该功能?
我想是在OnSize里加代码,可怎么写呢?用CSplitterWnd类的什么成员函数呢?
请路过的大侠指点,谢谢!
...全文
77 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
webing520 2009-07-27
  • 打赏
  • 举报
回复
2楼讲解的相当详细了!
只是在OnCreateClient函数中创建视图是最好加个判断,这样逻辑上比较周密一点点。。。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
if(!m_wndSplitter.CreateStatic(this,1,2))
{
return false;
}
CRect rect;
GetClientRect(&rect);
if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CMyFromView),CSize(rect.Width()/3,rect.Height()),pContext))
{
return false;
}
if(!m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CMyView),CSize(rect.Width()*2/3,rect.Height()),pContext))
{
return false;
}
m_bSplitCreate = true;
return true;
}
marrco2005 2009-07-27
  • 打赏
  • 举报
回复
1. 在CMainFrame 类里增加一个成员变量
bool m_bSplitCreate; // 在构造函数里初始化为 FALSE

2. 在 CMainFrame::OnCreateClient 函数的最后面增加 m_bSplitCreate = TRUE;

3. 响应 WM_SIZE
void CMainFrame::OnSize(UINT nType, int cx, int cy)
{
CFrameWnd::OnSize(nType, cx, cy);


if ( GetSafeHwnd() == NULL )
{
return ;
}
CRect rect;
GetClientRect(&rect);

if( m_wndSplitter.GetSafeHwnd() && m_bSplitCreate) // m_bSplitterCreated set in OnCreateClient
{
m_wndSplitter.SetColumnInfo(0, rect.Width() *2.0 / 3, 10);
m_wndSplitter.SetColumnInfo(1, rect.Width() * 1.0 / 3, 10);
m_wndSplitter.RecalcLayout();
}


// TODO: Add your message handler code here

}
xwsn007 2009-07-27
  • 打赏
  • 举报
回复
WM_SIZE
在OnSize()里调下面的函数:

void CMainFrame::MoveSplitter(int nLength,int nHeight)
{
CRect rect;
GetDesktopWindow()->GetWindowRect(&rect);

m_wndSplitter.SetColumnInfo(0, nLength, 0);
m_wndSplitter.SetRowInfo(0,nHeight,0);
m_wndSplitter.RecalcLayout();
}

16,548

社区成员

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

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

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