关闭

VC++控件自适应屏幕的方法

336人阅读 评论(0) 收藏 举报

文章来源:http://blog.csdn.net/ybw20041910/article/details/5679730

1.首先在初始化函数中,FormView在OnInitialUpdate(),Dialog在OnInitDialog()中初始化控件的大小。

//开始初始化控件大小
 m_IsInitialed = false;
 CRect m_ClientRect;
 this->GetClientRect(&m_ClientRect);
 CSize m_Forsize;
 m_Forsize = GetTotalSize();//在资源编辑器中定好大小后,程序运行时大小(不管最大化和最小化,该大小均为同一个值),客户区大于或等于显示的大小
 double m_x = (double)m_ClientRect.Width() / 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(&rect);
  ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
  m_ControlRect.insert(pair<int, CRect>(pWnd->GetDlgCtrlID(), rect));//保存控件的初始大小,以便在OnSize函数中继续使用
  int width = rect.Width();
  int height = rect.Height();
  WCHAR szBuf[256];
  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 = 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(&rect);//设置控件大小
  pWnd = pWnd->GetWindow(GW_HWNDNEXT);
 }
 
 //控件初始化结束
 m_IsInitialed = true;

2.如果界面在运行时大小可以改变,则在OnSize函数中加入如下代码
// TODO: 在此处添加消息处理程序代码
	CFormView::ShowScrollBar(SB_BOTH, false);//设置没有滚动条,视情况而定。
         //在界面不是最小化并且已经初始化完毕
	if (!IsIconic() && m_IsInitialed)
	{
		CSize m_Forsize;
		m_Forsize = GetTotalSize();
		double m_x = (double)cx / m_Forsize.cx;
		double m_y = (double)cy / m_Forsize.cy;
                //读取控件的初始大小
		map<int, CRect>::iterator pos = m_ControlRect.begin();
		for (; pos != m_ControlRect.end(); ++pos)
		{
			CRect rect = pos->second;
			int width = rect.Width();
			int height = rect.Height();
			WCHAR szBuf[256];
			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;
			}
			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;
			}
			GetDlgItem(pos->first)->MoveWindow(rect);
		}
	}


0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:55242次
    • 积分:1065
    • 等级:
    • 排名:千里之外
    • 原创:40篇
    • 转载:59篇
    • 译文:1篇
    • 评论:37条
    博客专栏
    最新评论
    公告
    声明:部分文章转自网络,仅提供学习使用,向原创者致敬!