zyzx的小窝

C/C++,GUI,个人移动存储,zyzx_lsl@163.com

 

三、基础绘图模块

/*
 * Create By      : 李绍良[lsl](zyzx)
 * Email            : zyzx_lsl@163.com
 * Create Time  : 2015-03-14
 * 转载请注明来源:http://www.cppblog.com/zyzx
*/
如图,绘图模块基本上是一些图形运算方面的接口。
        绘图模块围绕的中心的是画布:
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窗口把我们的界面显示出来
        主要是在窗口消息处理中简单的加入了这些代码
case WM_PAINT:
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程序跑起来的效果图,虽然简单,但却是基础。
附件是源代码
/Files/zyzx/my_lui_三_基础绘图模块.zip

posted on 2015-03-15 14:08 zyzx 阅读(2202) 评论(0)  编辑 收藏 引用 所属分类: 自己动手写GUI


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(1)

随笔分类

随笔档案

常用链接

搜索

最新评论

阅读排行榜

评论排行榜