TImage和TPaintBox都是从TGraphicControl的子类,而不是TWinControl的子类;
Delphi 的继承关系,从TControl类开始处理Windows消息,而Delphi的可视控件都是TControl
的子类,同时Delphi采用的事件驱动机制,而不是消息驱动,比如,可视控件的Left和Top,
当同时改变时消息处理为:
恢复背景,
left, top 改变
在新位置显示
而Delphi的事件处理如下:
left改变->调用SetBounds->子控件Invalidate, Parent Invalidate, self Invalidate
top 改变->调用SetBounds->子控件Invalidate, Parent Invalidate, self Invalidate
......
这仅仅是简单的描述,事实上激发了更多的事件,还有子控件,父控件....
所以采用事件驱动机制会产生更多的无畏重复操作,但是事件驱动比消息处理机制容易理解,
再加上Delphi的类封装,在使用上更简单一些.
对于一般应用,还是尽量使用VCL,对于你的需求,可能难以达到理想的效果.
要减少无畏的处理,尤其是WM_PAINT,WM_NCPAINT,WM_ERASEBKGND灯会引起,重画窗口的消息,
最好的方法就是抛弃Delphi的控件,直接使用Windows API.从你的叙述来看,应用相对简单一些,
使用API也容易控制,只需要调用画图的API即可.
相关的API如下:
BOOL InvalidateRgn(
HWND hWnd, // handle of window with changed update region
HRGN hRgn, // handle of region to add
BOOL bErase // erase-background flag
);
BOOL InvalidateRect(
HWND hWnd, // handle of window with changed update region
CONST RECT *lpRect, // address of rectangle coordinates
BOOL bErase // erase-background flag
);
如果要求更高,只有使用DirectX实现了
很遗憾