有时需要在OnSize里面调整控件大小,我一般这样用if(IsWindow(GetDlgItem(IDC_STATIC1)->GetSafeHwnd()))但今天有个同事说这样不对,调用GetDlgItem(IDC_STATIC1)的时候IDC_STATIC1可能还没准备好,就会造成非法访问,说应当这样使用:
if(IsWindow(::GetDlgItem(GetSafeHwnd(), IDC_STATIC1)))请问他说的有道理吗?

解决方案 »

  1.   

    if(NULL != GetDlgItem(IDC_STATIC1)->GetSafeHwnd())
    这样就可以了
      

  2.   

    当然前提是GetDlgItem(IDC_STATIC1)指针不为NULL
      

  3.   

    第一种方法没问题,可以用
    只要窗口初始化过了,就没有任何问题
    比如CDialog窗口,只要OnInitDialog返回了,那窗口上的控件都已经创建完了,可以通过GetDlgItem(IDC_STATIC1)来获得了
      

  4.   

    初始化完成后才会走ONSIZE 怎么会没准备好呢·不过指针这东西 谁也不能保证他永远都不会是NULL
      

  5.   

    判断GetDlgItem(IDC_STATIC1)是否是NULL就行了如果是对话框的话,注意不能在OnInitDialog之前使用GetDlgItem(IDC_STATIC1)得到的CWnd指针做任何操作就是了,实在不行可以加个标志量表示是否已经OnInitDialog了
      

  6.   


    GetDlgItem(IDC_STATIC1)是否为空是不是只能说明CWnd对象是否构造了,确定窗口是否已经创建好的话还得看GetSafeHwnd()的返回值?
      

  7.   

    另外问一个钻角尖的问题,if(NULL != GetDlgItem(IDC_STATIC1)->GetSafeHwnd())
       GetDlgItem(IDC_STATIC1)->MoveWindow......当程序正在执行到MoveWindow的时候,对话框突然被销毁了,这种情况可能会发生吗?因为我的程序有时会崩溃,每次崩溃windbg捕获到的信息都是MoveWindow处...