【C/C++】只知道窗口句柄,如何擦除窗口内容,清理窗口?

在Win32 C编程中,如果只知道窗口句柄,可以通过以下几种方式擦除窗口内容:

  • 使用InvalidateRect和UpdateWindow组合

    调用InvalidateRect函数将窗口的客户区标记为无效,这会触发系统发送WM_PAINT消息。然后立即调用UpdateWindow函数强制窗口立即重绘。

    这种组合方式能确保窗口内容被立即清理并重绘。

  • 直接调用RedrawWindow函数

    使用RedrawWindow函数可以一次性完成窗口的无效化和重绘操作。

    该函数提供了更多控制选项,包括是否重画非客户区和背景。

  • 发送WM_ERASEBKGND消息

    通过SendMessage直接发送WM_ERASEBKGND消息给窗口,这会触发窗口擦除背景。这种方式直接调用窗口的背景擦除处理逻辑。

完整代码示例

c 复制代码
#include <windows.h>

// 方法1:使用InvalidateRect和UpdateWindow组合
void CleanWindowByInvalidate(HWND hWnd) {
    // 将整个客户区标记为无效
    InvalidateRect(hWnd, NULL, TRUE);
    // 强制立即重绘
    UpdateWindow(hWnd);
}

// 方法2:使用RedrawWindow函数
void CleanWindowByRedraw(HWND hWnd) {
    // RDW_INVALIDATE | RDW_ERASE 组合标志
    RedrawWindow(hWnd, NULL, NULL, 
                 RDW_INVALIDATE | RDW_ERASE | RDW_UPDATENOW);
}

// 方法3:发送WM_ERASEBKGND消息
void CleanWindowByEraseBkgnd(HWND hWnd) {
    HDC hdc = GetDC(hWnd);
    if (hdc) {
        SendMessage(hWnd, WM_ERASEBKGND, (WPARAM)hdc, 0);
        ReleaseDC(hWnd, hdc);
    }
}

int main() {
    // 示例:假设已知窗口句柄hTargetWnd
    HWND hTargetWnd = /* 你的窗口句柄 */;
    
    // 使用任意一种方法清理窗口
    CleanWindowByInvalidate(hTargetWnd);
    // 或者
    // CleanWindowByRedraw(hTargetWnd);
    // 或者
    // CleanWindowByEraseBkgnd(hTargetWnd);
    
    return 0;
}

函数说明

  • InvalidateRect:将指定矩形区域标记为需要重绘,第三个参数为TRUE时会擦除背景

  • UpdateWindow:立即发送WM_PAINT消息,绕过消息队列

  • RedrawWindow:提供完整的重绘控制,可指定是否立即更新

  • SendMessage(WM_ERASEBKGND):直接触发背景擦除操作

注意事项

  • 这些方法都需要目标窗口有正常的消息处理机制

  • 如果窗口被其他进程拥有,可能需要适当的权限

  • 在调用这些函数后,窗口会收到相应的绘制消息并执行清理操作

推荐使用InvalidateRect和UpdateWindow组合,这是最常用且可靠的方法

相关推荐
咩咦5 分钟前
C++学习笔记21:日期类加减天数
c++·学习笔记·运算符重载·日期类·operator+·operator+=
努力努力再努力wz7 分钟前
【QT入门系列】QWidget 六大常用属性详解:windowOpacity、cursor、font、focus、toolTip 与 styleSheet
android·开发语言·数据结构·c++·qt·mysql·算法
少司府8 分钟前
Tools相关:深入浅出学Git
大数据·c++·git·gitee·github·仓库·分支
神仙别闹9 分钟前
基于MFC(C++)实现(界面)学委作业管理系统
开发语言·c++·mfc
三品吉他手会点灯9 分钟前
C语言学习笔记 - 41.数据类型 - scanf函数核心知识点复习
c语言·开发语言·笔记·学习
撩得Android一次心动10 分钟前
C语言基础笔记3【个人用】
android·c语言·开发语言·笔记
艾莉丝努力练剑12 分钟前
【Linux网络】Linux 网络编程:HTTP(三)HTTP 协议原理
linux·运维·服务器·网络·c++·http
薇茗16 分钟前
【初阶数据结构】 升沉有序的平仄 排序 3
c语言·开发语言·数据结构·算法·排序算法·文件归并排序
字节高级特工17 分钟前
C++11(一) 革新:右值引用与移动语义
java·开发语言·c++·人工智能·后端
孬甭_17 分钟前
双向链表详解
c语言·数据结构·链表