void CCalculatorDlg::OnScientific() 
{
// TODO: Add your control notification handler code here
    m_bIsExpand=1;              //应将对话框窗口扩大以显示科学型计算器
    m_isSentific=0;               //设置单选按钮选项为科学型
    ExpandToSentific(); 
}void CCalculatorDlg::OnStandard() 
{
// TODO: Add your control notification handler code here
    m_bIsExpand=0;            //将对话框窗口缩小以显示标准型计算器
    m_isSentific=1;             //设置单选按钮选项为标准型
    ExpandToSentific();
}void CCalculatorDlg::ExpandToSentific()
{
    if(m_bIsExpand)             //如果是科学型,则扩大对话框尺寸
{
       SetWindowPos(NULL,0,0,rcSentific.Width(),rcSentific.Height(),
       SWP_NOMOVE|SWP_NOZORDER);  //设置对话框窗口大小
       SetVisibleCtrl();           //设置对话框中的控件 }
    else                          //否则将对话框尺寸设置为标准型
{
    SetWindowPos(NULL,0,0,rcStandard.Width(),rcSentific.Height(),
        SWP_NOMOVE|SWP_NOZORDER);
        SetVisibleCtrl();
}
    UpdateData(FALSE);}void CCalculatorDlg::SetVisibleCtrl()
{
    CWnd* pCtrl=GetWindow(GW_CHILD);//获得对话框中控件的指针
    CRect rcTest;                 //检验矩形
    CRect rcControl;             //控件矩形
    CRect rcShow;                //对话框矩形    GetWindowRect(rcShow);       //循环获得对话框的子窗口    while(pCtrl!=NULL)          //如果控件指针为空则停止循环,否则对其进行可视化处理
{
   pCtrl->GetWindowRect(rcControl);   //获取子窗口的矩形位置(屏幕坐标)
    if(rcTest.IntersectRect(rcShow,rcControl)) //求两个矩形的交集
       pCtrl->EnableWindow(TRUE);       //如果有交集设置子窗口有效
    else
       pCtrl->EnableWindow(FALSE);      //没有交集设子集无效
       pCtrl=pCtrl->GetWindow(GW_HWNDNEXT);  //获得下一个子窗口

}

解决方案 »

  1.   

    rcSentific.Width(),rcSentific.Height()
    调试一下宽度和高度是否正确.或者直接使用MoveWindow()函数
      

  2.   

    当选科学型或标准型时,坐标top,buttom,right,left值全是"-858993460"
      

  3.   

    设置rcStandard,rcSentific的值,例如rcStandard.SetRect(0,0,300,200).
      

  4.   

    能不能帮我解释一下这段代码?void CCCalculatorDlg::OnNum(UINT uID)
    {  
    UINT  index=uID- IDC_NUM_0;
    CString  num;
    CString  str;
    num.Format(_T("%d"),index);
    //AfxMessageBox(num);//弹出对话框提醒
    switch(st)
    {
    case _CE:
    str=num;
    m_ctlDisplay.SetWindowText(str);
    st=_A;
    break;
    case _A:
    m_ctlDisplay.GetWindowText(str);
    str+=num;
    m_ctlDisplay.SetWindowText(str);
    break;
       case _B:
       str=num;
       m_ctlDisplay.SetWindowText(str);
       st=_C;
       break;
       case _C:
       m_ctlDisplay.GetWindowText(str);
       str+=num;
       m_ctlDisplay.SetWindowText(str);
       break;
       case _D:
       str=num;
       m_ctlDisplay.SetWindowText(str);
       st=_A;
       break;
       
       default:;
       
       
    }
    }
    double CCCalculatorDlg::GetCurrentNum()
    {  double num=0;
    CString str;
    m_ctlDisplay.GetWindowText(str);
    num=atof(str);
    return num;
    }//获得当前显示的数字void CCCalculatorDlg::DisplayNum(double d)
    {
    CString str;
        str.Format(_T("%f"),d);
        m_ctlDisplay.SetWindowText(str);}//显示数字
    void CCCalculatorDlg:: Clear()
    { op=None;
    st=_CE;
    m_dCurrentNum=m_dPreNum=0;
    }
    void CCCalculatorDlg::OnOperator(_operator_ _op)
    {         
    switch(st){
    case _A:
    op=_op;
    m_dPreNum=GetCurrentNum();
    st=_B;
    break;
    case _C:
    m_dCurrentNum=GetCurrentNum();
    m_dPreNum=GetValue(m_dPreNum,m_dCurrentNum);
    DisplayNum(m_dPreNum);
    op=_op;
    st=_B;
    break;
    case _D:
    st=_B;
    m_dPreNum=GetCurrentNum();
    op=_op;
    break;
    default:;


    }
    }
    double CCCalculatorDlg::GetValue(double m,double n)
    {   double dr=0;
        double br=m;
        double cr=1/m;//求第一个操作数的倒数用来求x^y
         int i;
    switch(op)
    {  
    case Add:
    dr=m+n;
    break;
    case Multi:
    dr=m*n;
    break;
    case Minus:
       dr=m-n;
       break;
    case Div:
    if(n==0.0)

    AfxMessageBox(_T("分母不能为0!"));
    OnCe();
    }
    else
    {
    dr=m/n;
    }
    break;
    case Mod:
    dr=(int)m%(int)n;//这里简单起见,转换为整数求余数
    break;
    case Exp:
    if(n>=0)//n为正数
    for(i=0;i<n;i++)
    {
    br=br*10;//乘以10的n次幂
    }
    else//n为负数
    {   n=-n;
    for(i=0;i<n;i++)
    {
    br=br*0.1;//乘以0.1的n次幂
    }
    }
    dr=br;
    break;
    case SQUAR:
    if(n>=0)
    for (i=0;i<n-1;i++)
    {   
    br=br*m;
    }
    else
    {   br=1/br;
    n=-n;
    for(i=0;i<n-1;i++)
    {
    br=br*cr;//乘以0.1的n次幂
    }


    } dr=br;
    break;
    default:;
    }
    return dr; }