【问题标题】:How to know if the WM_PAINT must erase background? windows api如何知道 WM_PAINT 是否必须擦除背景?窗口API
【发布时间】:2019-08-30 12:10:54
【问题描述】:

我正在尝试记录绘制消息以解决问题,我需要一种方法来了解 WM_PAINT 消息是否必须擦除背景, 所以我在 WM_PAINT 处理中做了这个:

hdc = BeginPaint(hwnd,&ps);
//code to output the Invalid RECT is ommited.....
if(ps.fErase){
    //output true
}else{
    //output false
};

ps.rcPaint 具有正确的值,但即使我调用 InvalidateRect(hwnd,0,true);ps.fErase 始终为“假”,其中 hwnd 是我记录 WM_PAINT 消息的窗口 这是一些output image

我想知道无效的统治绘画请求是否像我对上一个 InvalidateRect(hwnd,0,1); 所做的那样包括擦除背景我在做什么错了?

【问题讨论】:

    标签: c windows winapi


    【解决方案1】:

    如果背景需要擦除,系统会在WM_PAINT 之前发送WM_ERASEBKGND。如果您不处理此消息,那么它将通过DefWindowProc 自动清除背景。

    您需要处理WM_ERASEBKGND并返回0,以向系统表明背景尚未被擦除。然后它会给你另一个机会WM_PAINT

    【讨论】:

    • 非常感谢,是的,现在它返回 TRUE,但我如何区分 - 在 WM_PAINT 处理内部 - 如果 WM_paint 消息是由于 InvalidateRect(hwnd,0,**1**); 或由于 InvalidateRect(hwnd,0,**0**); 而引起的,因为这两个调用都会生成WM_ERASEBKGNDWM_PAINT ?
    • FALSE 传递给InvalidateRect 不应导致背景需要擦除。
    • 哦,是的,你是对的,我在代码中的其他地方遗漏了导致背景擦除的内容,非常感谢您的帮助 :)
    • 我刚刚意识到我没有对你的帮助表示赞同,谢谢 :) 我离开了 C 和 windows API,现在开始使用 PHP,祝乔纳森度过愉快的一天
    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 2012-02-14
    • 2015-05-08
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多