vc中更改对话框大小

来源:百度文库 编辑:神马文学网 时间:2024/04/29 19:55:02
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函数.