1)首先要说的是,你看MSDN的翻译有问题。
以GetWindowRect为例,翻译应该是:它的参数是一个指针,这个指针可以指向CRect对象和RECT对象。
2)然后再要说明的是在MSDN中,如果你查找CRect类型,里面会有介绍都有哪些参数类型时,CRect对象可以传递。
回归到你说的主要问题,LPRECT类型为什么可以传递 rc 又可以传递&rc。
1)传递&rc:你在工程中输入LPRECT(在什么地方都行),然后用鼠标选中,然后按F12,这样就可以看到LPRECT的定义处。从定义中可以看到LPRECT是一个指向tagRect类型的指针,那么对它赋值时,当然要使用一个对象的地址,也就是 &rc。
2)传递rc: 那么为什么传递rc也会成功呢?正常来说,指针只能得到的是地址,而不是对象。
接下来用同样的方法,在工程中输入CRect,然后按F12,查看它的定义处。从CRect类中可以看到这样一块内容
operator LPRECT();
operator LPRECT();const
为什么指针能指向一个对象的重点原因就在这里了,就是因为对类型进行了重载操作!这样使得指针可以指向对象。
那么至于具体的深层代码的已经被封装到代码库中,如果要找的话就得亲自动手了。
不过在代码层,只要看MSDN中的CRect解释都能看懂了。