Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么要使用验证/无效区域?_C_Winapi - Fatal编程技术网

C 为什么要使用验证/无效区域?

C 为什么要使用验证/无效区域?,c,winapi,C,Winapi,当窗口的一部分需要重新绘制时,该区域被标记为无效,当我重新绘制该区域时(在WM_PAINT事件处理程序中),我应该将该区域标记为有效 但我不明白为什么需要将该区域标记为无效,然后在以后进行验证,我的意思是为什么不只做以下操作:当需要重新绘制某个区域时,只需发送WM_PAINT消息(不将该区域标记为无效),然后重新绘制该区域(不将其标记为有效).将区域标记为无效可让windows知道它需要更新。这是为了允许部分绘制屏幕,而不是每次都完全更新绘图区域 在大多数静态程序中,最好只使更改区域无效,以减少

当窗口的一部分需要重新绘制时,该区域被标记为无效,当我重新绘制该区域时(在
WM_PAINT
事件处理程序中),我应该将该区域标记为有效


但我不明白为什么需要将该区域标记为无效,然后在以后进行验证,我的意思是为什么不只做以下操作:当需要重新绘制某个区域时,只需发送
WM_PAINT
消息(不将该区域标记为无效),然后重新绘制该区域(不将其标记为有效).

将区域标记为
无效
可让windows知道它需要更新。这是为了允许部分绘制屏幕,而不是每次都完全更新绘图区域

在大多数静态程序中,最好只使更改区域无效,以减少绘图开销

在绘制完成后验证它们可以让windows知道该区域已刷新,无需再次重新绘制

例如,当您具有以下类型的窗口时,这将非常有用:


当滚动列表框或勾选复选框时,最好仅使窗口的该区域无效,以便重新绘制,而不是在每次需要更新列表框或复选框以显示新的滚动位置或复选标记时重新绘制整个窗口。

想象有人向栅栏投掷球。你重新粉刷篱笆的次数和球击中它的次数一样多吗?不,如果且仅当自上次重新粉刷后有球击中栅栏时,才重新粉刷栅栏


您建议在任何时候将某个区域标记为无效,而应该向应用程序发送
WM_PAINT
消息。这样做的一个大问题是,如果同一区域多次失效,将导致许多
WM_PAINT
消息被发送,并且无法知道其中许多消息已经被处理。因此,当您最需要高性能时(因为您在绘图方面落后),您必须反复重复相同的绘图操作。这没有意义。

另请参见。因此,第一次需要重新绘制区域时,它会被标记为无效,然后如果需要重新绘制同一区域,Windows会检查该区域是否无效,如果无效,Windows将不执行任何操作。当该区域被重新绘制并标记为有效时,需要重新绘制的区域将再次标记为无效。因此,与发送数百条
WM_PAINT
消息不同,只发送一条消息。“这是对的吗?”托尼,很接近。Windows实际上会检查应用程序的消息队列何时为空。您是说Windows何时发送
WM_PAINT
消息?(当消息队列为空时)@Tony说得对。如果区域无效时队列为空,则会立即发送消息。否则,它将延迟到队列为空。您的答案缺少两个关键细节:
WM_PAINT
是一条低优先级消息,对
invalidater
/
InvalidateRgn
的多个调用合并到一个更新区域。