Winapi 在WM_PAINT外最小化窗口的绘图是否无害?

Winapi 在WM_PAINT外最小化窗口的绘图是否无害?,winapi,Winapi,如所述,允许在WM_油漆外绘制。当窗口处于最小化状态时,这是否也适用 我做了一些测试,GetDChwnd返回一个设备上下文,即使当窗口最小化时,并且绘制到它也不会引起任何问题,尽管在实践中,由于窗口不可见,当然不会绘制任何内容 这对我来说很好。我问这个问题只是为了了解在WM_PAINT之外画一个最小化的窗口是否无害,或者我是否必须编写代码来检查窗口是否最小化,在这种情况下是否不画图。但是,如果绘制到最小化窗口是无害的,我可以跳过编写此类代码。像Windows这样的成熟平台很有可能会编写代码来阻止

如所述,允许在WM_油漆外绘制。当窗口处于最小化状态时,这是否也适用

我做了一些测试,GetDChwnd返回一个设备上下文,即使当窗口最小化时,并且绘制到它也不会引起任何问题,尽管在实践中,由于窗口不可见,当然不会绘制任何内容


这对我来说很好。我问这个问题只是为了了解在WM_PAINT之外画一个最小化的窗口是否无害,或者我是否必须编写代码来检查窗口是否最小化,在这种情况下是否不画图。但是,如果绘制到最小化窗口是无害的,我可以跳过编写此类代码。

像Windows这样的成熟平台很有可能会编写代码来阻止这种禁止操作。但是说明中说,绘制只应响应WM_PAINT消息,您应该遵守这一点。否则,如果程序出现错误,你就没有立足之地了


对于爱好编程来说,这并不重要。对于商业编程来说,这可能意味着被起诉与未被起诉的损害赔偿之间的区别。

当然,你可以在WM paint之外画画。WM_PAINT被发送到您的窗口,以指示必须重新绘制窗口的某些区域。例如,当另一个类似对话框的窗口弹出到您的窗口,然后被删除

在WM paint之外绘制有许多合法的情况,例如,您需要更新某种类型的动画

请记住,所有绘图命令都受剪裁区域的约束,在这些区域之外它们没有任何效果


注意:这适用于在实际窗口上绘图,在内存位图和打印机上下文上绘图可以随时进行。

这是无害的,尽管毫无意义。你应该尽量避免把cpu周期浪费在这些无用的东西上。问题是,即使在最小化窗口的情况下,我也需要绘制备份存储位图。因此,唯一实际的窗口绘图是从备份存储位图到窗口DC的单个BitBlt或StretchBlt调用。当窗口最小化时,如果BitBlt和StretchBlt归结为NOP,那么这是对我可以忍受的cpu周期的浪费。更大的浪费是最小化时绘制备份存储位图,但我不能跳过它,因为我的特殊程序设计。因此,了解StretchBlt在最小化窗口DC上使用时是否会实际执行任何拉伸,或者这样的调用是否只是一个NOP……因为如果它执行任何实际拉伸,那么当然不在最小化窗口DCs上调用它以节省cpu周期是有意义的。您不能在这里获得保修,您必须进行测试。这是意外的方式,也发生在C++代码中。再次看到我的原始帖子。MSDN明确表示允许在WM_PAINT之外绘图。您认为该程序会产生什么样的错误?MS可能会发布一个新版本的Windows,而该程序在该版本上的行为不正确。如果未按照说明编写,则您对Microsoft没有追索权,您自己的客户也对您有追索权。Microsoft无法发布新版本的Windows,因为根据文档编写的代码突然中断。在WM_PAINT消息处理程序之外进行渲染不会违反该约定。谢谢,但请再次查看我的原始问题。这个问题特别是关于在WM_PAINT外部绘制最小化的窗口。您是在实际窗口上下文上绘制,还是在备份存储上绘制,您是在窗口上绘制。在前一种情况下,命令会被忽略,而在后一种情况下,你可以安全地这样做。首先,我绘制到后备存储,它是一个DIB部分,然后根据窗口尺寸是否匹配后备存储尺寸,使用BitBlt或StretchBlt将后备存储绘制到窗口。因此,第一次调用并不重要,因为它不是在任何实际窗口上绘制的。第二次呼叫将导致NOP.Ok。那StretchBlt呢?它会先计算拉伸,然后跳过闪电,还是因为窗口最小化,所以整个调用只是一个NOP?如果它在任何情况下都计算了拉伸,那么在最小化窗口以节省cpu周期时不调用它是有意义的。如果整个调用都是NOP,那么就可以在不浪费太多cpu的情况下调用它。