1、 VC+控件自适应屏幕的方法 收藏 1.首先在初始化函数中,FormView 在 OnInitialUpdate(),Dialog在OnInitDialog()中初始化控件的大小。/开始初始化控件大小m_IsInitialed = false;CRect m_ClientRect;this-GetClientRect(CSize m_Forsize;m_Forsize = GetTotalSize();/在资源编辑器中定好大小后,程序运行时大小(不管最大化和最小化,该大小均为同一个值),客户区大于或等于显示的大小double m_x = (double)m_ClientRect.Width()
2、 / m_Forsize.cx;/宽度方向发大倍数double m_y = (double)m_ClientRect.Height() / m_Forsize.cy;/高度方向发大倍数/调整控件的大小CWnd *pWnd = NULL; pWnd = GetWindow(GW_CHILD);while(pWnd)/判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建CRect rect; /获取控件变化前大小pWnd-GetWindowRect(ScreenToClient(/将控件大小转换为在对话框中的区域坐标m_ControlRect.insert(pair(pWnd-GetDl
3、gCtrlID(), rect);/保存控件的初始大小,以便在 OnSize函数中继续使用int width = rect.Width();int height = rect.Height();WCHAR szBuf256;GetClassName(pWnd-m_hWnd,szBuf,256); if( _tcsicmp(szBuf,_T(“Edit“) = 0) /Edit只是位置变化,大小没有变rect.top = m_y * rect.top;rect.left = m_x * rect.left;rect.bottom = rect.top + height;rect.right =
4、rect.left + width;else/其它控件位置和大小均变化rect.top = m_y * rect.top;rect.left = m_x * rect.left;rect.bottom = m_y * rect.bottom;rect.right = m_x * rect.right;pWnd-MoveWindow(/设置控件大小pWnd = pWnd-GetWindow(GW_HWNDNEXT);/控件初始化结束m_IsInitialed = true;2.如果界面在运行时大小可以改变,则在 OnSize函数中加入如下代码/ TODO: 在此处添加消息处理程序代码CFormV
5、iew:ShowScrollBar(SB_BOTH, false);/设置没有滚动条,视情况而定。/在界面不是最小化并且已经初始化完毕if (!IsIconic() m_Forsize = GetTotalSize();double m_x = (double)cx / m_Forsize.cx;double m_y = (double)cy / m_Forsize.cy;/读取控件的初始大小map:iterator pos = m_ControlRect.begin();for (; pos != m_ControlRect.end(); +pos)CRect rect = pos-seco
6、nd;int width = rect.Width();int height = rect.Height();WCHAR szBuf256;GetClassName(GetDlgItem(pos-first)-m_hWnd,szBuf,256); if( _tcsicmp(szBuf,_T(“Edit“) = 0) rect.top = m_y * rect.top;rect.left = m_x * rect.left;rect.bottom = rect.top + height;rect.right = rect.left + width;elserect.top = m_y * rect.top;rect.left = m_x * rect.left;rect.bottom = m_y * rect.bottom;rect.right = m_x * rect.right;GetDlgItem(pos-first)-MoveWindow(rect);或在 OnShowWindow()函数中加入也可以(特别是在对话框作为 tabpage时)