让控件随窗体大小变化而变化即要在
OnSize(UINT nType, int cx, int cy)函数中添加如下代码:
假设m_sheet为某控件的成员变量:
m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
这样写,会抛出断言。
这是为什么呢,因为m_sheet为空,程序是先运行到OnSize函数,再运行到DoDataExchange函数,
而m_sheet在DoDataExchange中才被真正与控件相关联,才获得具体控件的句柄,所以在改变控件大小时,要加判断:
if (m_sheet)
{
m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
}
{
m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
}
或者通过m_sheet.m_hWnd获得控件句柄来判断:
if (m_sheet.m_hWnd!=NULL)
{
m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
}
{
m_sheet.SetWindowPos(NULL,0,0,cx,cy/3,SWP_NOZORDER|SWP_NOMOVE);
}
可能有人想在窗口初始化时按窗体大小设置控件大小,便在OnInitDialog函数中添加代码:
CRect rect;
GetClientRect(&rect);
m_sheet.SetWindowPos(NULL,0,0,rect.Width(),rect.Height()/3,SWP_NOMOVE|SWP_NOZORDER);
GetClientRect(&rect);
m_sheet.SetWindowPos(NULL,0,0,rect.Width(),rect.Height()/3,SWP_NOMOVE|SWP_NOZORDER);
其实这是不必要的,只要在OnSize函数中添加改变的代码就可以了。
如果用控件变量来进行判断的话,窗体第一次show出来的时候控件的显示布局会有延迟,这是因为程序的运行顺序是:OnSize-OnInitDialog-DoDataExchange-OnSize,
程序到DDX的时候,窗体就Show出来了,但是第一次OnSize中并没有进行布局,因为控件变量还没有与控件关联起来,DDX之后,控件变量与控件关联起来
之后,OnSize中才会进行布局。这个的一个解决方法是:直接利用控件句柄在OnSize中进行布局。
之后,OnSize中才会进行布局。这个的一个解决方法是:直接利用控件句柄在OnSize中进行布局。