为什么两种方法获取控件坐标的结果不一样?

时间:2021-05-25 09:44:11
目的:使用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对像如何与当前对话框进行关联?

6 个解决方案

#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


引用 3 楼  的回复:
操作1中:pWnd->ScreenToClient(&rectheader);//把屏幕坐标转化成相对当前窗体的坐标

操作2中:ScreenToClient(&rectheader);相当于:this->ScreenToClient(&rectheader);
        //将控件大小转换为在对话框中的区域坐标
    
在这两个操作中,调用的对象不一样……


哦,明白了,谢谢。
另外我还想问一下,不说是有句柄也可以操作对像吗?为什么用下面的代码运行时会报错呢???


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();  // 取得控件的句柄

#6


非常感谢。

#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


引用 3 楼  的回复:
操作1中:pWnd->ScreenToClient(&rectheader);//把屏幕坐标转化成相对当前窗体的坐标

操作2中:ScreenToClient(&rectheader);相当于:this->ScreenToClient(&rectheader);
        //将控件大小转换为在对话框中的区域坐标
    
在这两个操作中,调用的对象不一样……


哦,明白了,谢谢。
另外我还想问一下,不说是有句柄也可以操作对像吗?为什么用下面的代码运行时会报错呢???


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();  // 取得控件的句柄

#6


非常感谢。