让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果
2009-01-17 19:39:14 来源:WEB开发网图一:自绘按钮
4.脏处理与区域刷新
我们都知道gdi的绘制效率是不高的,无法像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了局部刷新的参数,而局部刷新也是gdi下进行优化的关键所在。可在实际操作中,我不常看见有人做这么精细的切割,都是一个InvalidateRect(hwnd, NULL, TRUE)了事。这也难怪,我随便TextOut一个字符串,我如果要去关心它占据了多少区域,区域之间的交叉裁剪等等,未免就太繁琐了。所以我的引擎提供了一个ISonicPaint对象,意如其名,就是一块画布。创建这块画布时,你可以指定其拥有自己的memDC,而出于节省gdi对象的考虑,你也可以指定其是一块无memDC的画布,如何取舍根据实际情况。
创建一个画布ISonicPaint * pPaint = GetSonicUI()->CreatePaint();
画布创建之后,只需要在WM_PAINT中调用画面的Draw方法即可,很简单。如果你想在这个画布上做画,就需要像自绘按钮一样,向画布委托一个你自己的绘制过程,以便在每次重绘时调用。示例代码如下:
pPaint->Create(FALSE/*是否需要memDC*/, m_rtString.Width()/*宽*/, m_rtString.Height()/*高*/);
class CTest
如此每次只需要调用pPaint->Redraw()便会进行画布的区域重绘。这里需要说明的是,ISonicString,包括接下来要介绍的几个对象都是基于画布的,也就是说引擎的所有对象都是具有脏处理检查和区域自绘制优化的,可以极大的提高运行效率。
{
public:
void RenderImage(ISonicPaint * pPaint, LPVOID);
};
void CTest::RenderImage(ISonicPaint * pPaint, LPVOID)
{
if(pPaint->GetCurrentPaint() == NULL)
{
return;
}
HDC hdc = pPaint->GetCurrentPaint()->hdc;
int x = pPaint->GetCurrentPaint()->x;
int y = pPaint->GetCurrentPaint()->y;
// draw here
...
}
CTest test;
pPaint->Delegate(DELEGATE_EVENT_PAINT, NULL, &test, CSonicString::RenderImage);
更多精彩
赞助商链接