在VC里实现长按键时,解决窗口不更新的问题

在修改一个老程序时,发现有这样一个问题,当按下一次向下或向上方向键时窗口里的数据可以向上或向下滚动一条,也会立即更新到窗口里显示。但是,当长按,不弹起按键时,就会发现数据有滚动,但窗口不更新的现象。这种现象就会给客户一种假死的感觉,体验非常不好。为了解决这个问题,仔细地看了一下VC里MFC的消息体系。

为什么一次按下再弹起就可以更新窗口呢?因为这里使用InvalidateRect函数,通知窗口有区域无效了,也就是作了一个标记,但这是Windows并不会立即更新窗口里的数据,等到弹起按键,没有操作时才会处理无效的消息。因此,按一下按键再弹起时,可以更新窗口里的内容,因为窗口后面没有其它消息处理了,可以处理无效消息。

但是当用户长按时,这时系统源源不断地产生按下按键的消息,这时虽然调用InvalidateRect函数,通知系统这个窗口无效,需要更新了,但是因为有不断的按键消息产生,导致系统并不去更新窗口,因此窗口里的数据并不会更新,但程序里计数已经在更新,这样就导致程序内部数据与窗口显示的数据不一样。

通过上面的分析,就明白了按一次和长按的差别。要解决这个问题,必须在InvalidateRect函数调用之后,再调用UpdateWindow函数,这样才可立即更新窗口,也即是让窗口重新绘制一次,这样处理之后就会发现窗口里更新的数据,与程序内部的数据保持一致。

到此,就可以完美地解决这个问题。

 

 

你可能感兴趣的:(Direct3D,c++)