void TopLabelView2::OnSize(UINT nType, int cx, int cy) 
{
CFormView::OnSize(nType, cx, cy);

// TODO: Add your message handler code here CRect   rc;   
GetClientRect(&rc);   
int x=rc.Width();           //  929      1036       1204
         int y=rc.Height();          //  524      822         822  
int area=x*y;
double rate1,rate2;
rate1=x/1204;
rate2=y/822;

CWnd *pWnd1;

         pWnd1 = GetDlgItem(IDC_DAS_CIRCLEGAUGE1);     //pWnd1获得为空??
}
IDC_DAS_CIRCLEGAUGE1  是一个仪表控件,不知道为什么 ,就是获得不了!!!
  

解决方案 »

  1.   

    IDC_DAS_CIRCLEGAUGE1 这个仪表控件的父窗口是TopLabelView2么?
    你把创建的代码贴出来!
      

  2.   

    OnSize不止会运行一次的,应该
    if(::IsWindow(GetDlgItem(IDC_DAS_CIRCLEGAUGE1)->GetSafeHwnd())
    {
    ……
    }  可以在里面设置个断点看一下
      

  3.   

    class TopLabelView2 : public  CFormView
    {
    protected:
    TopLabelView2();           // protected constructor used by dynamic creation
    DECLARE_DYNCREATE(TopLabelView2)// Attributes
    public:
    CDAS_CircleGauge m_CGauge1;

    void TopLabelView2::DoDataExchange(CDataExchange *pDX)
    {
    CFormView::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CPrintView)
    // NOTE: the ClassWizard will add DDX and DDV calls here
    DDX_Control(pDX, IDC_DAS_CIRCLEGAUGE1, m_CGauge1);
      

  4.   

    OnSize第一次运行时,所有控件对象都没有创建呢
    系统启动时,会调用三次OnSize
      

  5.   

    为空你不需要管。
    正常启动后,pWnd就有值了
    第一次调用时你不需要处理
      

  6.   

    因为OnSize第一次调用时控件还没有完成初始化,给你个取巧的办法,BOOL  m_bResizeFlag;   //定义个成员变量m_bResizeFlag = FALSE;  初始化BOOL CXXXDlg::OnInitDialog()
    {
         ......
         m_bResizeFlag = TRUE;
    }void CXXXDlg::OnSize(UINT nType, int cx, int cy)
    {
    if(m_bResizeFlag)
    {
                ...... //调整窗口
            }
    }
         
      

  7.   

    之需要用pWnd的地方先判断是否为空就行。为空就不处理
      

  8.   


    但是以上的代码加上 这句 pWnd1->MoveWindow(( double )x*0.33,( double )y*0.13,( double )150*rate1,( double )150*rate2,TRUE);执行程序 直接报错!
      

  9.   


    if(pWnd1 != NULL)
        pWnd1->MoveWindow(( double )x*0.33,( double )y*0.13,( double )150*rate1,( double )150*rate2,TRUE); 
    就行了啊。
    用指针前,先判定是否为空啊
      

  10.   

    可以GetSafeWnd判断一下窗口是否建立 然后再使用
      

  11.   

    对于窗口指针,不能只判断指针是否合法,还应判定其句柄是否为空,
    窗口指针不为空,并不代表其窗口就一定存在,我觉得最好的做法如下:
    CWnd* pWnd;
    ...
    if ( pWnd && pWnd->m_hWnd )
    {
        // do something; 
    }
      

  12.   

    void TopLabelView2::OnSize(UINT nType, int cx, int cy) 
    {
        CFormView::OnSize(nType, cx, cy);
        
        // TODO: Add your message handler code here    CRect   rc;   
        GetClientRect(&rc);   
        int x=rc.Width();           //  929      1036       1204
             int y=rc.Height();          //  524      822         822  
        int area=x*y;
        double rate1,rate2;
        rate1=x/1204;
        rate2=y/822;
        
        CWnd *pWnd1;
        
             pWnd1 = GetDlgItem(IDC_DAS_CIRCLEGAUGE1);     //pWnd1获得为空??
    }这段代码中rate1,rate2式用来表示缩放比例的吧???
    如果真是这样的,请看rate1=x/1204;这句代码,它的计算过程是:
    1. 两个整形的数相除,得到的是一个舍去小数位的整数;
    2. 将结果(整数)赋值给一个double型变量;
    也就是说,如果x < 1024,rate1永远都是零;
    我猜你在其它地方肯定调用了MoveWindow(rate1*x,...)或SetWindowPos(rate1*x, ...)等改变窗口大小和位置的函数吧,
    此时窗口不变成零才怪。这句代码rate2=y/822;也有同样的问题
    建议这样修改rate1 = (double)(1.0 * x / 1024);