GetWindowRect(hwndTV, &rectTV);
ScreenToClient(hwndTV, (LPPOINT)&rectTV);
在MSDN中也没说ScreenToClient函数中的句柄该设置子窗口句柄还是父窗口句柄,这是我在学习这个函数时没有理解,而且用得也少,后来在CSDN上看到了一篇贴子,才知道正确的写法如下:
GetWindowRect(hwndTV, &rectTV); //hwndTV为TreeView控件句柄
ScreenToClient(hwnd, (LPPOINT)&rectTV); //hwnd为父窗口句柄
以前我一直将ScreenToClient函数的作用理解为将窗口屏幕坐标转为显示区域坐标,并存入RECT或POINT结构体中,正确的理解应为将RECT或POINT结构体中的已存在的屏幕坐标转换为在第一个参数中设置窗口的显示区域坐标。
来个完整点的代码:
GetWindowRect(hwndTV, &rectTV);
Point.x = rectTV.left; //将X坐标赋值到POINT结构中
Point.y = rectTV.top; //将Y坐标赋值到POINT结构中
ScreenToClient(hwnd, &Point);
GetClientRect(hwndTV, &rectTV);
hdc = BeginPaint(hwnd, &ps);
hPen = CreatePen(PS_SOLID, 1, RGB(127,157,185));
SelectObject(hdc, hPen);
SelectObject(hdc, (HBRUSH) GetStockObject(NULL_BRUSH));
Rectangle(hdc,
Point.x - 1,
Point.y - 1,
rectTV.right + 2,
rectTV.bottom + 2);
EndPaint(hwnd, &ps);