对话框窗口最大最小化

来源:互联网 发布:悠梦卡盟悠梦网络 编辑:程序博客网 时间:2024/05/21 15:48

mfc里,基于对话框的窗口,具有最大最小化的属性设置。在Border属性里选择Resizing,然后在Maximize和Minimize中选择true。在窗体当中随便拖几个控件,然后运行,此时点击最大化会发现,整个窗体的大小是变大了,但是有效区域并不会改变大小,也就是控件的大小任然不变。那么如何调整对话框中的各个控件,随窗体的大小改变而改变呢?mfc里面有一个消息WM_SIZE,这个消息能响应窗体大小改变事件。具体如何操作?

选择类向导,搜索消息WM_SIZE,添加相应的事件处理函数void CMyDlg::OnSize(UINT nType, int cx, int cy),真正改变控件大小的函数并不是此函数,它还需要配合void CMyDlg::ChangeSize(CWnd *pWnd, int cx, int cy,bool tf) 才能进行处理。具体代码如下:

void CMyDlg::OnSize(UINT nType, int cx, int cy){    CDialogEx::OnSize(nType, cx, cy);    // TODO: 在此处添加消息处理程序代码    if(nType==1) return;//最小化则什么都不做      // TODO: Add your message handler code here      CWnd *pWnd;        pWnd = GetDlgItem(IDC_STATIC_PLAYCTL);      ChangeSize(pWnd, cx, cy,false);  //  pWnd = GetDlgItem(IDC_STATIC);  //  ChangeSize(pWnd, cx, cy);      pWnd = GetDlgItem(IDC_BUTTON_LOAD);      ChangeSize(pWnd, cx, cy,false);      pWnd = GetDlgItem(IDC_BUTTON_PLAY);      ChangeSize(pWnd, cx, cy,false);      pWnd = GetDlgItem(IDC_BUTTON_STOP);      ChangeSize(pWnd, cx, cy,false);      pWnd = GetDlgItem(IDC_BUTTON_PLAY_FORWARD);      ChangeSize(pWnd, cx, cy,false);      pWnd = GetDlgItem(IDC_BUTTON_PLAY_BACKWARD);      ChangeSize(pWnd, cx, cy,false);       pWnd = GetDlgItem(IDC_STATIC_VOLUME_TEXT);      ChangeSize(pWnd, cx, cy,false);      pWnd = GetDlgItem(IDC_STATIC_FILENAME);      ChangeSize(pWnd, cx, cy,false);      pWnd = GetDlgItem(IDC_SLIDER_MEDIA);      ChangeSize(pWnd, cx, cy,false);      pWnd = GetDlgItem(IDC_SLIDER_VOLUME);      ChangeSize(pWnd, cx, cy,false);      pWnd=GetDlgItem(IDC_STATIC_VOLUME);    ChangeSize(pWnd, cx, cy,false);      pWnd=GetDlgItem(IDC_STATIC_POSITION);    ChangeSize(pWnd, cx, cy,false);    pWnd=GetDlgItem(IDC_BUTTONftp);    ChangeSize(pWnd, cx, cy,false);    pWnd = GetDlgItem(IDC_STATIC_VIDEO);      ChangeSize(pWnd, cx, cy,true);      GetClientRect(&m_rect);// 将变化后的对话框大小设为旧大小}void CMyDlg::ChangeSize(CWnd *pWnd, int cx, int cy,bool tf)    //真正改变控件大小的函数,在onsize里边不断被调用{      if(pWnd)  //判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建       {          CRect rect;   //获取控件变化前的大小            pWnd->GetWindowRect(&rect);          ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标          //    cx/m_rect.Width()为对话框在横向的变化比例          rect.left=rect.left*cx/m_rect.Width();//调整控件大小          rect.right=rect.right*cx/m_rect.Width();          rect.top=rect.top*cy/m_rect.Height();          rect.bottom=rect.bottom*cy/m_rect.Height();          pWnd->MoveWindow(rect);//设置控件大小      }  }

ok,在onsize函数里边,主要是这两句:pWnd = GetDlgItem(IDC_STATIC_PLAYCTL); ChangeSize(pWnd, cx, cy,false);,其中IDC_STATIC_PLAYCTL是我项目中的一个picture控件,利用GetDlgItem获取该控件的句柄,然后调用ChangeSize函数实现具体的调整。

ChangeSize函数里边的代码注释也很详细,我就不解释了。这样做以后,运行发现确实能实现想要的效果。无论是最大化还是你随意的伸缩窗体,各个控件均能很良好的实现相应的调整。但是我实验的时候,由于我写的是一个播放器,中间很大一块是一个Picture控件,下面是一些控制按钮。刚开始的时候,我没有太关心onsize函数里边每个控件被调用的顺序,此时我的Picture控件不是最后一个被调用,所以最大化的时候发现当Picture控件已经最大化后,位于它之后的一些按钮控件便会在原来的位置闪烁几下,才调整到最终的位置。于是我改变了调用的顺序,将picture控件最后调用,正如代码中的那样,于是没有出现刚才的现象了。

但是,这种方法有一个缺点,就是会闪屏。你想啊,每个控件调整自己的大小以适应新窗口的大小是有先后顺序和执行时间的。从最初的状态到最终的状态中,控件在不断变化位置,于是产生了闪屏。这是我自己的理解。好在影响不是特别大,所以更好的方法我就没有再接着找寻了。但肯定有更好的方法,如果控件太多,中间转换的时间还是很可观的。可能闪屏现象就会更严重一点。

拙见。小记。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 怀孕见红了肚子不痛怎么办 月经来是黑色的怎么办 怀孕了长了痔疮怎么办 怀孕了有外痔疮怎么办 孕妇长痔疮很痛怎么办 孕9个月尿路感染怎么办 旁边有人尿不出来怎么办 外阴破皮了应该怎么办 脸上长脂肪粒怎么办怎么能消除 挤黑头留下的坑怎么办 长痘留下的坑怎么办 鼻子上留下黑印怎么办 狗狗眼里长息肉怎么办 狗狗眼角长息肉怎么办 脸上长了好多脂肪粒怎么办 脸上毛孔粗大有黑头怎么办 脸颊毛孔粗有黑头怎么办 鼻子上有黑头怎么办小窍门 脸上很多粉刺和油脂粒怎么办 毛孔里都是角栓怎么办 脸上长了很多脂肪粒怎么办 脸上全是油脂粒怎么办 外阴口长了疙瘩怎么办 外阴痒怎么办用什么洗 有子宫内膜增厚怎么办 脸上痘痘特别疼怎么办 眉间和下巴长痘怎么办 眼下方两边长斑怎么办 眼睛下面长斑了怎么办 24岁眼下有细纹怎么办 17岁眼下有细纹怎么办 眼下有细纹怎么办 知乎 22岁眼部有细纹怎么办 20岁眼角有细纹怎么办 20岁眼睛有细纹怎么办 29岁眼下有细纹怎么办 招不干净的东西怎么办 伤口旁边肿了怎么办啊 伤口痂掉了红肿怎么办 屁屁拉屎出血了怎么办 鞋小了一码怎么办妙招