-1

我正在尝试编写一个自定义的 TGraphicControl 后代,它允许用户在 VCL 表单上嵌入SDL渲染表面。这将提供一种在表单中显示 SDL 动画的简单方法。

显然,使用 Paint 方法重绘了 TGraphicControl。这多久被调用一次?是仅在发生某些事情使控件无效时,还是有其他事情调用它?它如何与自己绘制的东西相互作用?

4

2 回答 2

6

当下面的窗口控件重绘自身时,将调用非窗口控件(即 TGraphicControl)的 Paint 方法。当处理窗口控件的 WM_PAINT 消息时会发生这种情况。

当窗口控件的整个区域或部分区域已失效时,或者当另一个 Z 顺序较高的窗口关闭或移动时,窗口控件将被重绘,因此该窗口被暴露并需要重绘。

使一个 TGraphicControl 无效会计算窗口化父控件的对应部分,并使这部分无效。

如果您需要一个 TGraphicControl 来重绘自己,那么您需要在它或其父控件上调用 Invalidate。没有其他方法可以导致重绘。

于 2009-02-23T19:22:50.377 回答
1

问题 1:多久调用一次?

查看答案 Mghie:每当父窗口控件处理 WM_PAINT 消息时

问题2:是只有当某些事情发生时才使控件无效,还是有其他事情调用它?

查看答案 Mghie:仅当它无效时

问题 3:它如何与自己绘制的东西相互作用?

您必须将自己的绘图例程放在 TGraphicControl 后代的 Paint 方法中 - 使用覆盖指令。在 Paint 方法中绘图不会发送另一个 WM-PAINT 消息。在 Paint 方法中,您可以在画布上绘图而无需进入 WM-PAINT 消息循环。使您的绘图代码尽可能快,因为可能会有相当多的 WM-PAINT 消息飞来飞去。如果您的绘图程序花费大量时间,您的应用程序将显得迟缓/无响应。

于 2009-02-23T23:36:16.040 回答