对话框窗口最大最小化
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) 才能进行处理。具体代码如下:
ok,在onsize函数里边,主要是这两句:pWnd = GetDlgItem(IDC_STATIC_PLAYCTL); ChangeSize(pWnd, cx, cy,false);,其中IDC_STATIC_PLAYCTL是我项目中的一个picture控件,利用GetDlgItem获取该控件的句柄,然后调用ChangeSize函数实现具体的调整。
ChangeSize函数里边的代码注释也很详细,我就不解释了。这样做以后,运行发现确实能实现想要的效果。无论是最大化还是你随意的伸缩窗体,各个控件均能很良好的实现相应的调整。但是我实验的时候,由于我写的是一个播放器,中间很大一块是一个Picture控件,下面是一些控制按钮。刚开始的时候,我没有太关心onsize函数里边每个控件被调用的顺序,此时我的Picture控件不是最后一个被调用,所以最大化的时候发现当Picture控件已经最大化后,位于它之后的一些按钮控件便会在原来的位置闪烁几下,才调整到最终的位置。于是我改变了调用的顺序,将picture控件最后调用,正如代码中的那样,于是没有出现刚才的现象了。
但是,这种方法有一个缺点,就是会闪屏。你想啊,每个控件调整自己的大小以适应新窗口的大小是有先后顺序和执行时间的。从最初的状态到最终的状态中,控件在不断变化位置,于是产生了闪屏。这是我自己的理解。好在影响不是特别大,所以更好的方法我就没有再接着找寻了。但肯定有更好的方法,如果控件太多,中间转换的时间还是很可观的。可能闪屏现象就会更严重一点。
拙见。小记。
选择类向导,搜索消息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控件最后调用,正如代码中的那样,于是没有出现刚才的现象了。
但是,这种方法有一个缺点,就是会闪屏。你想啊,每个控件调整自己的大小以适应新窗口的大小是有先后顺序和执行时间的。从最初的状态到最终的状态中,控件在不断变化位置,于是产生了闪屏。这是我自己的理解。好在影响不是特别大,所以更好的方法我就没有再接着找寻了。但肯定有更好的方法,如果控件太多,中间转换的时间还是很可观的。可能闪屏现象就会更严重一点。
拙见。小记。
相关文章推荐
- 在C#中调用windows API函数 最大、最小化窗口
- Qt 程序窗口最大、最小化相关的设置方法
- 【积累】窗口最大或最小化时动态更改应用程序图标
- linuxMint設置窗口最大最小化
- Qt 程序窗口最大、最小化相关的设置方法
- 窗口最大或最小化时动态更改应用程序图标
- ubuntu内窗口最大最小化
- QDialog对话框添加最大最小化按钮
- 使控件和MFC窗口一起最大最小化
- Fedora窗口最大最小化
- C++MFC程序窗口无法显示最大最小化按钮问题
- MFC 静态文本框使用/更改button背景色/不使能button/设置标题/不显示控件/窗口最大最小化
- pyqt4 基本窗口,窗口布局,设置logo,窗口最大最小化
- 记MFC关于子窗口、父窗口最大最小化的设置
- Sendmessage最大最小化窗口
- VC 使窗口的最大最小化按钮失效,无法改变视窗尺寸。
- Qt自定义窗口(有最大最小化窗口,关闭窗口)
- Qt中窗体最大最小化以及窗口大小修改的相关函数使用(2)
- MFC 托盘操作,最大最小化窗口
- Javascript全屏窗口滚动条和最大最小化都没有