/* * Create By : 李绍良[lsl](zyzx)
* Create Time : 2015-03-14
*/
如图,绘图模块基本上是一些图形运算方面的接口。
绘图模块围绕的中心的是画布:
typedef struct LUI_CANVAS
{
int_t cx; //画布宽
int_t cy; //画布高
int_t bpp; //像素位宽 RGB1555 2字节;RGB8888 4字节
int_t pitch; //行跨距, = cx * bpp
int_t len; //*pData数据长度 = pitch * cy
unsigned char *pData; //申请的内存
}LUI_CANVAS;
其实表征的就是一个bmp图片。像素的格式一般采用RGB1555,与RGB8888格式,两这都可以将透明度信息表示出来。采用RGB1555格式即可以剩下不少内存,也可以降低CPU开销,同时UI设计师也可以相对宽松的选择图片色彩。我们做的几代产品都没有逃脱选用RGB1555格式的命运,在需要支持全屏1920*1080P的分辨率甚至4K界面的分辨率、ARM硬件(甚至很低端)这种条件下,想使用RGB8888简直就是一种奢望。
至于如何绘制基础图形,这个网络上很多。实际项目中也不是我们写的模拟代码,海斯图形处理芯片中有相关的图形加速模块,比这个模拟代码效率高多了。
创建和销毁画布在这里负责,主要是防止某些嵌入式设备图形部分需要使用设备专属内存,而不是随意new出来的。
绘制图片这一块还需要图片打包模块的支持,后面作为一个专题。
绘制文字,有些难度,我们一直使用的是栅格字库(基于效率、使用便利上考虑),也可以扩展使用矢量字库。国际化的界面估计是整个UI体系的最大难点了,我们也只是尽量兼容更多的语言。这部分也后面作为一个专题。
到这里,基础理论差不多了。我们需要在Windows上建立调试环境,则还需要创建一个Win32的demo工程。
demo程序使用的是vs2005直接生成的WIN32程序,也仅仅添加了一个类CWinGraph,插入到了Win32流程中。主要的使用WIN窗口把我们的界面显示出来
主要是在窗口消息处理中简单的加入了这些代码
hdc = BeginPaint(hWnd, &ps);
// TODO: 在此添加任意绘图代码...
int_t cx, cy;
g_pGraph->ScreenSize(&cx, &cy);
g_pGraph->Refresh(0, 0, cx, cy);
EndPaint(hWnd, &ps);
case WM_CREATE:
g_pGraph->Initial(hWnd, DLG_WIDTH, DLG_HEIGHT);
break;
case WM_DESTROY:
g_pGraph->Quit();
PostQuitMessage(0);
break;
代码本身没有使用比较严谨的风格,很多参数和做法后面还会响应的调整,仅以此来表达对接模块需要做的事情。
如下图demo程序跑起来的效果图,虽然简单,但却是基础。