我正在研究需要禁用WM_ERASEBKGND的程序(以避免闪烁)。如何更新屏幕一旦失去焦点
问题出现在我的主窗口失去焦点时,另一个窗口(另一个程序)获得焦点。
重点(而不是我的程序)的窗口每次通过它时都会使MY程序的窗口无效!结果是,窗口的屏幕在任何另一个窗口经过的地方都变成了白色,之后几乎完全消失。显然,我不能有一个程序,每当它失去焦点时屏幕变白。
即使在我的窗口失去焦点(WM_KILLFOCUS)之后,是否有任何方法可以继续我的窗口的绘制操作(例如继续调用wm_paint)?
我正在研究需要禁用WM_ERASEBKGND的程序(以避免闪烁)。如何更新屏幕一旦失去焦点
问题出现在我的主窗口失去焦点时,另一个窗口(另一个程序)获得焦点。
重点(而不是我的程序)的窗口每次通过它时都会使MY程序的窗口无效!结果是,窗口的屏幕在任何另一个窗口经过的地方都变成了白色,之后几乎完全消失。显然,我不能有一个程序,每当它失去焦点时屏幕变白。
即使在我的窗口失去焦点(WM_KILLFOCUS)之后,是否有任何方法可以继续我的窗口的绘制操作(例如继续调用wm_paint)?
首先,从上面的评论中,从来没有手动发送WM_PAINT
SendMessage
或PostMessage
。使用InvalidateRect
来指示窗口被重新绘制。
关于WM_ERASEBKGND
,返回值用于指示WM_PAINT
处理程序的背景已被擦除,以防涂料过程可以优化。要实际防止背景被删除,请不要致电DefWndProc()
。或者更容易,在窗口类中将hbrBackground
设置为NULL
。
正如其他人提到的重点与重新粉刷无关,并且即使在背景中,您的窗口也应该正常绘画。
你的帮助,你的回答完全引导我走向正确的方向,真棒。 –
即使失去焦点,您仍应继续获取WM_PAINT消息。 WM_ERASEBKGND的技巧是你的WM_PAINT应该覆盖窗口的所有像素。你确定你以这种方式实现了WM_PAINT吗? – Maksee
我认为在WM_ERASEBKGND中返回一个“true”的值会在屏幕失效后停止对WM_PAINT的所有调用(这意味着我不得不通过SendMessage()实现对WM_PAINT的手动调用;因为现在WM_PAINT是当WM_ERASEBKGND被禁用时不会被调用 –
@JamesDiaz:为WM_ERASEBKGND返回true只是告诉Windows你画了自己的背景,所以不会绘制默认的背景,这对WM_PAINT的行为没有影响 –