想给TreeView控件加个其它颜色的边框,本来以前也常用GetWindowRect和GetClientRect函数,其中GetWindowRect函数是获取指定窗口句柄在屏幕中的坐标和大小,而GetClient函数则时获取指定窗口在窗口显示区域的坐标和大小。给TreeView加个颜色边框,我的思路是先获取TreeView的坐标和大小,然后再用Rectangle函函数照着坐标和大小来画个矩形框就行了,但在获取TreeView的坐标时,X坐标和Y坐标总是为0,我的代码如下:
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);
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);