您的位置:首页 > 其它

对话框窗口最大最小化

2015-04-25 13:14 232 查看
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控件最后调用,正如代码中的那样,于是没有出现刚才的现象了。

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

拙见。小记。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: