目的:使用VS2010基于对话框,在OnPaint中,获取对话框中指定控件的坐标位置。操作一:
        CRect rectheader;
CWnd* pWnd;
pWnd = GetDlgItem(IDC_HEADERPOS);
pWnd=GetDlgItem(IDC_HEADERPOS);
pWnd->GetWindowRect(&rectheader);
pWnd->ScreenToClient(&rectheader);操作二:
        CRect rectheader;
        GetDlgItem(IDC_HEADERPOS)->GetWindowRect(rectheader);
ScreenToClient(&rectheader);
问题:
       两种操作方法出现的坐标值都不一样,请问一下,为什么会出现这种情况 ?还希望高手给予解释一下,谢谢。
另:新建CWnd对像如何与当前对话框进行关联?

解决方案 »

  1.   

    比如:一个窗体上面的button控件。GetWindowRect获取的是button在屏幕的坐标。ScreenToClient 把button在屏幕的坐标转为在窗体的坐标。
      

  2.   

    pWnd->ScreenToClient(&rectheader);
    改成相对于对话框。
    this->ScreenToClient(&rectheader);
      

  3.   

    操作1中:pWnd->ScreenToClient(&rectheader);//把屏幕坐标转化成相对当前窗体的坐标操作2中:ScreenToClient(&rectheader);相当于:this->ScreenToClient(&rectheader);
            //将控件大小转换为在对话框中的区域坐标
        
    在这两个操作中,调用的对象不一样。
      

  4.   


    哦,明白了,谢谢。
    另外我还想问一下,不说是有句柄也可以操作对像吗?为什么用下面的代码运行时会报错呢???
    CRect rectheader;
    CWnd* pWnd;
    pWnd->m_hWnd = GetDlgItem(IDC_HEADERPOS)->m_hWnd;
    pWnd=GetDlgItem(IDC_HEADERPOS);
    pWnd->GetWindowRect(&rectheader);
    pWnd->ScreenToClient(&rectheader);

      

  5.   

    CWnd *pWnd = GetDlgItem(ID_***); // 取得控件的指针
    HWND hwnd = pWnd->GetSafeHwnd();  // 取得控件的句柄