济南网站制作经验,济南建设银行网站,网站建设可以修改吗,东营网站建设那家好MFC窗体的控件的自适应缩放早期VS开发环境是不支持的#xff0c;后来VS开发环境提供了支持但也简单#xff0c;或者固定的缩放比例不符合要求。我一向坚持一个理念#xff1a;“不支持缩放的窗口不是好窗口”#xff0c;所以需要有一个自定义的缩放处理。机制不复杂#x… MFC窗体的控件的自适应缩放早期VS开发环境是不支持的后来VS开发环境提供了支持但也简单或者固定的缩放比例不符合要求。我一向坚持一个理念“不支持缩放的窗口不是好窗口”所以需要有一个自定义的缩放处理。机制不复杂就是重载OnSize处理窗口大小变化。 这是对话框的OnSizeMFC会自动生成这个函数的框架
void CMyDlg::OnSize(UINT nType, int cx, int cy)
{CDialog::OnSize(nType, cx, cy);// TODO: Add your message handler code hereswitch(nType){case SIZE_MAXIMIZED:break;case SIZE_RESTORED:break;case SIZE_MINIMIZED:ShowWindow(SW_HIDE);break;default:return;}MoveCtrl(cx,cy);//这个函数是自己写的重新设定控件位置
}MoveCtrl是自己定义的函数在里面重新计算布局设置空间位置即可。之所以要写成个函数是因为这个函数在OnInitDialog里也需要执行一次以便完成初始布局这样设计对话框的时候就不用那么精确了控件随便摆一下就行了。 OnInitDialog的处理 RECT rect;//初始化控件 GetClientRect(rect);MoveCtrl(rect.right, rect.bottom);因为子控件都是基于父窗口的客户区的所以用对话框的客户区的大小为基准来设置子控件。 这是MoveCtrl的一个示例
int CProxyDlg::MoveCtrl(int cx, int cy)
{RECT rect;//工具栏顶if(IsWindow(m_MainToolBar)){m_MainToolBar.MoveWindow(0,0,cx,toolbarhigh);}//系统中左if(IsWindow(m_Tab_Sys.m_hWnd) IsWindow(m_Tree_Sys.m_hWnd) IsWindow(m_Tree_User.m_hWnd)){rect.leftbdry;rect.rightbdrytabsyswide;rect.toptoolbarhigh;rect.bottomcy-statehigh;m_Tab_Sys.MoveWindow(rect);m_Tab_Sys.GetWindowRect(rect);m_Tab_Sys.SendMessage(TCM_ADJUSTRECT,(WPARAM)FALSE,(LPARAM)rect);ScreenToClient(rect);m_Tree_Sys.MoveWindow(rect);m_Tree_User.MoveWindow(rect);}//当前连接中右if(IsWindow(m_Tree.m_hWnd)){rect.leftbdrytabsyswidesepwide;rect.rightcx-bdry;rect.toptoolbarhigh;rect.bottomcy-statehigh;m_Tree.MoveWindow(rect);}//状态栏底if(IsWindow(m_Static_State.m_hWnd)){rect.left0;rect.rightcx;rect.topcy-statehigh;rect.bottomcy;m_Static_State.MoveWindow(rect);}return 1;
}主要用到IsWindow来判断控件是否已经创建、MoveWindow来移动控件其余就是各种布局计算。 有兴趣可以自己写一套布局类不过真正理想的界面除了自适应缩放还应该能拉伸调整这就困难些了别的高级语言或类库直接提供了split面板不用自己写。 (这里是结束)