对话框窗口最大最小化
来源:互联网 发布:悠梦卡盟悠梦网络 编辑:程序博客网 时间: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控件最后调用,正如代码中的那样,于是没有出现刚才的现象了。
但是,这种方法有一个缺点,就是会闪屏。你想啊,每个控件调整自己的大小以适应新窗口的大小是有先后顺序和执行时间的。从最初的状态到最终的状态中,控件在不断变化位置,于是产生了闪屏。这是我自己的理解。好在影响不是特别大,所以更好的方法我就没有再接着找寻了。但肯定有更好的方法,如果控件太多,中间转换的时间还是很可观的。可能闪屏现象就会更严重一点。
拙见。小记。
- 对话框窗口最大最小化
- 客户端窗口最大最小化
- Sendmessage最大最小化窗口
- Fedora窗口最大最小化
- vc 窗口最大最小化
- Fedora 17 窗口最大最小化
- QDialog对话框添加最大最小化按钮
- 怎么让模态对话框最小化时,主窗口也最小化
- MFC 托盘操作,最大最小化窗口
- pyqt4 基本窗口,窗口布局,设置logo,窗口最大最小化
- 主窗口最小化后其子窗口非模态对话框消失
- VC中如何使非模态对话框不随主窗口最小化
- VC中如何使非模态对话框不随主窗口最小化
- Javascript全屏窗口滚动条和最大最小化都没有
- 窗口最大或最小化时动态更改应用程序图标
- 窗口最大化最大最小化关闭按钮超出屏幕 WM_GETMINMAXINFO
- 在C#中调用windows API函数 最大、最小化窗口
- Qt 程序窗口最大、最小化相关的设置方法
- 【Python】豆瓣FM API分析
- Android开发——Activity间的值传递
- 遗留代码
- HTML5数据推送SSE原理及应用开发
- 基于nrf51822的蓝牙低功耗温湿度节点设计
- 对话框窗口最大最小化
- 自己写的一个除法小程序
- Java对象的序列化和反序列化
- ios [UIScreen mainScreen] bounds] 获取尺寸不对
- mysql主从配置
- Android异步处理二:AsynTask介绍和使用AsyncTask异步更新UI界面
- eclipse里关联查看android源码
- 5.疯狂指针-贰
- 写给准备秋招的学弟学妹们