API 获取窗口 Rect 和 HBRUSH 详解
获取窗口 Rect(矩形区域)
核心函数:GetWindowRect
| 函数名 | 说明 |
|---|---|
GetWindowRect |
获取整个窗口(包括边框和标题栏)的屏幕坐标矩形 |
GetClientRect |
获取窗口客户区(不包括边框和标题栏)的相对坐标矩形 |
示例代码(C++):
RECT windowRect;
HWND hwnd = FindWindow(NULL, L"窗口标题"); // 获取目标窗口句柄
if (hwnd) {
GetWindowRect(hwnd, &windowRect); // 获取窗口在屏幕上的绝对坐标
// 输出矩形信息
printf("窗口位置: (%d, %d), 尺寸: %dx%d
",
windowRect.left, windowRect.top,
width = windowRect.right windowRect.left,
height = windowRect.bottom windowRect.top);
}
坐标系转换
| 函数名 | 说明 |
|---|---|
ScreenToClient |
将屏幕坐标转换为客户区坐标 |
ClientToScreen |
将客户区坐标转换为屏幕坐标 |
示例:
POINT pt = {100, 100};
ScreenToClient(hwnd, &pt); // 转换为客户区坐标
ClientToScreen(hwnd, &pt); // 转回屏幕坐标
获取窗口 HBRUSH(画刷)
核心函数:GetClassLong / GetClassLongPtr
| 函数名 | 说明 |
|---|---|
GetClassLong |
获取窗口类的指定属性(如背景画刷) |
GetClassLongPtr |
64位系统兼容版本 |
关键属性:
GCL_HBRBACKGROUND:获取窗口背景画刷句柄GCL_HBRUSH:旧版 Windows 背景画刷属性
示例代码:
HBRUSH hBrush = (HBRUSH)GetClassLong(hwnd, GCL_HBRBACKGROUND);
if (hBrush) {
// 使用画刷(例如填充矩形)
FillRect(hdc, &rect, hBrush);
} else {
// 默认使用系统画刷
hBrush = (HBRUSH)GetStockObject(DEFAULT_GUI_THREAD_HABIT);
}
系统默认画刷
| 画刷类型 | 说明 |
|---|---|
COLOR_WINDOW |
系统窗口背景色(浅灰色) |
NULL_BRUSH |
透明画刷 |
WHITE_BRUSH |
纯白色画刷 |
综合应用示例
场景:获取窗口位置并绘制背景
void DrawWindowBackground(HWND hwnd, HDC hdc) {
// 1. 获取窗口矩形
RECT rect;
GetWindowRect(hwnd, &rect);
// 2. 获取背景画刷
HBRUSH hBrush = (HBRUSH)GetClassLong(hwnd, GCL_HBRBACKGROUND);
if (!hBrush) {
hBrush = (HBRUSH)GetStockObject(DEFAULT_GUI_THREAD_HABIT); // 默认画刷
}
// 3. 填充背景
FillRect(hdc, &rect, hBrush);
}
相关问题与解答
问题1:如何获取子窗口(如按钮)的矩形区域?
解答:
使用 GetWindowRect 函数,传入子窗口的句柄(HWND)。

HWND hButton = GetDlgItem(hwnd, IDC_MYBUTTON); // 获取按钮句柄 RECT btnRect; GetWindowRect(hButton, &btnRect); // 获取按钮的屏幕坐标矩形
问题2:如何判断窗口是否使用自定义背景画刷?
解答:
通过 GetClassLong 获取 GCL_HBRBACKGROUND 属性,若返回值为 NULL 或系统默认画刷,则说明未使用自定义画刷。

HBRUSH hBrush = (HBRUSH)GetClassLong(hwnd, GCL_HBRBACKGROUND);
if (hBrush != NULL && hBrush != (HBRUSH)GetStockObject(DEFAULT_GUI_THREAD_HABIT)) {
// 使用了自定义背景画刷
}
以上就是关于“api 获取 窗口 rect hbrush”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!