mfc窗体坐标相关函数

mfc中窗体以及其上的控件(都是Wnd类)拥有两套坐标系,一套是以屏幕左上角为原点(绝对坐标),一套是以某个窗体或控件自身的客户区的左上角为原点(相对坐标)。

// rect中存储的是Wnd的屏幕坐标
CRect rect;
Wnd->GetWindowRect(&rect);

// rect中存储的是Wnd的客户区,rect左上角为坐标原点。
Wnd->GetClientRect(&rect);
假设你想知道对话框Dlg上的某个控件Ctl在对话框的客户区的相对坐标,需要两步:

先获得Ctl的绝对坐标rect,然后调用Dlg的ScreenToClient()将rect转换为相对坐标,具体代码如下:

Ctl->GetWindowRect(&rect);
Dlg->ScreenToClient(&rect);

这里要注意的是,经常我们的窗体代码中会省略调用者,比如在调用者自己的消息处理函数中时,可以省略this->,我们就需要注意当前的Rect究竟是哪个窗体或控件的rect,调用ScreenToClient更需要注意是要将rect转换为相对于哪个Wnd的坐标。


另外发现一点,就是GetClientRect函数的参数类型是LPRECT, 但是不加&符的CRect类型的变量传进去也没有问题,原来CRect重载了operator,见如下声明和实现:

//convert between CRect and LPRECT/LPCRECT (no need for &)
operator LPRECT() throw();
operator LPCRECT() const throw();

ATLTYPES_INLINE CRect::operator LPRECT() throw()
{
	return this;
}


ATLTYPES_INLINE CRect::operator LPCRECT() const throw()
{
	return this;
}
CRect lRect;
GetClientRect( lRect );// 不加&符也没有问题

你可能感兴趣的:(mfc,坐标,窗体)