模拟MessageBox函数
MessageBox函数,这个Windows编程中的超级猛料,不知道是多少入门者第一次用到的函数。还记得我们第一次在Windows中利用MessageBox输出 “Hello,World!”对话框时新奇的感觉吗?无法统计,这个世界上究竟有多少程序员学习Windows编程是从MessageBox(“Hello,World!”,…)开始的。在我本科的学校,广泛流传着一个词汇,叫做”’Hello,World’级程序员”,意指入门级程序员,但似乎”’Hello,World’级”这个说法更搞笑而形象。
图2 经典的Hello,World! |
图2给出了两种永恒经典的Hello,World对话框,一种只具有”确定”,一种则包含”确定”、”取消”。是的,MessageBox的确有,而且也应该有两类!这完全是由特定的应用需求决定的。
嵌入式系统中没有给我们提供MessageBox,但是鉴于其功能强大,我们需要模拟之,一个模拟的MessageBox函数为:
/****************************************** /* 函数名称: MessageBox /* 功能说明: 弹出式对话框,显示提醒用户的信息 /* 参数说明: lpStr — 提醒用户的字符串输出信息 /* TYPE — 输出格式(ID_OK = 0, ID_OKCANCEL = 1) /* 返回值: 返回对话框接收的键值,只有两种 KEY_OK, KEY_CANCEL /****************************************** typedef enum TYPE { ID_OK,ID_OKCANCEL }MSG_TYPE; extern BYTE MessageBox(LPBYTE lpStr, BYTE TYPE) { BYTE keyValue = -1; ClearScreen(); /* 清除屏幕 */ DisplayString(xPos,yPos,lpStr,TRUE); /* 显示字符串 */ /* 根据对话框类型决定是否显示确定、取消 */ switch (TYPE) { case ID_OK: DisplayString(13,yPos+High+1, ” 确定 “, 0); break; case ID_OKCANCEL: DisplayString(8, yPos+High+1, ” 确定 “, 0); DisplayString(17,yPos+High+1, ” 取消 “, 0); break; default: break; } DrawRect(0, 0, 239, yPos+High+16+4); /* 绘制外框 */ /* MessageBox是模式对话框,阻塞运行,等待按键 */ while( (keyValue != KEY_OK) || (keyValue != KEY_CANCEL) ) { keyValue = getSysKey(); } /* 返回按键类型 */ if(keyValue== KEY_OK) { return ID_OK; } else { return ID_CANCEL; } } |
上述函数与我们平素在VC++等中使用的MessageBox是何等的神似啊?实现这个函数,你会看到它在嵌入式系统中的妙用是无穷的。
总结
本篇是本系列文章中技巧性最深的一篇,它提供了嵌入式系统屏幕显示方面一些很巧妙的处理方法,灵活使用它们,我们将不再被LCD上凌乱不堪的显示内容所困扰。
屏幕乃嵌入式系统生存之重要辅助,面目可憎之显示将另用户逃之夭夭。屏幕编程若处理不好,将是软件中最不系统、最混乱的部分,笔者曾深受其害
>> 本文固定链接: http://www.vcgood.com/archives/1339