api 获取 窗口 rect hbrush

通过Windows API调用GetWindowRect获取窗口矩形坐标,结合CreateSolidBrush/CreatePatternBrush创建HBRUSH句柄实现

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)。

api 获取 窗口 rect hbrush

HWND hButton = GetDlgItem(hwnd, IDC_MYBUTTON); // 获取按钮句柄
RECT btnRect;
GetWindowRect(hButton, &btnRect); // 获取按钮的屏幕坐标矩形

问题2:如何判断窗口是否使用自定义背景画刷?

解答
通过 GetClassLong 获取 GCL_HBRBACKGROUND 属性,若返回值为 NULL 或系统默认画刷,则说明未使用自定义画刷。

api 获取 窗口 rect hbrush

HBRUSH hBrush = (HBRUSH)GetClassLong(hwnd, GCL_HBRBACKGROUND);
if (hBrush != NULL && hBrush != (HBRUSH)GetStockObject(DEFAULT_GUI_THREAD_HABIT)) {
    // 使用了自定义背景画刷
}

以上就是关于“api 获取 窗口 rect hbrush”的问题,朋友们可以点击主页了解更多内容,希望可以够帮助大家!

api 获取 窗口 rect hbrush

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

(0)
热舞的头像热舞
上一篇 2025-05-10 22:43
下一篇 2025-05-10 23:01

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

广告合作

QQ:14239236

在线咨询: QQ交谈

邮件:asy@cxas.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信