游泳池警示牌:vc中更改对话框大小
moshi 发表于 2006-9-15 17:16:46
vc编程接触很久,但更改对话框大小最近才有点眉目.以前编的MFC程序,窗口大小都是固定的,很死板.前段时间编一个模拟定时器,尝试了更改对话框大小,也不是很难.只要掌握了窍门,对话框大小随你改变.
最近又因为项目的问题,要改变对话框大小.遇到了一个问题就是一个属性框CPropertySheet,里面又有自己从CPropertyPage派生的类.类里又调用了别人写的基于对话框的对象.所以就出现了嵌套改变对话框的问题.还好通过网上找资料,已经解决.
首先要使对话框可以更改大小,要改对话框的属性.在对话框资源上右键-->properties->style 属性页里的border选为resizing.这时当对话框运行时,把鼠标放在边缘上就会出现调节大小的鼠标样式.这时当拉伸对话框时,大小就会变.因为没有写相应的处理函数.若对话框里有控件,控件并不会随对话框大小的改变而做相应的调整.
当对话框变为可调时,每当对话框大小改变时,都会触发OnSIze函数,如果没有这个函数,可以通过Winzard添加wm_size事件即可.如果要更改对话框变化时控件的位置,就要在OnSize函数里做相应的处理.可以通过GetClientRect获得当前对话框的客户区大小.最左上方是(0,0)点.如果要更改某个控件的大小,如果控件有相应的Control对象,直接调用Control对象的MoveWindwo函数即可,参数就是你想让控件去的位置.如果没有控件Control对象可以通过GetDlgItem(id),获得控件句柄,然后调用MoveWindow函数.比较麻烦的是计算相应的位置.
有时后对话框上有自己定义的一些从CWnd派生来的对象,这时首先要写这个对象的OnSize函数.当调用这个对象MoveWindow方法就会触发定义好的OnSize函数.
举一个CPopertySheet的例子
几个对象
CPropertySheet m_sheet;
CLogPropertyPage m_LogSystem; //System Log;
CLogPropertyPage m_LogClientOne; // Log about ClientOne;
CLogPropertyPage m_LogClientTwo; //Log about ClientTwo;
CLogPropertyPage m_LogTimer;//Log about timer ;
m_sheet.AddPage(&m_LogSystem);
m_sheet.AddPage(&m_LogTimer);
m_sheet.AddPage(&m_LogClientOne);
m_sheet.AddPage(&m_LogClientTwo);
m_sheet.Create(this, WS_CHILD | WS_VISIBLE, WS_EX_CONTROLPARENT);
RECT rect;
this->GetWindowRect(&rect);
int width =rect.right-rect.left;
int height = rect.bottom - rect.top;
m_sheet.MoveWindow(0,125,width,height);
OnSize函数里
m_sheet.MoveWindow( margin,ctrlheight+margin*2, rt.Width()-margin*2, rt.Height()-ctrlheight-margin*2 );
CTabCtrl* ptab =m_sheet.GetTabControl();
ptab->MoveWindow( 0,0, rt.Width()-margin*2, rt.Height()-ctrlheight-margin*2);
第二句话就会调用m_LogSystem的OnSize函数.