我正在尝试编写一个自定义TGraphicControl后代,允许用户在VCL表单上嵌入SDL渲染表面。这将提供一种在表单中显示SDL动画的简单方法。
显然,使用Paint方法重绘了TGraphicControl。这种情况多久被召唤一次?只有当某些事情发生在使控件无效时,或者还有其他事情可以调用它吗?它如何与自己绘图的东西相互作用?
答案 0 :(得分:6)
当窗口控件在下面重绘时,调用非窗口控件(TGraphicControl)的Paint方法。当处理窗口控件的WM_PAINT消息时会发生这种情况。
窗口控件在其整个区域或部分区域无效时重绘,或者在Z顺序中较高的另一个窗口关闭或移动时重绘,以便窗口暴露并需要重新绘制。
使TGraphicControl无效将计算窗口化父控件的相应部分,并使该部分无效。
如果你需要一个TGraphicControl来重绘自己,那么你需要在它或它的父控件上调用Invalidate。没有其他方法可以重绘。
答案 1 :(得分:1)
问题1:这种情况多久被调用一次?
请参阅答案Mghie:每当父窗口控件处理WM_PAINT消息时
问题2:是吗? 只有当事情发生时 使控件无效,或者在那里 其他称之为的东西?
请参阅答案Mghie:只有当它失效时
问题3:如何做到 与某些事物相互作用 它自己的画?
您必须使用override指令将自己的绘图例程放在TGraphicControl后代的Paint方法中。在Paint方法中绘图不会发送另一个WM-PAINT消息。在Paint方法中,您可以在画布上绘制而无需进入WM-PAINT消息循环。尽可能快地制作您的绘图代码,因为可能会有很多WM-PAINT消息在飞来飞去。如果您的绘图程序需要花费很多时间,那么您的应用程序将显得缓慢/无响应。