WEB开发网
开发学院软件开发VC 让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果... 阅读

让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果

 2009-01-17 19:39:14 来源:WEB开发网   
核心提示: 图一:自绘按钮4.脏处理与区域刷新我们都知道gdi的绘制效率是不高的,无法像DDraw直接操作显存buffer那么爽快,让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果(4),所以InvalidateRect才提供了局部刷新的参数,而局部刷新也是gdi下进行优化的关键所在,包括接

让UI开发轻松而快乐,用SonicUI引擎实现常见UI效果

图一:自绘按钮

4.脏处理与区域刷新

我们都知道gdi的绘制效率是不高的,无法像DDraw直接操作显存buffer那么爽快,所以InvalidateRect才提供了局部刷新的参数,而局部刷新也是gdi下进行优化的关键所在。可在实际操作中,我不常看见有人做这么精细的切割,都是一个InvalidateRect(hwnd, NULL, TRUE)了事。这也难怪,我随便TextOut一个字符串,我如果要去关心它占据了多少区域,区域之间的交叉裁剪等等,未免就太繁琐了。所以我的引擎提供了一个ISonicPaint对象,意如其名,就是一块画布。创建这块画布时,你可以指定其拥有自己的memDC,而出于节省gdi对象的考虑,你也可以指定其是一块无memDC的画布,如何取舍根据实际情况。

创建一个画布ISonicPaint * pPaint = GetSonicUI()->CreatePaint();
pPaint->Create(FALSE/*是否需要memDC*/, m_rtString.Width()/*宽*/, m_rtString.Height()/*高*/);
画布创建之后,只需要在WM_PAINT中调用画面的Draw方法即可,很简单。如果你想在这个画布上做画,就需要像自绘按钮一样,向画布委托一个你自己的绘制过程,以便在每次重绘时调用。示例代码如下:

class CTest
{
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);
如此每次只需要调用pPaint->Redraw()便会进行画布的区域重绘。这里需要说明的是,ISonicString,包括接下来要介绍的几个对象都是基于画布的,也就是说引擎的所有对象都是具有脏处理检查和区域自绘制优化的,可以极大的提高运行效率。

上一页  1 2 3 4 5  下一页

Tags:UI 开发 轻松

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接