GetClientRect(HWND, RECT*) ---得到窗口的客户区大小,left,top总是0,bottom是客户区高度,right是客户区宽度
GetWindowRect(HWND, RECT*) ---得到窗口相对屏幕左上角(0,0)的坐标,即窗口左上角(left,top)和右下角(right,bottom)的坐标
ScreenToClient(HWND, POINT*) ---将一屏幕坐标转为相对于窗口客户区左上角的坐标。假设客户区屏幕坐标(110,120,400,400)
若p(100,100),则转换后p(-10, -20)
若p(150,150),则转换后p(40, 30)
ClientToScreen(HWND, POINT*) ---将一相对于窗口客户区左上角(始终假设)的坐标转为屏幕坐标。假设客户区屏幕坐标(110,120,400,400)
若p(5, 5),则转换后p(115,125)
若p(10, -20),则转换后p(120,100);
Windows并没有提供直接转换客户区RECT坐标/屏幕RECT坐标的函数,但是MFC中的CWindow类提供了ClientToScreen(RECT*) 和 ScreenToClient(RECT*)函数。
比如,当使用ClientToScreen(RECT *prc)时,传入的RECT坐标是假定为相对客户区左上角的,假设客户区屏幕坐标(110,120,400,400)
若rc(2,2,4,4),则转换后rc(112,122,114,124)
若rc(-5,-5,0,0),则转换后rc(105,115,110,120)
若rc(0,0,290,280),则转换后rc(110,120,400,400) >--->------->------->此例常用来获取客户区相对屏幕原点的坐标:
RECT rcClient; GetClientRect(&rcClient); //0 0 宽 高 ClientToScreen(&rcClient); //客户区左上点和右下点的屏幕坐标 /*很常用,但不要误认为ClientToScreen的作用仅限于此*/
同理,当使用ScreenToClient(RECT *prc)时,传入的RECT坐标假定为屏幕坐标,假设客户区屏幕坐标(110,120,400,400)
若rc(150,150,160,160),则转换后rc(40,30,50,40)
若rc(100,100,120,120),则转换后rc(-10,-20,10,0)
若rc(110,120,400,400),则转换后rc(0,0,290,280)
OffsetRect(RECT*, int dx, int dy) ---移动矩形,从感官上:dx为正,右移,为负,则左移;dy为正,下移,为负,上移。若rc(100,100,150,150)
dx=0,dy=1,则转换后rc(100,101,150,151)
dx=-50,dy=-10,则转换后rc(50,90,100,140)
使用1:将窗口相对屏幕坐标转为相对窗口左上角坐标(即0 0 宽 高)
RECT rc; ::GetWindowRect(hwnd, &rc); ::OffsetRect(&rc, -rc.left, -rc.top); /*当然也可以 rc.right -= rc.left; rc.bottom -= rc.top; rc.left = rc.top = 0; */
使用2:计算客户区相对窗口左上角的坐标
//MFC下 RECT rc, rcClient; GetWindowRect(&rc);//窗口的屏幕坐标 GetClientRect(&rcClient); ClientToScreen(&rcClient);//客户区的屏幕坐标 ::OffsetRect(&rcClient, -rc.left, -rc.top);//客户区相对与窗口左上角的坐标