让FormView上的控件大小随父窗口改变

今天写DTU服务器测试程序时,想要让RICHEDIT控件在程序窗口大小改变时随着变化,使其可以在任何时候都填满信息输出窗口。我的RichEdit控件是放在一个CFromView对象上的。在网上搜了一下,当窗口大小发生改变时,会发出WM_SIZE消息,响应该消息的函数为Cwnd::OnSize(UINT nType,int cy,int cy),OnSize参数的解释:

nType
Specifies the type of resizing requested. This parameter can be one of the following values: 

SIZE_MAXIMIZED   Window has been maximized. 
SIZE_MINIMIZED   Window has been minimized. 
SIZE_RESTORED   Window has been resized, but neither SIZE_MINIMIZED nor SIZE_MAXIMIZED applies. 
SIZE_MAXHIDE   Message is sent to all pop-up windows when some other window is maximized. 
SIZE_MAXSHOW   Message is sent to all pop-up windows when some other window has been restored to its former size. 

cx
Specifies the new width of the client area. 

cy
Specifies the new height of the client area. 

我在对应的CFromView类中重载了OnSize函数,代码如下:

void CRightBottomView::OnSize(UINT nType, int cx, int cy) 
{
	CFormView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	if (nType==SIZE_RESTORED)
	{
		CRect rs;
		GetClientRect(&rs);  //得到父窗体CFormView的大小和位置
		m_re_info.SetWindowPos(this,rs.top,rs.left,rs.Width(),rs.Height(),SWP_SHOWWINDOW|SWP_NOZORDER);
		//按照父窗体的大小和位置,将RichEdit控件移到相应的位置
	}
}
改写好后,运行时却报错,调试了一下,程序在初始化时就会发出若干个WM_SIZE消息,但这时RichEdit控件还没有初始化完成,所以此时在OnSzie()函数中对RichEdit控件进行操作是错误的。所以此时必须判断RichEdit控件是否初始化完成,在网上一篇《如何让FormView上的控件在FormView大小改变时,根据对话框原有的相对位置,调整控件大小》的文章,里面有个这样的判断if(m_edit.GetSafeHwnd()) ,感觉这个条件判断是跟控件的初始化有关的,用MSDN看了一下这个函数,在它的Ruturn Value里是这样写的:Returns the window handle for a window. Returns NULL if the CWnd is not attached to a window or if it is used with a NULL CWnd pointer.看来我的判断是正确的。我再把代码改成下面这样,程序就可以正常跑起来了。
void CRightBottomView::OnSize(UINT nType, int cx, int cy) 
{
	CFormView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	if (m_re_info.GetSafeHwnd()) //判断RichEdit控件是否初始化成功
	{
		if (nType==SIZE_RESTORED)
		{
			CRect rs;
			GetClientRect(&rs);  //得到父窗体CFormView的大小和位置
			m_re_info.SetWindowPos(this,rs.top,rs.left,rs.Width(),rs.Height(),SWP_SHOWWINDOW|SWP_NOZORDER);
			//按照父窗体的大小和位置,将RichEdit控件移到相应的位置
		}
	}
}








展开阅读全文

没有更多推荐了,返回首页