Debug和release两个版本运行的结果不一样,怎么办。

时间:2023-01-19 21:26:41
在debug下getWindowRect后算出来的控件大小是842,14,598,13;在release下控件的大小是32228,535,32036,698怎么回事 

17 个解决方案

#1


可能是变量没有初始化,检查一下

#2


引用 1 楼 yfqvip 的回复:
可能是变量没有初始化,检查一下
初始化了,代码如下:
void CDataReportDlg::OnSize(UINT nType, int cx, int cy) 
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

//  if (m_infoList.GetSafeHwnd())
//  {
//         m_infoList.MoveWindow(0,0,cx,cy);
//  }
 
CWnd *pWnd; 

    pWnd = GetDlgItem(IDC_infoList);     //获取控件句柄
CRect rect;   //获取控件变化前大小
    if(nType==1) return;   //如果是窗体最小化则什么都不做
    if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    {

      pWnd->GetWindowRect(&rect);
      ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
      rect.right=rect.right*cx/m_rect.Width();
  rect.left=rect.left*cx/m_rect.Width();
      rect.bottom=rect.bottom*cy/m_rect.Height();
  rect.top=rect.top*cy/m_rect.Height();

  CString a,b,c,d;
  a.Format("%d",rect.right);
  b.Format("%d",rect.left);
  c.Format("%d",rect.bottom);
  d.Format("%d",rect.top);
  MessageBox(a+" "+b+" "+c+" "+d);
      pWnd->MoveWindow(rect);//设置控件大小
    }
GetWindowRect(&m_rect);
}

#3


if(pWnd->m_hWnd) 

#4


该回复于2013-05-08 14:13:39被管理员删除

#5


Debug和release两个版本运行的结果不一样,怎么办。

#6


计算rect的时候把m_rect的值也打印出来看下

#7


引用 3 楼 sha_jinhao 的回复:
if(pWnd->m_hWnd) 
什么意思?

#8


方法一:
加个变量,bool m_binit;
构造函数中初始化m_binit=false;
在oninitlizedialog中m_binit=true;
OnSize中if(m_binit){....}
方法二:
OnSize中
if(pWnd&&IsWindow(pWnd->m_hWnd)){...} 

#9


引用 6 楼 dahaiI0 的回复:
计算rect的时候把m_rect的值也打印出来看下
m_rect的值在两个模式下是一样的。

#10


引用 8 楼 yfqvip 的回复:
方法一:
加个变量,bool m_binit;
构造函数中初始化m_binit=false;
在oninitlizedialog中m_binit=true;
OnSize中if(m_binit){....}
方法二:
OnSize中
if(pWnd&&IsWindow(pWnd->m_hWnd)){...} 
没效果,主要是debug下和release下的cx,cy的值不一样。

#11


用outputdebugstring试试,是不是打印了多次

#12


用 GetClientRect 获取高和宽

#13


楼主获取有问题。

窗体不存在也获取。

判断得重写

#14


引用 13 楼 tiger9991 的回复:
楼主获取有问题。

窗体不存在也获取。

判断得重写
怎么弄?

#15


为什么两个版本下的cx和cy的值不一样呢。谁给指导下啊,很急!!!!

#16


得把窗体初始化一下看下,窗体和控件大小都固定了  就变不了了

#17


我也遇到了同样的问题,请问解决了吗?

#1


可能是变量没有初始化,检查一下

#2


引用 1 楼 yfqvip 的回复:
可能是变量没有初始化,检查一下
初始化了,代码如下:
void CDataReportDlg::OnSize(UINT nType, int cx, int cy) 
{
CDialog::OnSize(nType, cx, cy);

// TODO: Add your message handler code here

//  if (m_infoList.GetSafeHwnd())
//  {
//         m_infoList.MoveWindow(0,0,cx,cy);
//  }
 
CWnd *pWnd; 

    pWnd = GetDlgItem(IDC_infoList);     //获取控件句柄
CRect rect;   //获取控件变化前大小
    if(nType==1) return;   //如果是窗体最小化则什么都不做
    if(pWnd)//判断是否为空,因为对话框创建时会调用此函数,而当时控件还未创建
    {

      pWnd->GetWindowRect(&rect);
      ScreenToClient(&rect);//将控件大小转换为在对话框中的区域坐标
      rect.right=rect.right*cx/m_rect.Width();
  rect.left=rect.left*cx/m_rect.Width();
      rect.bottom=rect.bottom*cy/m_rect.Height();
  rect.top=rect.top*cy/m_rect.Height();

  CString a,b,c,d;
  a.Format("%d",rect.right);
  b.Format("%d",rect.left);
  c.Format("%d",rect.bottom);
  d.Format("%d",rect.top);
  MessageBox(a+" "+b+" "+c+" "+d);
      pWnd->MoveWindow(rect);//设置控件大小
    }
GetWindowRect(&m_rect);
}

#3


if(pWnd->m_hWnd) 

#4


该回复于2013-05-08 14:13:39被管理员删除

#5


Debug和release两个版本运行的结果不一样,怎么办。

#6


计算rect的时候把m_rect的值也打印出来看下

#7


引用 3 楼 sha_jinhao 的回复:
if(pWnd->m_hWnd) 
什么意思?

#8


方法一:
加个变量,bool m_binit;
构造函数中初始化m_binit=false;
在oninitlizedialog中m_binit=true;
OnSize中if(m_binit){....}
方法二:
OnSize中
if(pWnd&&IsWindow(pWnd->m_hWnd)){...} 

#9


引用 6 楼 dahaiI0 的回复:
计算rect的时候把m_rect的值也打印出来看下
m_rect的值在两个模式下是一样的。

#10


引用 8 楼 yfqvip 的回复:
方法一:
加个变量,bool m_binit;
构造函数中初始化m_binit=false;
在oninitlizedialog中m_binit=true;
OnSize中if(m_binit){....}
方法二:
OnSize中
if(pWnd&&IsWindow(pWnd->m_hWnd)){...} 
没效果,主要是debug下和release下的cx,cy的值不一样。

#11


用outputdebugstring试试,是不是打印了多次

#12


用 GetClientRect 获取高和宽

#13


楼主获取有问题。

窗体不存在也获取。

判断得重写

#14


引用 13 楼 tiger9991 的回复:
楼主获取有问题。

窗体不存在也获取。

判断得重写
怎么弄?

#15


为什么两个版本下的cx和cy的值不一样呢。谁给指导下啊,很急!!!!

#16


得把窗体初始化一下看下,窗体和控件大小都固定了  就变不了了

#17


我也遇到了同样的问题,请问解决了吗?