Chinaunix首页 | 论坛 | 博客
  • 博客访问: 684475
  • 博文数量: 85
  • 博客积分: 1797
  • 博客等级: 上尉
  • 技术积分: 1238
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 08:53
个人简介

职位:技术总监 1、精通c++(linux平台、vc++Mfc、qt)、java、php、unity3d,略懂python 2、用c++开发过嵌入式产品,用c++开发过大型银行运维产品 3、用java开发大型银行运维产品,学校教务系统 4、用php开发进销存系统(在销售中),用php开发淘宝小程序 5、用unity3d开发衣柜设计软件,在运营中

文章分类

全部博文(85)

分类: 嵌入式

2010-03-17 07:59:23

      第一次接触minigui,是在自己换工作的时候,当时想向梦寐已久的嵌入式操作系统方面发展,看重了一家公司,用的技术就是minigui,面试不能什么都不知道,至少没用过minigui,也要见过minigui。虽然最终没去那家公司,但却揭开了minigui的神秘面纱。minigui的编程,何其似曾相识,就是原始的windows的界面编程。
 
      经过苦苦寻觅,找到了让我可以轻松入手的资料,minigui的vc版本。下面是我的一次调试minigui源码的经历,现在看看笔记记得不是一般的乱。
 
     
      这是一组函数调用关系,下面的分析会用到:
      gc.psd->PutBox-->SIM_linear32_putbox-->SIM_drawpixel-->WIN32_drawpixel-->SetPixel(sdk函数)
 
      下面是完整调用关系,从在屏幕上写数字、位图开始,到调用与windows的函数,因为是移植到vc中的版本,所以屏幕的最终驱动是windows的画点函数。
数字的显示:

      下面是逆序的,SetPixel是结束函数,case MSG_PAINT:是画图消息响应,是开始。

SetPixel(rootdc, x, y, c); 这是windows系统函数,至此结束
WIN32_drawpixel(x, y, c);
SIM_drawpixel(psd, x+j, y+i, *src++);
调用这个SIM_linear32_putbox
此函数在SCREENDEVICE scrdev = {被赋值给结构,以后调用,直接从结构中调用
这个是上面结构的别名typedef struct _screendevice *PSD;以后使用psd
gc.psd->PutBox (gc.psd, x, y, w, h, buf);psd结构包含在gc结构中,被下面调用
return putbox_wrapper (gc, x, y, w, h, buf, w * bytesperpixel (gc));被putbox调用
#define GAL_PutBox (*__mg_cur_gfx->putbox) 定义putbox别名
GAL_PutBox (pdc->gc, x, y, w, h, scaledBitmap);
FillBoxWithBitmap(hdc, x, 0, 0, 0, bmp);
DrawDigit(hdc, seconds, TRUE);
case MSG_PAINT:

位图的加载:

case MSG_CREATE:中myLoadBitmap(&bmpbom,"lei.bmp")
LoadBitmap (HDC_SCREEN, bm, full_path);
#define LoadBitmap LoadBitmapFromFile
LoadMyBitmapFromFile (&myBitmap, pal, file_name)


area = MGUI_RWFromFile (file_name, "rb")
area是个MG_Rwops结构体,里面有位图文件指针,以及位图操作函数
看看上面函数是怎么得到area的:
fp = fopen(file, mode);得到位图文件的句柄
rwops = MGUI_RWFromFP(fp, 1);从句柄中得到rwops也就是area
         rwops->seek = stdio_seek;
         rwops->read = stdio_read;
         rwops->write = stdio_write;
rwops->hidden.stdio.fp = fp;
可见在上面函数中area被填充,包括文件句柄和函数


ret_val = LoadMyBitmapEx (my_bmp, pal, area, ext);
使用area加载位图
load_ret = bitmap_types[type].load (area, my_bmp, pal))
static BITMAP_TYPE_INFO bitmap_types [MAX_BITMAP_TYPES] =
{{ "bmp", __mg_load_bmp,---就是load
进入函数__mg_load_bmp
read_bmfileheader (fp, &fileheader)
#define MGUI_RWread(ctx, ptr, size, n) (ctx)->read(ctx, ptr, size, n)
可见最终调用c库函数read,读取某个字节
      Fread()文件指针会自加:
      The file pointer associated with stream (if there is one) is increased by the number of bytes actually read


fileheader->bfType = fp_igetw(f);
最终取到的位图数据存到bmp->bits中 _MYBITMAP结构
typedef struct _MYBITMAP MYBITMAP;
因bits中所存的数据为4bit的索引值,因此并不是颜色,要将这个进行转化
LoadMyBitmapEx (my_bmp, pal, area, ext);在这个函数转化,将索引值对应颜色表中的值取出放在pBitmap->bmBits中
typedef struct tagBITMAP BITMAP, *PBITMAP sg_bmpDigit
GAL_PutBox (pdc->gc, x, y, w, h, scaledBitmap);
scaledBitmap 就是pBitmap->bmBits
gc.psd->PutBox (gc.psd, x, y, w, h, buf); /* ignore pitch */
      下面是循环结构,最终调用setpixel在特定位置使用buf中的颜色值显示点。也就是前面提到的调用关系:
      gc.psd->PutBox-->SIM_linear32_putbox-->SIM_drawpixel-->WIN32_drawpixel-->SetPixel(sdk函数)


阅读(5109) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~