FormView SDI如何实现控件的大小和位置随窗口的改变而改变?!

时间:2022-01-04 14:16:34
http://www.codeproject.com上有大牛写的基于对话框的EasySize(http://www.codeproject.com/KB/dialog/easysize.aspx),很好的实现了该功能,还真够酷。只是我拿到FormView SDI的工程上来试,就不行了。
有人通过EasySizeDemo在FormView SDI上实现过吗?
急用,谢谢了!
小弟分不够,想给多却给不了,汗...

6 个解决方案

#1


自己顶下!

#2


就这么沉了,赶紧扶一把。

#3


自己处理MainFram 的OnSize消息,在里面改变各个空间的位置就行了

#4


感谢跟帖!
这个我试过了,效果不好,一般都是计算纵横方向上的比例,但int型相除后的结果赋给int,这样会有精度损失,导致反复拉动窗口,控件就会越跑越远,甚至最后从窗口的一边消失了,你可以试试。

#5


引用 4 楼 ylyan20xx 的回复:
感谢跟帖!
 这个我试过了,效果不好,一般都是计算纵横方向上的比例,但int型相除后的结果赋给int,这样会有精度损失,导致反复拉动窗口,控件就会越跑越远,甚至最后从窗口的一边消失了,你可以试试。
你计算的时候转成double型,算完再在转回来,精度可以满足需求。

#6


不知道有没别的办法,不过,看过vc9+sp1里面的向导生成的vs样式工程,也是在OnSize里面计算的。贴一段
void CFileView::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
AdjustLayout();
}

void CFileView::AdjustLayout()
{
if (GetSafeHwnd() == NULL)
{
return;
}

CRect rectClient;
GetClientRect(rectClient);

int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;

m_wndToolBar.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
m_wndFileView.SetWindowPos(NULL, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);
}

#1


自己顶下!

#2


就这么沉了,赶紧扶一把。

#3


自己处理MainFram 的OnSize消息,在里面改变各个空间的位置就行了

#4


感谢跟帖!
这个我试过了,效果不好,一般都是计算纵横方向上的比例,但int型相除后的结果赋给int,这样会有精度损失,导致反复拉动窗口,控件就会越跑越远,甚至最后从窗口的一边消失了,你可以试试。

#5


引用 4 楼 ylyan20xx 的回复:
感谢跟帖!
 这个我试过了,效果不好,一般都是计算纵横方向上的比例,但int型相除后的结果赋给int,这样会有精度损失,导致反复拉动窗口,控件就会越跑越远,甚至最后从窗口的一边消失了,你可以试试。
你计算的时候转成double型,算完再在转回来,精度可以满足需求。

#6


不知道有没别的办法,不过,看过vc9+sp1里面的向导生成的vs样式工程,也是在OnSize里面计算的。贴一段
void CFileView::OnSize(UINT nType, int cx, int cy)
{
CDockablePane::OnSize(nType, cx, cy);
AdjustLayout();
}

void CFileView::AdjustLayout()
{
if (GetSafeHwnd() == NULL)
{
return;
}

CRect rectClient;
GetClientRect(rectClient);

int cyTlb = m_wndToolBar.CalcFixedLayout(FALSE, TRUE).cy;

m_wndToolBar.SetWindowPos(NULL, rectClient.left, rectClient.top, rectClient.Width(), cyTlb, SWP_NOACTIVATE | SWP_NOZORDER);
m_wndFileView.SetWindowPos(NULL, rectClient.left + 1, rectClient.top + cyTlb + 1, rectClient.Width() - 2, rectClient.Height() - cyTlb - 2, SWP_NOACTIVATE | SWP_NOZORDER);
}