基于qvfb的应用小程序开发

这篇文章其实也不算是原创,看了前辈们的资料加上自己的一些理解。在文章末尾,我提供几篇好的资料。

如果有必要那么我们可以使用qvfb开发自己的GUI图形引擎,qvfb是一个模拟/dev/fb0的framebuffer显示方式的应用程序,使用共享内存,外部程序比如minigui传递数据到qvfb建立的共享内存,之后qvfb将数据刷新到qvfb软件界面上,需要注意的是,qvfb并不是严格意义上的framebuffer,当minigui将数据发送到qvfb的共享内存之后,qvfb并不会立即将修改的数据反应到qvfb的软件界面上,

而是需要外部程序,比如minigui,首先设置qvfb创建的共享空间结构体下面的update矩形失效范围,即(left,top)和(right,bottom),
然后设置qvfb创建的共享空间结构体下面的dirty控制字为1,
这样qvfb检测到drity标志为1后,将取出update中待刷新矩形描述区间,然后将update指定
区间中的数据刷新到qvfb界面上,之后qvfb将共享空间的drity标志置0,同时将update设为无效的(0,0)和(-1,-1)


qvfb的原理很简单,它建立了一个system V共享内存,用户只需将需要显示的图像按像素格式要求放到共享内存里qvfb就可以显示了。
System V共享内存连接的步骤是:

1.通过ftok拿到key
2.使用shmget拿到shmid
3.使用shmat连接到共享内存

这里需要注意的是,key的生成需要向ftok传入一个双方约定好的文件名,对于qvfb屏幕设备,这个文件是/tmp/.qtvfb_mouse-0。

qvfb创建的共享内存包含一个私有的数据头,用于指示像素格式、宽高等信息。这个头结构定义如下:

[cpp]  view plain copy
  1. typedef struct tagrect_t  
  2. {  
  3.     int left;  
  4.     int top;  
  5.     int right;  
  6.     int bottom;  
  7. }RECT_T;  
  8.   
  9. typedef struct tagQVFbHeader  
  10. {  
  11.     int width;              //the width of qvfb screen device  
  12.     int height;             //the height of qvfb screen device  
  13.     int depth;              //the depth of qvfb screen device  
  14.     int linestep;           //length of a line in bytes   
  15.     int dataoffset;         //data in shared memory offset  
  16.     RECT_T update;          //the area to be updated  
  17.     unsigned char dirty;    //update flags,when dirty=1,the area will be updated  
  18.     int numcols;            //number of colors  
  19.     unsigned int clut[256]; //color index  
  20. }QVFBHEADER;  


开发的过程中,我觉得几点比较重要。

1、程序规范

这里的规范不仅仅是风格上面的规范,更重要的为合法性校验,内存泄露问题。

如下代码,我们必须对程序的返回结果进行校验,这样的代码比较健壮。

[cpp]  view plain copy
  1. if(dis_qvfb_init())  
  2. {  
  3. <span style="white-space:pre">  </span>printf("qvfb init error!\n");  
  4.     return -1;  
  5. }  
  6. /*open input device */  
  7. if(open_inputdev())  
  8. {  
  9.     printf("open input device error!\n");  
  10.     return -2;  
  11. }  
在main()函数结束之前,我们必须还close打开的设备文件。

[cpp]  view plain copy
  1. dis_qvfb_exit();  
  2. close_inputdev();  
2、我的main函数里面有一个while(1)函数,在内部不断从鼠标文件中读取鼠标信息,然后显示到qvfb的屏幕设备上。

在做GUI的开发,往往都有这样的一个流程:

a.往数据地址写数据;

b.更新“framebuffer”
如果像不断显示鼠标信息这样的一个应用,则每次写数据之前都要先clear那块区域

这方面的资料相对比较少,在这里连接上一些好资料的原文地址

1、浅析qvfb图像显示原理和鼠标键盘信息获取方法
2、使用qvfb在X11下开发framebuffer应用程序

3、QVFB

4、Linux下framebuffer及qvfb编程示例
5、Framebuffer Driver

在这里附上程序源代码下载链接:http://download.csdn.net/detail/fzu_dianzi/3718774

以上纯属个人学习笔记,如果哪里错了,希望提出。愿和大家一起共同学习,一起进步。我的邮箱地址是:xzy@yingzhi8.com


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值