显示分辨率更改后表单重绘问题

Fla*_*vio 1 delphi listview vcl repaint

我有一个 Delphi GUI 应用程序,它运行得很好,直到显示分辨率更改自动导致程序的 GUI 窗口被重新绘制。我们可以通过消息捕获这个显示事件WM_DISPLAYCHANGE

在重绘事件中,似乎某些TListView在那一刻隐藏的组件不会被重绘,直到它们再次可见。

似乎仅在表单的可见组件上调用重绘,并且操作系统在不可见的项目再次变得可见时重新绘制它们。

但是,当代码引用消息TListViewWM_DISPLAYCHANGE尚未显示的 a 中的项目时,这会导致问题。内部应该TListView有项目,但TListView.Items.Count返回 0,就好像TListView是空的一样。

在屏幕上显示可见后TListView,一切都会恢复正常,并且我可以再次引用TListView.

我尝试显式调用TListView.Repaint()更新它而不必显示它,但它不起作用。

这是有记录的行为吗?

有没有办法立即重新绘制不可见的表单组件,而不让它在屏幕上可见?

Uwe*_*abe 5

ListView.Items.Count如果没有分配句柄,则返回 0。要使其返回正确的值,请ListView.HandleNeeded立即调用。