注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小人物的自述

为梦想而奋斗,没有梦想就没有希望!

 
 
 

日志

 
 

vc对话框最大化,控件随之变化的方法  

2009-06-10 16:51:44|  分类: 学习笔记 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

参考了好多网友的建议,自己的最终实现方法如下:

DlgWrite添加几个成员变量:int m_nDlgHeight; int m_nDlgWidth;//原来对话框大小
 int m_nHeight; int m_nWidth;//最大化后的大小
实现方法如下:
BOOL DlgWrite::OnInitDialog()
{
 CDialog::OnInitDialog();
 // TODO: Add extra initialization here
 m_hInit=TRUE;
 ShowWindow(SW_MAXIMIZE);
return TRUE;  //有一些解释
}

添加Windows message handle响应WM_SIZE
void DlgWrite::OnSize(UINT nType, int cx, int cy)
{
 CDialog::OnSize(nType, cx, cy);
 // TODO: Add your message handler code here
 float m_fWidthMul,m_fHeightMul;
 if(!m_hInit)
 {
  CRect   rect;
  ::GetWindowRect(m_hWnd,rect);
  ScreenToClient(rect);
  m_nDlgWidth = rect.right - rect.left;
  m_nDlgHeight = rect.bottom - rect.top;
 }
  if(m_hInit)
  {
   m_nWidth = GetSystemMetrics(SM_CXSCREEN);
   m_nHeight = GetSystemMetrics(SM_CYSCREEN);
   m_fWidthMul = float(m_nWidth)/float(m_nDlgWidth);
   m_fHeightMul = float(m_nHeight)/float(m_nDlgHeight);
   CFont m_newFont;
   if (m_nWidth >= 1279)
   {
    m_newFont.CreateFont(26,0,0,0,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
     CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH  | FF_SWISS,_T("宋体"));
   }
   else
   {
    if (m_nWidth >= 1000)
    {
     m_newFont.CreateFont(16,0,0,0,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
      CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH  | FF_SWISS,_T("宋体"));
    }
    else
    {
     m_newFont.CreateFont(12,0,0,0,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
      CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH  | FF_SWISS,_T("宋体"));
    }
   }
   CRect AimRect;
   GetDlgItem(IDC_Text)->GetWindowRect(AimRect);
   ScreenToClient(AimRect);
   CPoint OldTLPoint,AimTLPoint;
   OldTLPoint = AimRect.TopLeft();
   AimTLPoint.x = long(OldTLPoint.x *m_fWidthMul);
   AimTLPoint.y = long(OldTLPoint.y *m_fHeightMul);
   CPoint OldBRPoint,AimBRPoint;
   OldBRPoint = AimRect.BottomRight();
   AimBRPoint.x = long(OldBRPoint.x *m_fWidthMul);
   AimBRPoint.y = long(OldBRPoint.y *m_fHeightMul);
   GetDlgItem(IDC_Text)->SetFont(&m_newFont);
   AimRect.SetRect(AimTLPoint,AimBRPoint);
   GetDlgItem(IDC_Text)->MoveWindow(AimRect,TRUE);
}
}

 

 

主要参考内容如下:(比较乱,也就不整理了,直接粘贴了)
我做一个对话框项目,希望在对话框最大化时,窗体内容也跟着最大化,不知道该如何实现??
响应WM_SIZE消息,然后在OnSize函数中获得现在的窗口大小,根据新的窗口大小重设状态条位置
CRect rect;
::GetWindowRect(m_hWnd,rect);
ScreenToClient(rect);
m_nDlgWidth = rect.right - rect.left;
m_nDlgHeight = rect.bottom - rect.top;
//窗口最大化,并取得分辨率大小,根据此大小设置控件字体大小
ShowWindow(SW_MAXIMIZE);
m_nWidth = GetSystemMetrics(SM_CXSCREEN);
m_nHeight = GetSystemMetrics(SM_CYSCREEN);
//算出放大倍数,并记录  假设1280*1024  1024*768  800*768  三个分辨率
m_fWidthMul = float(m_nWidth)/float(m_nDlgWidth);
m_fHeightMul = float(m_nHeight)/float(m_nDlgHeight);
        //三种分辨率下设置三种字体,加载不同工具栏
if (m_nWidth >= 1279)
{
m_newFont.CreateFont(26,0,0,0,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH  | FF_SWISS,_T("宋体"));
m_nToolBarID = IDR_TOOLBAR1;
}
else
{
if (m_nWidth >= 1000)
{
   m_newFont.CreateFont(16,0,0,0,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
   CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH  | FF_SWISS,_T("宋体"));
   m_nToolBarID = IDR_TOOLBAR2;
}
else
{
   m_newFont.CreateFont(12,0,0,0,FW_NORMAL,0,0,0,1,OUT_DEFAULT_PRECIS,
   CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH  | FF_SWISS,_T("宋体"));
   m_nToolBarID = IDR_TOOLBAR3;
}
}

ReSize(控件ID)//有多少个控件 调用多少次resize
类中添加一个函数  ReSize(int nAimID)

void ReSize(nAimID)

{

CRect AimRect;
GetDlgItem(nAimID)->GetWindowRect(AimRect);
ScreenToClient(AimRect);
//记录这个区域的左上角点和右下角点
CPoint OldTLPoint,AimTLPoint;
OldTLPoint = AimRect.TopLeft();
AimTLPoint.x = long(OldTLPoint.x *m_fWidthMul);
AimTLPoint.y = long(OldTLPoint.y *m_fHeightMul);
CPoint OldBRPoint,AimBRPoint;
OldBRPoint = AimRect.BottomRight();
AimBRPoint.x = long(OldBRPoint.x *m_fWidthMul);
AimBRPoint.y = long(OldBRPoint.y *m_fHeightMul);
//根据分辨率设置字体
GetDlgItem(nAimID)->SetFont(&m_newFont);
//在放大的窗口里,重绘放大后的窗口
AimRect.SetRect(AimTLPoint,AimBRPoint);
GetDlgItem(nAimID)->MoveWindow(AimRect,TRUE);

}

对话框里控件的位置,已开始比如居中,然后点击最大化,如何使其仍然居中?
先获得对话框的大小,计算后设置控件的位置  
  void   GetWindowRect(   LPRECT   lpRect   )   const;  
  void   MoveWindow(   int   x,   int   y,   int   nWidth,   int   nHeight,   BOOL   bRepaint   =   TRUE   );  
我在对话框的属性中添加了OnSize消息函数,可是在OnSize()里使用MoveWindow()就出错,但是,同样的代码放到OnInitDialog()就能成功,为什么呢?  
你得这样写?
在OnInitDialog()里写m_hInit   =   true;//这个变量作为对话框的成员变量,并且在对话框构造函数里负初值false  
然后在OnSize()里写 
  void   CDlg3Dlg::OnSize(UINT   nType,   int   cx,   int   cy)  
  {  
  CDialog::OnSize(nType,   cx,   cy);  
                if(m_hInit){  
  //   TODO:   Add   your   message   handler   code   here  
  CRect   lpRect;  
  GetWindowRect(&lpRect);  
  CSize   szMWD   =   lpRect.Size();  
  int   a   =   szMWD.cx;  
  int   b   =   szMWD.cy;  
  GetDlgItem(IDC_LIST1)->MoveWindow(   (1024   -   a)/2,   (768   -   b)/2,a   ,   b   ,TRUE);   
  }  
  }  

  评论这张
 
阅读(1840)| 评论(0)
推荐

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017