mfc中窗口按比例变化

    常用的视频播放器拖动窗口大小时都是按比例变化的,项目中也经常需要实现一个按比例变化的窗口。在mfc中实现窗口的比例变化十分简单,只需要在两个重载函数中按照固定比例设定窗口大小即可——OnSizing和OnGetMinMaxInfo。

    首先,在OnGetMinMaxInfo中按比例设定最大值或者最小值。如下所示:

    void CTestDlg::OnGetMinMaxInfo(MINMAXINFO* lpMMI) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if(lpMMI->ptMinTrackSize.x < 595 || lpMMI->ptMinTrackSize.y < 445) { lpMMI->ptMinTrackSize.x = 445 * m_dRectRate ; lpMMI->ptMinTrackSize.y = 445; } else if(lpMMI->ptMinTrackSize.x > 1280 || lpMMI->ptMinTrackSize.y < 900) { lpMMI->ptMinTrackSize.x = 900 * m_dRectRate ; lpMMI->ptMinTrackSize.y = 900; } CDialog::OnGetMinMaxInfo(lpMMI); }

    其次,在OnSizing中设定拖动窗口过程中的宽和高。如下:

    void CTestDlg::OnSizing(UINT fwSide, LPRECT pRect) { CDialog::OnSizing(fwSide, pRect); if(pRect) { int nWidth = pRect->right - pRect->left; int nHeight = pRect->bottom - pRect->top; if(m_rcWidnow.Width() != nWidth) // 宽度改变 { pRect->bottom = pRect->top + nWidth / m_dRectRate; } else if(m_rcWidnow.Height() != nHeight) // 高度改变 { pRect->right = pRect->left + nHeight * m_dRectRate; } } }

    上面的两个步骤保证了拖动过程中窗口在特定范围内宽高按一定比例变化。但是如果程序中如果有函数改变了窗口的大小,而不是通过拖动,这时窗口的宽高不一定成比例,所以要在改变窗口的函数中调用OnSizing,实现窗口按比例变化。

    最后,需要响应OnSize实现窗口及其所含控件的位置的正确变化。

   

你可能感兴趣的:(mfc)