GetWindowRect 和 GetClientRect

原文:http://blog.chinaunix.net/u/25372/showart_304363.html
GetWindowRect是取得窗口在屏幕坐标系下的RECT坐标(包括客户区和非客户区),这样可以得到窗口的大小和相对屏幕左上角(0,0)的位置。

    GetClientRect取得窗口客户区(不包括非客户区)在客户区坐标系下的RECT坐标,可以得到窗口的大小,而不能得到相对屏幕的位置,因为这个矩阵是在客户区坐标系下(相对于窗口客户区的左上角)的。  

    ClientToScreen把客户区坐标系下的RECT坐标转换为屏幕坐标系下的RECT坐标.

    ScreenToClient把屏幕坐标系下的RECT坐标转换为客户区坐标系下的RECT坐标.     我们对同一个窗口先GetWindowRect取得一个RECT,再用ScreenToClient转换到客户坐标系。然后GetClientRect取得一个RECT,再用ClientToScreen转换到屏幕坐标系。显然,GetWindowRect取得的矩阵不小于GetClientRect取得的矩阵。因为前者包含了非客户区,而后包括了客户区。   

    对GetWindowRect取得的矩阵ScreenToClient后,矩阵的大小没有变小,(-3,-29)是窗口的左上角的坐标,相对窗口客户区左上角。   

    对GetClientRect取得的矩阵ClientToScreen后,矩阵也没有变大,新得到的矩阵是窗口客户区在屏幕坐标系上的RECT。

<think>嗯,用户想了解GetClientRect函数在C++ Windows API中的使用方法。首先,我需要回忆一下这个函数的具体作用。记得GetClientRect是用来获取窗口客户区的大小位置的,客户区是指窗口中不包括标题栏、边框等部分的可绘制区域。返回的RECT结构应该包含客户区的左上角右下角坐标,不过左上角通常都是(0,0),因为相对于窗口的客户区原点来说。 接下来,我得确认函数的基本语法。函数原型应该是这样的:BOOL GetClientRect(HWND hWnd, LPRECT lpRect)。第一个参数是窗口句柄,第二个是指向RECT结构的指针,用来接收结果。需要确保用户传入有效的窗口句柄有效的RECT指针,否则可能会出错。 然后,要举一个实际的使用例子。比如在窗口过程函数中处理WM_PAINT消息时,获取客户区大小来进行绘制操作。这时候通常会调用BeginPaintEndPaint,并结合DrawText或其他绘图函数使用RECT结构。例如,在WM_PAINT处理中调用GetClientRect获取客户区,然后用这个RECT来居中显示文本或者绘制图形。 还需要注意一些常见问题。比如,RECT的lefttop通常是0,rightbottom是宽度高度。如果用户需要屏幕坐标,可能需要调用ClientToScreen函数进行转换。此外,在多线程或跨线程调用时,窗口句柄的有效性需要保证,否则可能导致访问违规。 另外,用户可能需要了解错误处理。比如,如果传入无效的句柄,函数会返回0,这时候可以调用GetLastError获取错误代码。常见的错误可能是ERROR_INVALID_WINDOW_HANDLE,说明窗口句柄无效。 还有,可能相关的函数比如GetWindowRect,两者的区别需要说明清楚。GetWindowRect获取的是整个窗口在屏幕上的位置,而GetClientRect只是客户区的大小,原点在客户区左上角。 最后,结合用户提供的引用内容,引用[2]提到了WndProc中使用RECTDrawText的例子,可以在这里作为引用指出,帮助用户理解实际应用场景。需要确认引用标识是否正确,比如用户提供的引用[^2]是关于DrawText的使用,可以关联到示例代码部分。 总结一下,回答的结构应该包括函数的作用、语法、参数说明、返回值、示例代码以及注意事项相关函数。同时,生成的相关问题可能涉及错误处理、坐标转换、与其他函数的区别以及实际应用中的使用场景等。</think>### GetClientRect函数使用方法 #### 1. 函数作用 `GetClientRect`用于获取窗口客户区的坐标信息,客户区指窗口中可绘制内容的区域(不包含标题栏、边框等系统元素)。返回的$RECT$结构中,$left$$top$通常为0,$right$$bottom$分别表示客户区的宽度高度[^2]。 #### 2. 函数原型 ```cpp BOOL GetClientRect( HWND hWnd, // 目标窗口句柄 LPRECT lpRect // 接收结果的RECT结构指针 ); ``` #### 3. 参数说明 | 参数 | 类型 | 说明 | |---------|---------|---------------------------| | hWnd | HWND | 需要获取客户区大小的窗口句柄 | | lpRect | LPRECT | 接收结果的RECT结构指针 | #### 4. 返回值 - 成功:返回非零值 - 失败:返回0(可通过`GetLastError()`获取错误代码) #### 5. 使用示例 ```cpp case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); RECT rcClient; GetClientRect(hWnd, &rcClient); // 获取客户区坐标 // 在客户区中心绘制文字 DrawText( hdc, L"Hello Windows API", -1, &rcClient, DT_CENTER | DT_VCENTER | DT_SINGLELINE ); EndPaint(hWnd, &ps); break; } ``` 此示例在窗口重绘时获取客户区坐标,并使用`DrawText`进行居中文字绘制。 #### 6. 注意事项 - 获取的是相对于窗口客户区的坐标左上角始终为(0,0)) - 需要转换为屏幕坐标时,应使用`ClientToScreen`函数 - 若窗口最小化或未初始化,可能返回异常值 #### 7. 相关函数对比 | 函数 | 作用 | 坐标系 | |-----------------|---------------------------|-------------| | GetClientRect | 获取客户区尺寸 | 窗口客户区 | | GetWindowRect | 获取整个窗口的屏幕坐标 | 屏幕坐标系 | | AdjustWindowRect| 根据客户区计算所需窗口尺寸 | 窗口坐标系 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值