WindML双缓冲(Double Buffering)总结
来源:互联网 发布:nginx sticky模式 编辑:程序博客网 时间:2024/05/22 03:43
双缓冲的目的是为了不闪烁,下面是从C:\Tornado2.2\target\src\ugl\example\dbuf\wexdbuf.c改造而来的,顺便把键盘鼠标输入和JPEG操作整理了
在: http://www.pudn.com/downloads526/sourcecode/embedded/detail2180188.html 下载
① 双缓冲:
//// JPEG初始化//int ret = 0;ret = JpegInit();if(ret < 0){uglBackgroundColorSet(gc, colorTable[BLACK].uglColor);uglForegroundColorSet(gc, colorTable[LIGHTGREEN].uglColor);uglTextDraw(gc, m0TextCoordinates.x, m0TextCoordinates.y, -1, "JpegInit Error\n");return ;}//// 装载第一幅JPEG图片//ret = JpegFrom("testimg1.jpg", &jpegDdbId1);if(ret < 0){uglTextDraw(gc, m0TextCoordinates.x, m0TextCoordinates.y, -1, "JpegFrom Error\n");return;}//// 装载第二幅JPEG图片//ret = JpegFrom("testimg2.jpg", &jpegDdbId2);if(ret < 0){uglTextDraw(gc, m0TextCoordinates.x, m0TextCoordinates.y, -1, "JpegFrom Error\n");return;}//// 创建两个要翻的页,并准备开始第二个页面上“画”——“活动页”//page[0] = UGL_PAGE_ZERO_ID;page[1] = uglPageCreate(devId);uglPageDrawSet(devId, page[1]);//// 死循环,里面不断画操作、“翻页”//while (1){//将将加载的第一幅JPEG位图,画到“活动页”uglBitmapSizeGet(jpegDdbId1, &jpegWidth, &jpegHeight);uglBitmapBlt(gc, jpegDdbId1, 0, 0, jpegWidth - 1, jpegHeight - 1, UGL_DEFAULT_ID, 0, 0);//将将加载的第二幅JPEG位图,画到“活动页”uglBitmapSizeGet(jpegDdbId2, &jpegWidth, &jpegHeight);uglBitmapBlt(gc, jpegDdbId2, 0, 100, jpegWidth - 1, jpegHeight - 1, UGL_DEFAULT_ID, 100, 100);//画一个大绿色的矩形框到“活动页”uglBackgroundColorSet(gc, colorTable[GREEN].uglColor);uglForegroundColorSet(gc, colorTable[GREEN].uglColor);uglRectangle(gc, rect.left, rect.top, rect.right, rect.bottom);//画一个小一点的黑色的矩形框到“活动页”uglBackgroundColorSet(gc, colorTable[BLACK].uglColor);uglForegroundColorSet(gc, colorTable[BLACK].uglColor);uglRectangle(gc, rect.left + 15, rect.top + 15, rect.right - 15, rect.bottom - 15);//画黄边蓝底的小球到“活动页”uglBackgroundColorSet(gc, colorTable[BLUE].uglColor);uglForegroundColorSet(gc, colorTable[YELLOW].uglColor);uglEllipse(gc, x, y, x + 32, y + 32, 0, 0, 0, 0);//// 文字显示“活动页”当前鼠标位置和键盘的状态//uglBackgroundColorSet(gc, colorTable[BLACK].uglColor);uglForegroundColorSet(gc, colorTable[LIGHTGREEN].uglColor);static char buf[100] = {0};static int k = 0;sprintf(buf, "k= %d, mx= %d, my= %d, key= %d\n", k++, mouse_x, mouse_y, key);uglTextDraw(gc, 100, 100, -1, buf);//// 在循环中不断更新小球的位置,这一段不应该放在画线程中!!// if (x + 32 >= rect.right - 15)xinc = -1;else if (x <= rect.left + 15)xinc = 1;if (y + 32 >= rect.bottom - 15)yinc = -1;else if (y <= rect.top + 15)yinc = 1;x += xinc;y += yinc;//// 开始“翻页”,套用这个框架即可//if (pageIndex == 0){uglPageVisibleSet(devId, page[1]);//显示当前“活动页”uglPageDrawSet(devId, page[0]);//切换到另一个页面为“活动页”pageIndex = 1;}else{uglPageVisibleSet(devId, page[0]);uglPageDrawSet(devId, page[1]);pageIndex = 0;}}//while 结束
② JPEG:
//// 初始化JPEG//int JpegInit(){ UGL_JPEG_MODE jpegMode; int jpegVersion; jpegId = uglJpegInit(devId, &jpegVersion); if (jpegId == UGL_NULL) {return -1;} jpegMode.quality = 75; jpegMode.smooth = 0; jpegMode.scale = 1; uglJpegModeSet(jpegId, &jpegMode);return 1;}//// 从文件中加载JPEG,到一副位图中//int JpegFrom(const char *filename, UGL_DDB_ID *pDdbId){ FILE *fp = fopen(filename, "rb"); if (fp == NULL){return -1;} else{ uglJpegToDDBFromFile (jpegId, fp, pDdbId, UGL_NULL, 0, 0); fclose (fp);}return 1;}
③ 键盘和鼠标输入线程:
//// 键盘和鼠标输入作为一个线程来处理//UGL_LOCAL int getInput(void){ UGL_MSG msg; UGL_STATUS status; int retVal = 0;static int kk = 0;printf("--%d\n", kk++);while(1){status = uglInputMsgGet (inputServiceId, &msg, UGL_NO_WAIT);printf("--%d\n", kk++);if (status != UGL_STATUS_Q_EMPTY){switch(msg.type){case MSG_POINTER://logMsg("Mouse: %d, %d\n", msg.data.pointer.position.x, msg.data.pointer.position.y, 0, 0, 0, 0);mouse_x = msg.data.pointer.position.x;mouse_y = msg.data.pointer.position.y;break;case MSG_KEYBOARD://logMsg("Keyborad: %04x\n", msg.data.keyboard.key, 0, 0, 0, 0, 0);key = msg.data.keyboard.key;break;}}uglOSTaskDelay (2);//一定要有个延时,否则该线程优先级高于界面画线程时,界面画线程将得不到执行!!} return(retVal);}
④ 最后为启动:(因为在cpp文件中,声明时一定要:extern "C" void wexdbuf(); )
void wexdbuf (void){ stopWex = UGL_FALSE;//创建画线程 uglOSTaskCreate("tWindMLDBuf", (UGL_FPTR)windMLExampleDBuf, 110, 0, 10240, 0,0,0,0,0);//等待输入设备创建完毕!!taskDelay(sysClkRateGet());//延时1s//创建输入多线程——该线程优先级高于“画线程”,因为“画线程”为死循环且循环中无延时 taskSpawn("tInput", 105, 0, 10000, (FUNCPTR)getInput, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);}
- WindML双缓冲(Double Buffering)总结
- 双缓冲 Double Buffering
- MFC 双缓冲(double buffering)
- 双缓冲技术:Double Buffering
- Qt的双缓冲技术(double buffering)
- 第五章 Qt双缓冲(double buffering)
- QT-双缓冲技术(Double Buffering)-2
- 双缓冲技术(Double Buffering)-3 .
- 双缓冲技术(Double Buffering)-4
- 5.4 双缓冲技术(Double Buffering)-5
- 5-4 双缓冲技术(Double Buffering)(1、简介和源代码部分)
- 5-4 双缓冲技术(Double Buffering)(2、公有函数实现)
- 5-4 双缓冲技术(Double Buffering)(3、事件处理函数)
- 5-4 双缓冲技术(Double Buffering)(4、私有函数的实现)
- 5-4 双缓冲技术(Double Buffering)(5、类PlotSettings实现)
- 5-4 双缓冲技术(Double Buffering)(1、简介和源代码部分)
- 双缓冲技术(Double Buffering)(1、简介和源代码部分)
- 双缓冲技术(Double Buffering)(1、简介和源代码部分)
- 详细介绍Java的内存管理与内存泄露
- Java像QQ把窗口放到屏幕边缘并隐藏
- asp:Content
- 程序员编程艺术:第三章、寻找最小的k个数
- insertion_sort
- WindML双缓冲(Double Buffering)总结
- 程序员编程艺术:第三章续、Top K算法问题的实现
- jquery mobile使用心得
- java response.setContentType 的参数说明
- DB2数据的导入(Import) 导出(Export)(Load)
- mr_raptor的博客 | 值得学习
- oracle对select加锁方法、锁的查询
- javap(反汇编命令)详解
- Unity NGUI 中文字体