为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

杭州斯凯SDK教程_提高篇

2011-08-29 50页 doc 463KB 24阅读

用户头像

is_202102

暂无简介

举报
杭州斯凯SDK教程_提高篇 SDK开发教程提高篇 修订历史记录 日期 版本 说明 作者 2008-12-19 初稿 黄孙波 目录 TOC \o "1-3" \h \z \u 一、 引言 5 1.1、 编写目的 5 1.2、适用范围 5 1.3、 定义、首字母缩写词和缩略语 5 1.4、读者范围 5 1.5、SDK简介 5 二、 文件系统 6 2.1文件创建和打开 6 2.2文件关闭 8 2.3文件seek 9 2.4文件写入 10 2.5文件读取 11 2.6文件删除 12 2.7获取文件长度 13 2.8创建文件夹 14 2.9删除文件夹 15 ...
杭州斯凯SDK教程_提高篇
<杭州斯凯网络科技有限公司 > <杭州斯凯网络科技有限公司 > SDK开发教程提高篇 修订历史记录 日期 版本 说明 作者 2008-12-19 <0.1> 初稿 黄孙波 目录 TOC \o "1-3" \h \z \u 一、 引言 5 1.1、 编写目的 5 1.2、适用范围 5 1.3、 定义、首字母缩写词和缩略语 5 1.4、读者范围 5 1.5、SDK简介 5 二、 文件系统 6 2.1文件创建和打开 6 2.2文件关闭 8 2.3文件seek 9 2.4文件写入 10 2.5文件读取 11 2.6文件删除 12 2.7获取文件长度 13 2.8创建文件夹 14 2.9删除文件夹 15 2.10获取文件状态 16 2.11 目录遍历 17 2.11.1开始遍历 18 2.11.2继续遍历 19 2.11.3停止遍历 20 三、 本地UI和扩展窗体使用 21 3.1对话框 21 3.1.1创建对话框 21 3.1.2刷新对话框 22 3.1.3销毁对话框 22 3.1.4对话框事件 23 3.1.5对话框使用举例 23 3.2文本框 27 3.2.1创建对话框 27 3.2.2刷新文本框 28 3.2.3销毁文本框 28 3.2.4文本框事件 29 3.2.5文本框使用举例 29 3.3编辑框 33 3.3.1创建编辑框 33 3.3.2获取编辑框内容 33 3.3.3销毁编辑框 34 3.3.4编辑框事件 34 3.3.5编辑框使用举例 35 3.4菜单 40 3.4.1创建菜单 40 3.4.2设置菜单 41 3.4.3显示菜单 41 3.4.4刷新菜单 41 3.4.5销毁菜单 42 3.4.6菜单事件 42 3.4.7菜单使用举例 42 3.5扩展窗体 47 3.5.1创建扩展窗体 48 3.5.2窗口事件 48 3.5.3按键事件 48 3.5.4扩展窗体使用举例 48 四、 图片高级接口使用 51 4.1 256色图片使用方法 51 4.1.1添加256色bmp图片资源方法 51 4.1.2从mrp包里面加载256色bmp图片方法 52 4.1.3 256色bmp图片显示方法 54 4.1.4 256色bmp图片释放方法 57 4.2 jpg图片使用方法 58 4.2.1添加jpg图片资源方法 59 4.2.2从mrp包里面加载jpg图片方法 59 4.2.3 jpg图片显示方法 60 4.2.4 jpg图片释放方法 62 4.3 gif图片使用方法 64 4.3.1添加gif图片资源方法 64 4.3.2从mrp包里面加载gif图片方法 65 4.3.3 gif图片显示方法 66 4.3.4 gif图片释放方法 68 4.4图片旋转实现方法 70 4.4.1 图片旋转接口 70 4.4.2 图片旋转使用方法 71 4.4.3 图片旋转效果 74 五、 屏幕缓冲区使用 76 5.1 获取屏幕缓冲区指针 76 5.2 设置屏幕缓冲区 76 5.3 屏幕缓冲区使用举例 77 六、 长按键功能 79 6.1 长按键实现原理 79 6.2 长按键实现方法 79 1、​ 引言 1.1、​ 编写目的 为了使与杭州斯凯合作的CP公司进一步熟悉我们的SDK开发环境,特编写此提高教程。 1.2、适用范围 适合那些刚刚与杭州斯凯合作公司渠道软件产品开发工程师。 1.3、​ 定义、首字母缩写词和缩略语 SDK:杭州斯凯网络科技有限公司的软件开发环境。 1.4、读者范围 各CP公司开发人员;本公司开发人员也可以参考。 1.5、SDK简介 杭州斯凯的SDK开发环境是一个标准的C语言开发环境, 我们已经将手机平台的底层相关功能统一封装成标准的C语言数,只要用户熟悉C语言开发,那么就可以像在Windows一样使用标准C语言进行开发应用。 2、​ 文件系统 在软件开发过程中,我们经常需要将内存中的数据保存到文件中,或者从文件读取保存的配置信息,因此,我们需要了解SDK上的文件创建、打开、读取、写入、seek等操作接口。 下面我们将详细介绍文件系统的各个接口以及使用方法,需要注意的一点是这里描述的所有文件操作,其所对应的根目录是SDK的工作目录,通常为C:\mythroad,目前我们的SDK暂时不提供操作目录切换到其他盘的接口。 2.1文件创建和打开 SDK中,我们通过mrc_open接口来实现文件创建和打开功能,其函数原型如下所示: filename是要创建或者打开的文件名,mode为文件打开模式,其类型有: MR_FILE_RDONLY:只读方式打开 MR_FILE_WRONLY:只写方式打开 MR_FILE_RDWR:读写方式打开 MR_FILE_CREATE:如果文件不存在就创建文件,需要与上述三种情况组合使用,不能单独使用。 当我们需要创建文件的时候,可以通过如下代码来实现: 如果只是想打开文件,而不想创建新的文件,那么可以通过如下代码来实现: 当 mrc_open调用成功的时候,返回一个非NULL的文件句柄,否则返回NULL。 2.2文件关闭 当我们通过mrc_open接口来打开文件以后,当不再需要对打开的文件进行操作以后,必须要关闭先前打开的文件,否则会造成文件句柄泄露,而导致后续文件打开操作失败。关闭文件操作,是通过mrc_close函数来实现的,其函数原型如下所示: f是先前打开的文件句柄。 具体关闭方法可以通过如下代码来实现: 当函数返回MR_SUCCESS,文件关闭成功,否则文件关闭失败。 2.3文件seek 当我们成功打开一个以后,通过会对文件进行读写操作,在进行读写文件之后,我们需要确定文件读写的开始位置,否则对文件进行的读写操作结果会与预期的不一样。SDK中,我们是通过mrc_seek函数来修改文件读写操位置,其函数原型如下所示: f是打开的文件句柄,pos为文件位置,method为seek方法,有三种: MR_SEEK_SET:文件读写位置从文件开始位置移动pos个长度; MR_SEEK_CUR:文件读写位置移动到以当前位置为起点,相当pos长度的新位置; MR_SEEK_END:文件读写位置从文件结尾位置移动pos个长度; 具体seek方法可以通过如下代码来实现: 当函数返回MR_SUCCESS,文件seek成功,否则文件seek失败。 2.4文件写入 当我们成功修改了文件读写位置以后,我们就可以将内存中数据写入到文件指定的位置。SDK中,我们是通过mrc_write函数来进行文件写入操作,其函数原型如下所示: f是打开的文件句柄,p为要写入的数据指针,l为写入的数据长度。 具体写入方法可以通过如下代码来实现: 当函数返回MR_FAILED表示写入文件失败,否则返回实际写入的字节数。 注意:mrc_write函数的返回值可能小于实际要写入的字节数,应用必须处理这种情况。 2.5文件读取 当我们成功修改了文件读写位置以后,我们就可以将文件中的数据读取到内存中。SDK中,我们是通过mrc_read函数来进行文件读取操作,其函数原型如下所示: f是打开的文件句柄,p为要读取的内存缓冲区,l为读取的数据长度。 具体读取方法可以通过如下代码来实现: 当函数返回MR_FAILED读取文件失败,否则返回实际读取的字节数。 注意:mrc_read函数的返回值可能为0或者小于实际要写入的字节数,应用必须处理这种情况。 2.6文件删除 当我们不再需要某个文件的时候,我们通常会对它进行删除操作。SDK中,我们是通过mrc_remove函数来进行文件删除操作,其函数原型如下所示: filename是要删除的文件名。 具体文件删除方法可以通过如下代码来实现: 当函数返回MR_SUCCESS删除文件成功,否则删除文件失败。 2.7获取文件长度 当我们需要把某个文件内容全部读取进来的时候,通常需要根据文件大小来分配内存缓冲区。SDK中,我们是通过mrc_getLen函数来获取文件长度,其函数原型如下所示: filename是要获取长度的文件名。 具体获取文件长度方法可以通过如下代码来实现: 当函数返回MR_FAILED获取文件长度失败,否则获取文件长度成功。 2.8创建文件夹 在程序里面,我们通常需要把本应该的相关数据保存到属于该应用的文件夹里面,因此需要用到文件夹创建相关接口。SDK中,我们是通过mrc_mkDir函数来进行创建文件夹操作,其函数原型如下所示: name是要创建的文件夹名称。 具体文件夹创建方法可以通过如下代码来实现: 当函数返回MR_SUCCESS创建文件夹成功,否则创建文件夹失败。 2.9删除文件夹 SDK中,我们是通过mrc_rmDir函数来进行文件读取操作,其函数原型如下所示: name是要删除的文件夹名称。 具体文件夹创建方法可以通过如下代码来实现: 当函数返回MR_SUCCESS创建文件夹成功,否则创建文件夹失败。 删除文件夹的时候,也会把文件中的文件和子文件夹删除掉。 2.10获取文件状态 在SDK中,我们是通过mrc_fileState函数来获取文件的状态,其函数原型如下所示: filename是要获取状态的文件或文件夹名称。 具体获取文件状态方法可以通过如下代码来实现: 当函数返回MR_IS_FILE表示文件,返回MR_IS_DIR表示文件夹,返回MR_IS_INVALID表示无效,既不是文件也不是文件夹。 2.11 目录遍历 在应用开发过程中,有时候我们需要获取某个目录的详细文件信息,这时候就需要用到目录遍历的相关接口,SDK也提供相应的接口。需要注意的是,SDK的目录遍历接口不支持递归遍历,只会编译当前目录,不会自动遍历子目录。 SDK中,目录遍历分成三个步骤,分成开始遍历、继续遍历和停止遍历,分别由三个接口来实现,下面我们将详细介绍其使用方法。 2.11.1开始遍历 开始目录遍历的方法,是通过mrc_findStart函数来实现的,该函数的原型如下所示: name是要遍历的文件夹名称,buffer用来存放第一个目录搜索结果,len为buffer长度。 开始遍历的具体方法可以通过如下代码来实现: 当函数返回MR_FAILED表示开始遍历失败,当返回值大于0,说明遍历成功,该返回值为目录遍历的句柄,需要保存起来,继续遍历的时候会用到。需要注意的是,返回的buf内容可能为“.”。 2.11.2继续遍历 目录继续遍历的方法,是通过mrc_findGetNext函数来实现的,该函数的原型如下所示: search_handle是已经打开的目录搜索句柄,buffer用来存放目录搜索结果,len为buffer长度。 继续遍历的具体方法可以通过如下代码来实现: 当函数返回MR_SUCCESS表示继续遍历成功,当返回MR_FAILED说明遍历失败或者遍历结束。需要注意的是,返回的buf内容可能为“..”。 2.11.3停止遍历 当遍历结束或者发生错误的时候,需要调用停止遍历接口释放相关资源。停止遍历的方法,是通过mrc_findStop函数来实现的,该函数的原型如下所示: search_handle是已经打开的目录搜索句柄。 停止遍历的具体方法可以通过如下代码来实现: 当函数返回MR_SUCCESS表示停止遍历成功,当返回MR_FAILED说明停止遍历失败。 注意:当遍历结束的使用一定要调用mrc_findStop函数来释放相关资源,否则会造成资源泄露。 3、​ 本地UI和扩展窗体使用 在应该开发过程中,我们有时候需要用到手机本身自带的一些控件,如对话框、文本框、编辑框、菜单等,我们统一称呼为本地UI;同样的,有时候我们需要创建一个扩展窗体。 3.1对话框 在应用中,有时候需要利用对话框提示用户,这时候可以用手机本身自带的对话框来提示用户,不需要应用自己去绘制窗口界面。 3.1.1创建对话框 在SDK中,我们通过mrc_dialogCreate函数来创建对话框,该函数的原型如下所示: title是对话框的标题,text是对话框显示文字内容,type是对话框的类型,有三种类型可以选择: MR_DIALOG_OK:对话框有“确定”按钮; MR_DIALOG_OK_CANCEL:对话框有“确定”和“取消”按钮; MR_DIALOG_CANCEL:对话框有“返回”按钮。 Title和text都是unicode编码,网络字节顺序。 当函数返回正整数表示对话框创建成功,当返回MR_FAILED说明对话框创建失败。 3.1.2刷新对话框 当对话框界面需要重新绘制的时候,我们通过mrc_dialogRefresh函数来刷新对话框,该函数的原型如下所示: dialog 是需要刷新的对话框句柄,title是对话框的标题,text是对话框显示文字内容,type是对话框的类型,有三种类型可以选择: MR_DIALOG_OK:对话框有“确定”按钮; MR_DIALOG_OK_CANCEL:对话框有“确定”和“取消”按钮; MR_DIALOG_CANCEL:对话框有“返回”按钮。 Title和text都是unicode编码,网络字节顺序。 3.1.3销毁对话框 当对话框使用完毕的时候,我们需要通过调用mrc_dialogRelease函数来销毁对话框,该函数的原型如下所示: dialog 是需要销毁的对话框句柄。 注意:对话框使用完成以后,必须调用mrc_dialogRelease来销毁,否则会造成资源泄露,导致sky的下载平台applist异常。 3.1.4对话框事件 在对话框界面进行确定或取消操作,SDK会通过mrc_appEvent返回相应的事件类型,其中code值为MR_DIALOG_EVENT,param0值可能为MR_DIALOG_KEY_OK和MR_DIALOG_KEY_CANCEL,当用户点击确定param0值为MR_DIALOG_KEY_OK,点击取消param0值为MR_DIALOG_KEY_CANCEL。 3.1.5对话框使用举例 下面我们举例说明对话框的各个接口使用方法,这里我们把对话框加入到窗口系统中使用。 1.​ 创建窗口 2.​ 窗口事件处理 3.​ 按键事件处理 4.对话框接口相关实现 创建对话框: 刷新对话框: 销毁对话框: 窗口效果: 3.2文本框 在应用中,有时候需要利用文本框来显示文本信息,这时候可以用手机本身自带的文本框来显示,不需要应用自己去绘制窗口界面。 3.2.1创建对话框 在SDK中,我们通过mrc_textCreate函数来创建文本框,该函数的原型如下所示: title是文本框的标题,text是文本框显示文字内容,type是文本框的类型,有三种类型可以选择: MR_DIALOG_OK:对话框有“确定”按钮; MR_DIALOG_OK_CANCEL:对话框有“确定”和“取消”按钮; MR_DIALOG_CANCEL:对话框有“返回”按钮。 Title和text都是unicode编码,网络字节顺序。 当函数返回正整数表示文本框创建成功,当返回MR_FAILED说明文本框创建失败。 3.2.2刷新文本框 当文本框界面需要重新绘制的时候,我们通过mrc_textRefresh函数来刷新文本框,该函数的原型如下所示: handle是需要刷新的文本框句柄,title是文本框的标题,text是文本框显示文字内容。 3.2.3销毁文本框 当文本框使用完毕的时候,我们需要通过调用mrc_textRelease函数来销毁文本框,该函数的原型如下所示: text是需要销毁的文本框句柄。 注意:文本框使用完成以后,必须调用mrc_textRelease来销毁,否则会造成资源泄露,导致sky的下载平台applist异常。 3.2.4文本框事件 在文本框界面进行确定或取消操作,SDK会通过mrc_appEvent返回相应的事件类型,其中code值为MR_DIALOG_EVENT,param0值可能为MR_DIALOG_KEY_OK和MR_DIALOG_KEY_CANCEL,当用户点击确定param0值为MR_DIALOG_KEY_OK,点击取消param0值为MR_DIALOG_KEY_CANCEL。 3.2.5文本框使用举例 下面我们举例说明文本框的各个接口使用方法,这里我们把文本框加入到窗口系统中使用。 1创建窗口 2窗口事件处理 3按键事件处理 4 文本框接口相关实现 创建文本框: 刷新文本框: 销毁文本框: 窗口效果: 3.3编辑框 在应用中,有时候需要利用编辑框来让用户输入信息,这时候可以用手机本身自带的编辑框来实现用户信息输入。 3.3.1创建编辑框 在SDK中,我们通过mrc_editCreate函数来创建编辑框,该函数的原型如下所示: title是编辑框的标题,text是编辑框显示文字内容,type是编辑框输入法的类型,有三种类型可以选择: MR_EDIT_ANY:可以输入任何字符; MR_EDIT_NUMERIC:输入数字; MR_EDIT_PASSWORD:输入密码,用“*”表示; Max_size:编辑框最多可以输入字符数,unicode编码格式。 Title和text都是unicode编码,网络字节顺序。 当函数返回正整数表示编辑框创建成功,当返回MR_FAILED说明编辑框创建失败。 3.3.2获取编辑框内容 当用户输入完成以后,我们需要获取用户输入的信息内容,可以通过mrc_editGetText函数来获取编辑框内容,该函数的原型如下所示: edit是编辑框句柄。 当返回非NULL指针,获取编辑框内容成功,否则获取编辑框内容失败,获取的编辑框内容是unicode编码。 3.3.3销毁编辑框 当编辑框使用完毕的时候,我们需要通过调用mrc_editRelease函数来销毁编辑框,该函数的原型如下所示: edit是需要销毁的编辑框句柄。 注意:编辑框使用完成以后,必须调用mrc_editRelease来销毁,否则会造成资源泄露,导致sky的下载平台applist异常。 3.3.4编辑框事件 在编辑框界面进行确定或取消操作,SDK会通过mrc_appEvent返回相应的事件类型,其中code值为MR_DIALOG_EVENT,param0值可能为MR_DIALOG_KEY_OK和MR_DIALOG_KEY_CANCEL,当用户点击确定param0值为MR_DIALOG_KEY_OK,点击取消param0值为MR_DIALOG_KEY_CANCEL。 3.3.5编辑框使用举例 下面我们举例说明文本框的各个接口使用方法,这里我们把文本框加入到窗口系统中使用。 创建窗口 窗口事件处理 按键事件处理 编辑框接口相关实现 创建编辑框: 获取编辑框内容: 销毁编辑框: 窗口效果: 3.4菜单 在应用中,有时候需要利用菜单来显示可以选择的列表,这时候可以用手机本身自带的菜单来显示,不需要应用自己去绘制窗口界面。 3.4.1创建菜单 在SDK中,我们通过mrc_menuCreate函数来创建文本框,该函数的原型如下所示: title是文本框的标题,num是菜单项个数。 当函数返回正整数表示菜单创建成功,当返回MR_FAILED说明菜单创建失败。 3.4.2设置菜单 当菜单创建好以后,我们需要对菜单项进行设置,我们可以通过mrc_menuSetItem函数来设置菜单项,该函数的原型如下所示: menu是需要设置的菜单框句柄,text是菜单向的显示内容,index是菜单项的序号,从0开始。 该接口每次只可以设置一个菜单项,菜单的每个菜单向项必须先设置过才能正常显示内容的。 3.4.3显示菜单 当设置好菜单的每个菜单项以后,我们通过mrc_menuShow函数来显示菜单,该函数的原型如下所示: menu是需要显示的菜单句柄。 3.4.4刷新菜单 当菜单界面需要重新绘制的时候,我们通过mrc_menuRefresh函数来刷新菜单框,该函数的原型如下所示: menu是需要刷新的菜单句柄。 3.4.5销毁菜单 当菜单使用完毕的时候,我们需要通过调用mrc_menuRelease函数来销毁菜单,该函数的原型如下所示: menu是需要销毁的菜单句柄。 注意:菜单使用完成以后,必须调用mrc_menuRelease来销毁,否则会造成资源泄露,导致sky的下载平台applist异常。 3.4.6菜单事件 当用户在菜单界面进行选择操作,SDK会通过mrc_appEvent返回相应的事件类型,其中code值为MR_MENU_SELECT,param0值选择菜单的序号,第一个菜单项的序号为0;当用户在菜单界面进行取消操作, 返回code值为MR_MENU_RETURN。 3.4.7菜单使用举例 下面我们举例说明菜单的各个接口使用方法,这里我们把菜单加入到窗口系统中使用。在这里我们创建了一个具有两个菜单项的菜单,用户选择一个菜单以后销毁菜单,显示用户所选择的菜单项序号。 1.创建窗口 2.窗口事件处理 3.按键事件处理 4 .菜单接口相关实现 创建菜单: 设置菜单: 显示菜单: 刷新菜单: 销毁菜单: 选择菜单刷新界面: 窗口效果: 选择菜单项二: 3.5扩展窗体 在应用中,如果需要在文本框、对话框、菜单等本地ui的界面上再创建新的,这时候不能简单通过调用mrc_winNew来创建新窗体,这样的创建的窗体是无法正常接收按键、触摸屏事件,而是需要通过调用mrc_platWinNew来创建扩展窗体。 3.5.1创建扩展窗体 在SDK中,我们通过mrc_platWinNew函数来创建文本框,该函数的原型如下所示: windata是窗体数据,winEvent是窗体窗口事件处理函数,keyEvent是窗体按键事件处理函数。 mrc_platWinNew使用方法与mrc_winNew函数类似。 3.5.2窗口事件 扩展窗体的窗口事件与由mrc_winNew创建的普通窗体事件处理流程一样。 3.5.3按键事件 扩展窗体的按键、触摸屏事件与由mrc_winNew创建的普通窗体事件处理流程一样。 3.5.4扩展窗体使用举例 下面我们举例说明扩展窗体的使用方法。在这里我们创建了一个扩展窗体,窗体界面上就显示了一句字符串,当用户按下左软键,就销毁扩展窗体。 1.创建窗口 2.窗口事件处理 3.按键事件处理 4 .其他 创建菜单: 窗口效果: 4、​ 图片高级接口使用 在这个章节我们将介绍一下256色bmp图片的使用方法、jpg和gif图片的间接显示方法以及图片旋转的使用方法。 4.1 256色图片使用方法 这里我们将以添加、加载、显示和释放一张名称为plane.bmp256的图片为例子来讲解256色图片的详细使用方法。 4.1.1添加256色bmp图片资源方法 由于SDK对256色的bmp图片处理方法与普通的16bit bmp图片不一样,因此对于256色图片的命名有特殊要求,不能以.bmp为扩展名,我们统一将其扩展名定为“.bmp256”,因此资源的添加方法提如下图所示: 当我们编译mpr工程文件的时候,如果图片被成功打包到mrp文件中,那么在编译完成的时候,会有提示信息,如下图所示: 当要添加的图片不存在的时候,编译器报编译错误,如下图所示: 当编译通过,并且编译输出有看到图片被成功打包进mrp包里面,说明我们完成了在mpr工程文件里面增加图片的功能。 4.1.2从mrp包里面加载256色bmp图片方法 256色bmp图片的加载方法,与普通bmp图片的加载方法是不一样的。不是通过调用mrc_readFileFromMrpEx函数来实现,而是通过mrc_bmpLoadFromMrp函数来实现。具体方法如下面代码所示: 在加载256色bmp图片的时候,我们需要通过 mrc_bmpLoadFromMrp来从mrp中读取先前打包进去的图片。mrc_bmpLoadFromMrp函数的原型如下: 它的功能就是从当前运行的mrp包里面加载文件名为filename的文件,当加载256色bmp图片文件成功以后,返回一个BMP结果指针,加载失败返回NULL指针。BMP结构体具体定义的地方在mrc_bmp.h文件里面。这里我们把加载的数据保存到bmp变量里面,该变量是一个T_BMP_ICON_MAP类型的指针变量,T_BMP_ICON_MAP结构体定义如下: 4.1.3 256色bmp图片显示方法 当我们成功把图片加载内存里面以后,接下来就需要把图片显示出来。与普通的bmp图片显示方法不同,256色的bmp图片有自己的显示方法。具体的显示方法如下: 显示的图片效果如下: 在该图片显示Show256Bmp函数里面,我们使用了图片加载方法Load256Bmp函数返回的数据结构T_BMP_ICON_MAP。该种图片显示方法就是通过调用mrc_bmpShow函数来实现图片显示。该函数的原型如下: 参数hBMP为图片数据,x、y为图片显示的起始坐标, w、h为图片显示宽度和高度,sx、sy为原始图片中的坐标位置,rop为图片显示效果,其类型主要有BM_COPY和BM_TRANSPARENT。在Show256Bmp函数里面rop的参数值为BM_COPY,即覆盖模式,图片中所有的数据都会显示出来,而BM_TRANSPARENT模式为透明色模式,图片的第一个像素为透明色,图片中与第一个像素相同颜色值的点不会显示处理。而在程序里面,我们经常需要进行透明色显示,例如plane.bmp256图片,其实我们只想实现飞机本身部分而不显示红色背景。 下面我们就通过修改mrc_bmpShow函数中的rop参数值来显示透明色图片,调用mrc_bmpShow函数的代码修改为: 那么图片显示的效果如下图所示: 通过上图,我们可以明显看出图片效果发生变化。但是需要注意的是,不同图片显示模式绘制过程所需要花费的时间有很大差异,其中BM_COPY模式是最节约时间,BM_TRANSPARENT和其他模式由于在图片绘制过程中需要进行大量运算,相对BM_COPY模式需要花费更多的时间。因此,在软件开发过程中应该尽量使用BM_COPY模式。 4.1.4 256色bmp图片释放方法 当图片使用完成以后,我们需要释放加载的图片所占用的内存资源。 与16bit的bmp图片一样,256色bmp图片也需要对相应的资源进行释放,只是调用的接口不一样,具体的释放方法如下: 对于256色bmp图片,我们是通过mrc_bmpFree函数来释放资源的。 mrc_bmpFree函数的原型如下: 到这里,我们将详细介绍了256色bmp图片的整个使用流程。 需要说明的是,256色的bmp图片相对与16bit图片的优点是打包之后占用的磁盘空间比较小,但是其图片的绘制过程比16bit的bmp要花费更多的CPU时间。因此,在应用开发过程中,需要根据具体的情况来选择bmp图片的格式。 4.2 jpg图片使用方法 由于jpg图片是经过压缩的,它的显示过程需要进行解压操作,我们的SKD暂时不支持直接显示方法,但是支持将jpg图片转换成bmp格式,然后我们可以直接调用bmp显示接口来实现jpge图片。这里我们将以添加、加载和显示文件名为focus.jpg的jpg图片为例,来说明jpg图片的使用方法。 4.2.1添加jpg图片资源方法 jpg图片添加方法与普通的bmp图片添加方法一样,添加方法提如下图所示: 当我们编译mpr工程文件的时候,如果图片被成功打包到mrp文件中,那么在编译完成的时候,会有提示信息,如下图所示: 当要添加的图片不存在的时候,编译器报编译错误,如下图所示: 当编译通过,并且编译输出有看到图片被成功打包进mrp包里面,说明我们完成了在mpr工程文件里面增加图片的功能。 4.2.2从mrp包里面加载jpg图片方法 jpg的图片加载方法,与普通16bit的bmp加载方法一样,可以通过调用mrc_readFileFromMrpEx函数来实现,具体方法如下面代码所示: 从LoadJpg函数可以看出来,与16bit的bmp一样,我们使用一个 T_ICON_MAP类型的指针变量jpg来保存加载的jpg图片。 4.2.3 jpg图片显示方法 由于我们的SDK目前直接显示jpg图片的接口,因此我们这里使用到了图片格式转换的接口,即mrc_Img2bmp函数,具体的实现方法下: ShowJpg函数中,关键的一点是调用了mrc_Img2bmp函数,mrc_Img2bmp函数的原型如下: pImg是jpg图片数据,ImgSize是jpg图片数据长度,ImgType是图片的类型,定义如下: 由于这里是对jpg格式进行转换,因此ImgType值应该为MRC_IMG_JPG;bmp是转换成功以后返回的16bit bmp图片的缓冲区指针,w和h为转换以后图片的宽和高。 当jpg图片转换成功以后,我们就可以像对16bit bmp图片一样,调用mrc_bitmapShowEx函数来进行显示图片。 4.2.4 jpg图片释放方法 当图片使用完成以后,我们需要释放加载的图片所占用的内存资源和转换成bmp以后保存bmp图片数据的内存空间。 具体的释放方法如下: 对jpg图片的资源释放过程,即要释放从mrp包里面加载时候所占用的内存空间,还要是否从jpg转换成16bit格式的bmp图片过程中产生的内存空间。 这样,我们就把jpg图片的资源添加、加载、转换和显示方法介绍一下,需要注意的是,由于要正常显示jpg图片需要将其转换成bmp格式,因为这个过程比较耗CPU资源,因此在应用开发过程中,应尽量少用jpg格式图片。 注意:模拟器上mrc_Img2bmp函数未实现。 4.3 gif图片使用方法 由于gif图片压缩率比较高而且可以显示动画效果,因此应用开发过程中会经常使用到gif格式图片,它的显示过程需要进行解压操作,我们的SKD暂时不支持直接显示方法,但是支持将gif图片转换成bmp格式,然后我们可以直接调用bmp显示接口来实现jpge图片。这里我们将以添加、加载和显示文件名为gif. gif的gif图片为例,来说明gif图片的使用方法。 需要注意的是,我们的SDK目前只支持显示gif中第一帧的图片,使用者需要知晓这一点。 4.3.1添加gif图片资源方法 gif图片添加方法与普通的bmp图片添加方法一样,添加方法提如下图所示: 当我们编译mpr工程文件的时候,如果图片被成功打包到mrp文件中,那么在编译完成的时候,会有提示信息,如下图所示: 当要添加的图片不存在的时候,编译器报编译错误,如下图所示: 当编译通过,并且编译输出有看到图片被成功打包进mrp包里面,说明我们完成了在mpr工程文件里面增加图片的功能。 4.3.2从mrp包里面加载gif图片方法 gif的图片加载方法,与普通16bit的bmp加载方法一样,可以通过调用mrc_readFileFromMrpEx函数来实现,具体方法如下面代码所示: 从LoadGif函数可以看出来,与16bit的bmp一样,我们使用一个 T_ICON_MAP类型的指针变量gif来保存加载的jpg图片。 4.3.3 gif图片显示方法 由于我们的SDK目前直接显示gif图片的接口,因此我们这里使用到了图片格式转换的接口,即mrc_Img2bmp函数,具体的实现方法下: ShowGif函数中,关键的一点是调用了mrc_Img2bmp函数,mrc_Img2bmp函数的原型如下: pImg是gif图片数据,ImgSize是gif图片数据长度,ImgType是图片的类型,定义如下: 由于这里是对gif格式进行转换,因此ImgType值应该为MRC_IMG_GIF;bmp是转换成功以后返回的16bit bmp图片的缓冲区指针,w和h为转换以后图片的宽和高。 当gif图片转换成功以后,我们就可以像对16bit bmp图片一样,调用mrc_bitmapShowEx函数来进行显示图片。 4.3.4 gif图片释放方法 当图片使用完成以后,我们需要释放加载的图片所占用的内存资源和转换成bmp以后保存bmp图片数据的内存空间。 具体的释放方法如下: 对gif图片的资源释放过程,即要释放从mrp包里面加载时候所占用的内存空间,还要是否从gif转换成16bit格式的bmp图片过程中产生的内存空间。 这样,我们就把gif图片的资源添加、加载、转换和显示方法介绍一下,需要注意的是,由于要正常显示gif图片需要将其转换成bmp格式,因为这个过程比较耗CPU资源,因此在应用开发过程中,应尽量少用gif格式图片。 注意:模拟器上mrc_Img2bmp函数未实现。 4.4图片旋转实现方法 在应用开发过程中,有时候为了节约图片资源,需要对图片进行旋转操作,本章节,我们将举例来说明图片旋转的使用方法。 4.4.1 图片旋转接口 我们的SDK提供了图片旋转相关接口,即mrc_bitmapDraw函数,该函数的原型如下: 该函数的功能是用增强的方式将bmp图片绘制于指定图片中。 将序号si 的bmp缓冲中的图片,从缓冲中的图片的(sx, sy)开 始的宽高为w, h的区域,绘制到序号di 的从(dx,dy)开始的bmp 缓冲中。 模式rop选择如下:BM_COPY或BM_TRANSPARENT; A、B、C、D用于图像变化: 这里为了表示小数,A, B, C, D均被乘以了256,根据变换公式,可以绘出不同效果的图像,比如: 旋转图像: A = 256 * cos(角度) B = 256 * sin(角度) C = 256 * -sin(角度) D = 256 * cos(角度) 当函数返回MR_SUCCESS,表示图片旋转成功,否则图片选择失败。 4.4.2 图片旋转使用方法 这里我们将举例说明一个名称为plane.bmp的16bit bmp图片的旋转方法。 1.将目标图片加载到图片缓冲区 由于mrc_bitmapDraw接口中,要求需要旋转的图片需要被加载bmp图片缓冲区中,因此,我们首先需要加载图片,图片的加载方法是通过调用mrc_bitmapLoad来实现的。 2.计算旋转参数 mrc_bitmapDraw函数中的A、B、C、D参数是与具体的旋转角度有关系的,因此在进行旋转之前,需要计算三角函数sin和cos的值, 在这里我们需要旋转角度为90度,A、B、C、D的值如下面所示: A = 256 * cos(90)= 256*0 = 0; B = 256 * sin(90)= 256*1 = 256; C = 256 * -sin(90)= 256*(-1) = -256; D = 256 * cos(90) = 256*0 = 0; 这样,我们就计算好了A、B、C、D的值。 3.创建图片缓冲区 旋转图片以后,需要将目标图片存放到一个新的缓冲区里面,因此需要调用mrc_bitmapNew函数来创建一个新的缓冲区,mrc_bitmapNew函数的原型如下: i是缓冲区序号,从0-29,w和h分别为缓冲区的宽高,一般与图片的宽高一致就可以了。 3.具体实现 这里我们将plane.bmp图片加载缓冲区为0的位置,旋转后的图片存放到图片缓冲区为1的位置。 具体方法如下面代码所示: 在RotateBmp函数里面,我们先通过LoadBmpFromBuf函数把plane.bmp加载到图片缓冲区0的位置,LoadBmpFromBuf函数函数的实现如下: 当加载plane.bmp成功以后,我们开始计算ABCD的值,这里我们对图片进行90度旋转。计算完旋转值以后,设置其他相关参数,然后创建与图片大小一样的缓冲区。最后,通过调用mrc_bitmapDraw函数实现图片旋转。 4.4.3 图片旋转效果 在RotateBmp函数里面,我们将plane.bmp原图以及旋转90度以后的效果图也给绘制出来,效果如下: 上图中,左边的图片是原图,右边的图片是旋转90度后的效果。 注意:图片旋转过程需要进行一些计算,需要比较长的时间,因此应用开发过程中需要特别注意这一点。 5、​ 屏幕缓冲区使用 在应用开发过程中,有时候为了加快屏幕绘制速度,需要用到屏幕缓冲区,本章节中,将简要介绍屏幕缓冲区相关操作方法。 5.1 获取屏幕缓冲区指针 在SDK中,我们可以通过w_getScreenBuffer函数来获取屏幕缓冲区指针,w_getScreenBuffer函数的原型如下: 调用w_getScreenBuffer函数以后,将返回一个屏幕缓冲区指针。 我们这里说的屏幕缓冲区其实本质是一块与屏幕大小相对应的内存空间,我们在调用文字和图片等绘制操作函数以后,其实就是往该内存里面写数据。通常情况下,该缓冲区的大小与屏幕大小是一致的,例如240X320的屏幕,它的缓冲区大小是240x320x2字节,就是150KB左右。 5.2 设置屏幕缓冲区 由于所有绘制操作,都是把相关数据写到屏幕缓冲区中,因此,在应用中可以自己创建缓冲区,并把它设置成屏幕缓冲区,这样所有的绘制操作都会写到自己的创建的缓冲区中。设置屏幕缓冲区的接口函数是w_setScreenBuffer,w_setScreenBuffer函数的原型如下: ptr是屏幕缓冲区指针。 5.3 屏幕缓冲区使用举例 这里我们将举例说明屏幕缓冲区的具体使用方法。 详细的使用方法如下: 在ScreenBuffer函数中,我们先获取屏幕缓冲区指针,然后把自己创建的缓冲区设置为屏幕缓冲区,并在上面绘制“Screen buffer!”这样的字符串,最后恢复屏幕缓冲区,并把先前绘制的内容copy到旧的缓冲区中,最后刷新屏幕,其效果如下图所示: 6、​ 长按键功能 在应用开发过程中,有时候需要获取长按键事件,但是我们的SDK没有该事件类型,我们可以通过定时器来模拟长按键事件。 6.1 长按键实现原理 在SDK中,我们只能获取按键的按下和弹起事件,没有长按键事件类型,但是我们通过定时器可以模拟出长按键事件。模拟的过程是:当用户按下某个按键的时候,启动定时器,当定时器超时的时候,还没有收到该按键的弹起事件,就认为触发了该按键长按键事件。 6.2 长按键实现方法 下面我们就创建一个窗口来说明长按键事件的实现方法。 创建窗口: 窗口事件处理: 按键事件处理: 启动定时器: 停止定时器: 长按键事件触发: 窗口绘制函数: 上述例子中,我们模拟了右方向键长按键事件过程。 窗口初始界面如下: 当用户按下右方向键,并且持续时间超过200ms的时候,定时器超时,那么就触发右方向键的长按键事件,屏幕刷新成为:
/
本文档为【杭州斯凯SDK教程_提高篇】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索