BREW开发教程(3):BREW编程概念

brew开发 brew应用的入门手册 立即下载

本章讨论了BREW编程的一些基本概念,包括Applet、模块、BREW的Class ID、Shell服务、浮点运算等。

Applet和模块总述

BREW中每个应用都是作为一个独立的Window DLL存在的,每个模块可以包括一个或多个小应用 (Applet), 并且必需有一个与之对应的MIF文件,MIF文件是通过MIF编辑器生成的,它包含了关于这个模块的内容信息,比如:支持的类、支持的Applet、Applet权限、以及Applet的一些详细信息(图标、题头)。MIF文件同时也包含了模块中类的唯一的Class ID, 并指出模块中哪点类是可以输出供其它的模块使用。

一个模块可以从BREW资源文件中读取数据,从而使用应用程序可以获取字符串、图像、对话框资源。通过在资源文件存入与语言或设备相关的信息,使用得编写适应不同国家或设备的应用成为可能。资源文件可以通过BREW的资源编辑器来生成二进制资源文件和相应的资源头文件。

开发BREW应用,可以被编辑成可以模拟器和目标设备上运行,用于编辑BREW应用所需的一些头文件和源代码随BREW SDK提供,一些用于生成DLL 特定功能的文件也包含中开发包中,允许开发人员生成应用程序和资源文件,在模块器和目标设备使用的资源文件及其二进制文件格式是相同的。

下面列出了生成一个应用所需的部件:

  • BREW SDK提供的AEE头文件。
  • BREW SDK提供的用于帮助生成应用的源代码。
  • Applet代码和头文件。
  • 同MIF编辑器生成的MIF文件。
  • 由资源编辑器生成的Applet资源文件及其头文件(可选)。

关于MIF文件

在Applet可以被模拟器调入之前必需创建该模块的MIF文件,MIF文件也必需包含中Applet的发布包中。

在设备或是模拟器启动时,应用程序管理器读取每个MIF文件,以取得包含中该MIF文件中应用程序列表,应用程序管理在屏幕显示该列表(应用程序图标及标题)。

BREW Class ID

BREW中每个Applet或类都有唯一的Class ID与这对应,在BREW中使用一个32位整数来标记公共类或Applet, 可以从BREW开发者Extranet www.qualcomm.com/brew/sdk/classid.取得所需的Class ID。

注意:BREW Class ID只对于授权的开发者开放,如果没有得到授权时,可以使用一些临时Class ID,直到你取得相应的授权为止。

如果手工为类或Applet赋Class ID,必需保证其唯一性,如果一个类或Applet的ID相同,则该类或是Applet不能运行。比如如下的目录结构:

sample/bar.mif

sample/testapp.mif

sample/testapp/testapp.dll

如果bar.mif和testapp.mif具有相同的Class ID,该应用不会被运行,这是因为BREW按照其中目录中出现的顺序来取MIF文件,对于指定Class ID,BREW先调入bar.mif。所以当试图运行该项应用时,BREW在该目录中查找bar子目录但找不到。

BREW中含用两种类的Class ID:接口 Class ID和Applet Class ID。

接口Class ID

所有BREW公用接口具有一个可以唯一标识其类别的Class ID,这些Class ID是BREW保留并不可以被其它的类或Applet使用,当一个Applet通过调用ISHELL_CreateInstance来取得一个指向某个接口的指针时,它使用该接口的Class Id来标明所需的接口,可以参考BREW API查看所有的接口Class ID。

Applet Class ID

所有在BREW平台上运行的Applet也必需有一个唯一的Class ID,在Applet被载入时该Class ID将传给AEE Shell,Shell 随后将使用该Class ID来载入和管理该Applet。

创建实例

BREW提供了一个功能强大的函数ISHELL_CreateInstance用于创建Applet或模块。调用该函数时,BREW从所支持的类列表中查找指定Class ID,该列表包含了BREW提供核心API以及在系统启动从MIF文件中所取得的Applet及类列表。

通过BREW模块支持的IMODULE_CreateInstance函数来创建一个类实例,然而在可以使用该函数前,模块必需被载入和初始化,BREW平台采用一个按需载入的机制,当模块被载入到系统中,BREW通过IModule来创建所需的类实例,直到模块的引用值(reference count)为0时,该模块才从系统中载出,此时BREW将释放该模块的所占内存。

通常情况下,BREW调用ISHELL_CreateInstance只会调用AddRef和Release,而不会调用其它函数,如果一个类被成功创建,将返回一个指向该接口的指针,当调用者不再使用该类时,必需调用该类的Release函数。

特点要注意的所用包含在模块中的对象在创建时要增加该模块的引用值,而在释放该类时,要减小对模块的引用值,从而允许BREW按需要载入载出该模块。

创建Applet

在BREW开发模式下,Applet就是支持IApplet接口的类,允许BREW调用相同的接口函数来管理所有的Applet。IApplet接口只支持HandleEvent函数以及标准的AddRef 和 Release函数。

BREW在两种情况会创建Applet:

  • 响应ISHELL_StartApplet函数,从而启动Applet,在这种情况下,将创建Applet并立即发送EVT_APP_START消息,消息EVT_APP_START通知Applet它已处于活动状态可以向屏幕上绘制。
  • 响应注册过的通知及告警,在这种情况下,将创建Applet并向其发送通知或告警特定的消息。

处理Applet消息

ISHELL_SendEvent函数用于向Applet发送消息,消息可以是同步也可以异步,发送到Applet的消息可以是键盘事件、对话框事件、控件事件等。

下面是发送到一个Applet消息序列:

EVT_APP_START

…

Other App Events (EVT_KEY, etc.)

…

EVT_APP_SUSPEND (optional)

EVT_APP_RESUME (optional)

…

Other App Events (EVT_KEY, etc.)

…

EVT_APP_STOP

一般情况下,Applet只需处理一些事件,可以包括EVT_APP_START,EVT_APP_STOP, EVT_KEY, 和 EVT_COMMAND.

暂停和恢复运行Applet

按照BREW模式,正常情况下只能有一个Applet处于运行和可见(控制显示器),然而,多个Applet可以以后台方式运行,这并不意味着一个Applet不有被初始化以响应通知、告警或其它消息。

当BREW暂停一个Applet,它将向Applet发送EVT_APP_SUSPEND消息。如果Applet处理该消息时返回TRUE, 表明该Applet已处理过该消息并且没有被调出内存。如果Applet不想处理EVT_APP_SUSPEND消息,可以返回FALSE,在这种情况下,BREW将停止该Applet,将向Applet发送EVT_APP_STOP消息,Applet将被载出内存。

如果在AEEClsCreateInstance()函数中分配内存,而在EVT_APP_STOP中释放该内存是极其危险的。因止在EVT_APP_START分配的内存必需在EVT_APP_STOP中释放,而在AEEClsCreateInstance () 分配的内存,必需在APPFreeData () 释放。

在模拟器情况下,可以先运行一个Applet,然后通过点击模拟器菜单选择一个选项(比如Tool->Settings),此时BREW立即向Applet发送一个EVT_APP_SUSPEND消息,当你在设置窗口点击”Cancel”键时,BREW将向Applet发送EVT_APP_RESUME消息。

BREW开发指南

下面提供的BREW开发指南可以帮助开发人员避免一些常见的错误以及减少用于测试及高度的时间。包括了:

  • 从Window平台到ARM环境移植中可能出现的问题。
  • 可能在目标设备出现的问题,但却无法在模拟器中检测及出现。
  • 一般的通用的好的编码方法。

通过阅读下面的指南可以帮助你减少从Window到ARM环境的移植时间,并最大可能使你的应用在目标设备上成功运行。

开发指南说明
进行NULL指针检测有两种情况,如下:

  • 在创建BREW接口实例时必需检测NULL指针,如果指针不对,则不能使用该接口。
  • 高通公司推荐开发人员检测所有的指针,包括传给或是从BREW方法或是分配内存时返回的指针,以保证该指针的有效性,必需通过异常处理机制来处理非法指针。
避免堆栈溢出不要在堆栈中使用大数组,不要在函数中定义大的数组或变量作为局部变量,这是因为在BREW环境下提供给堆栈使用的内存是有限的,如果需要使用充足的内存(比如超过256字节),使用动态内存分配机制来分配内存(MALLOC或使用IHeap 接口)。

如果是在一个递归过程中分配空间,动态分配内存。

不要在循环中占用过多时间如果在循环中占用过多CPU时间可能引用设备复位,所以不要在一个事件处理中占用过多时间,这会阻止其它事件的发送而最终引起设备复位。

当接收到某个事件时,应用只需做必需的事件处理后立限返回,从而可以保证其它事件的发送。

开发设备无关的应用为保证所开发的应用可以在不同的设备上运行,而不需关心设备的内存大小、键盘、屏幕大小、颜色深度,使用ISHELL_GetDeviceInfo()来取得关于设备的信息,使用这些信息作为键盘、屏幕大小、颜色深度的参数,而不要在代码中写死。

使用CONVERTBMP例程在不同设备上处理图像。

使用资源文件使用资源文件来存放与语言相关的字符串、对话框及图像数据。这允许将应用从一种语言切换到另一种语言。而不要直接写入代码中。
释放内存由于设备上所能使用的内存是有限的,必需释放不再使用的内存空间,有两种情形:

  • 必需释放所有创建的对象实例。
  • 必需在应用终止时释放所有动态分配的内存。

高通推荐立限释放不再使用的内存。

不要使用全局及静态变量BREW框架不支持全局及静态变量,这是因为动态下载下来的应用不能处理这种类型的变量。此外,全局及静态变量在编译时将导致链接错误。在Applet结构中存取持久性数据。
不要在定义一个结构时对其初始化从ARM编译器角度来看,定义并初始化一个结构将被视为静态变量。
不要在条件语句中对变量赋值避免ARM编译器错误
不要使用本地浮点调用原因同“不要使用全局变量”,这将引起类型转换,使用BREW提供的浮点操作函数。
使用BREW提供的标准函数库以保证编译后的代码最小,使用BREW提供的标准C函数子集而不要直接调用C函数。
避免类型转换错误因为ARM编辑器比其它的编辑处理隐含类型转换时更为严格,请明确指明类型转换,从而可以避免从Window到ARM环境下的编译错误。
检测函数返回值当调用BREW   API时,如果有返回值,处理成功和失败两种情况。
处理错误码因为某些API返回void,如果适合的话,调用BREW 提供的GetLastError()来区别错误代码。
使用小写的文件及数据库名称因为高通提供的EFL中文件名是区别大小写的,使用小写的文件及数据名称。

由于已知的原因,不要在文件名中使用两个.,不要在数据名中使用. 。

尽可能减小代码为尽可能减小代码,在将应用载入到目标设备前关闭调试信息选项。
设置编译告警等级在Window平台上编译时,将告警等级设为最高级,4级,这将帮助你更进一步检测代码。这是因为ARM编译器比Window编译器更为严格。
组合多个读写操作为从整体提高应用程序性能,尽可能组合多个读写操作。将数据读入到内存中并根据需要来存取。

创建新的应用

当你熟悉了BREW开发环境,并看过了示例程序之后,就可以编写新的BREW应用了。最简单和最快的方式是使用BREW应用开发向导,该向导将帮助创建开发BREW应用所需的各个部件。

语言相关的系统资源

BREW开发环境使用一组用于BREW运行的系统资源,这些系统资源是和设备支持的语言相关的并可以在资源文件AEEControls.bar中取得,该系统资源定义所有BREW接口所需要的资源。

在设备环境中,所有语言相关的资源放置在该语言特定的目录中,目录名称可以从ISO639 中引出来的。

浮点操作

BREW平台不支持浮点操作,如果在BREW SDK中开发并测试带浮点操作的应用时是可以通过的,这是因为底层的平台是Window操作系统,然后设备BREW平台是不支持浮点操作也就不能使用浮点操作,如果必需使用则必需调用BREW提供的浮点操作实用函数。

访问Shell服务

BREW模块和Applet能过根IShell接口来取得所有外部接口访问,每个接口具有一个唯一标识其身份的接口ID, 通过调用ISHELL_CreateInstance () 来取得指定接口的指针。

IShell接口

IShell 接口提供了可用于Applet访问设备操作系统功能一组服务接口。主要包括:

  • 取得Shell或设备支持的类。
  • 以得设备相关信息。
  • 激活或暂停一个Applet。
  • 管理定时器。
  • 取得系统时间和时间转换。
  • 管理对话框以取得用户输入。
  • 调入Applet使用的资源。
  • 发送事件到Applet或不同的接口。
  • 显示信息或提示框。
  • 发送告警。
  • 注册和查询某个协议和浏览器。
  • 为某个接口注册特定的消息。

IBase接口

IBase接口定义所有AEE类的基本结构, 所有AEE类都是从IBase接口派生出来的。

因为所有的AEE对象都是可以动态生成的,所有必需采用某种机制来分配及释放对象,IBase接口提供了两个基本函数:AddRef 和 Release,允许:

  • 动态分配接口
  • 释放接口

所有的BREW类都必需实现IBase接口函数。

IModule和IApplet接口

IModule和IApplet接口和其它的一些接口不同,它们实现了应用程序应该所供提的服务,而不是由应用程序来调用的接口服务,它们为IShell接口提供了一种机制用于载入,管理,以及将消息发送给应用程序。BREW SDK提供了缺省的IMoudle和IApplet实现。

IModule接口

BREW模型一个基本机制是通过IShell来链接或载入模块,这些模块向外提供了一个入口点用于取得IModule接口,IModule接口提供了两个函数。第一个和最关键的一个是允许BREW从IModule查找指定的接口。第二个则是允许BREW释放模块不再使用的资源。

BREW同时支持静态和动态模块。静态模块由生产商集成到设备中,因此只有设备制造商可以生成静态模块,动态模块可以动态下载到设备中,BREW SDK只支持动态模块。

静态和动态模块都向外输入单一的入口点,这是在模块中被调用或执行的第一个函数,对于静态链接的模块来说,这个入口点用于取得所支持的类和Applet,入口点函数同时也返回模块主调函数的指针。BREW调用这个主调函数来要求模块创建由该模块支持的类对象。入口点函数必需具有唯一的名称,设备才能够管理这个入口函数并将其加入到静态模块列表中。

动态模块只提供了主调函数,这是通过将它放在可模块重分配代码段第一个对象的第一个函数来实现的。BREW可以根据需要来调入这些模块。

IApplet接口

IApplet接口实现由Applet提供的服务,主要是提供了一个机制使得IShell能够将消息发送到Applet。

brew教程(由入门到深入) 介绍brew的开发,由入门到深入,是一本不错的brew教程! 立即下载

相关推荐

BREW 教程(深入BREW开发)

一份不错的BREW教程,比较深入的分析了BREW的实现原理和相关机制,希望对大家加深BREW认识有所帮助。

开发BREW扩展类

看到一篇文章,觉得比较有指导意义,译过来,希望给大家有些帮助,能力有限,有错误的地方还望大家指出来。共同学习,共同进步。原文地址:https://brewx.qualcomm.com/bws/content/gi/common/appseng/en/knowledgebase/docs/extensions.htm1 简介:扩展类可以扩充BREW的功能,通常来说,扩展类都是以动态的形式存在

2614

合泰单片机HT32之keil5开发环境搭建(一)

1. 前言 这两天在准备合泰杯,但是总是感觉无从下手,因为合泰单片机的资料教程什么的非常少,不像stm32那样。而且听说要用合泰单片机的专用IDE,感觉当场被劝退了。后来经过查找资料,发现合泰单片机也有keil5的支持包,也就是说可以从库函数进行开发,不用从寄存器进行开发,但我找了好久,并没有找到教程,后来实在没办法,打算自己动手搭建环境,经过了大概两天的挣扎后,终于成功地搭建好了环境,也成功地点...

weixin_44713763的博客 8668

BREW平台主要技术的分析与总结

2003年,美国高通公司在中国推出了BREW平台,在中国获得了快速的发展和应用。时间虽然不短,但是由于高通公司的种种约束以及BREW平台本身的诸多限制,使得许多开发人员对在BREW平台下进行开发不得要领。本文深入分析了BREW平台的主要技术以及实现机制,包括模块加载机制、事件处理机制、接口机制和回调机制,以期对BREW平台有深入透彻的理解,并对BREW的主要技术进行了总结。 (此文为毕设时写的小论文,谈不上原创,但还是有一定参考价值。)

feng_zai的专栏 1735

【上海大学计算机组成原理实验报告】五、机器语言程序实验

机器语言程序实验//理解计算机执行程序的实际过程//学习编制机器语言简单程序的方法//将R1中的数值左移n次送OUT,其中n是R2中的数值。(指令码从10开始)//完成R3=R0×R1,结果送OUT。(指令码从30开始)//建立“中文汇编指令”需要哪些条件?//上海大学计算机组成原理实验报告

HackerKevon的博客 2187

【python快速编程入门(第二版)黑马程序员课后编程题】

python快速编程入门(第二版)黑马程序员课后编程题

weixin_46167259的博客 1万+

BREW接口的继承和多态

转自http://blog.youkuaiyun.com/pengzhenwanli/archive/2006/05/29/761156.aspx       BREW接口的继承和多态      BREW平台支持C和C++开发语言,而C语言是不支持面向对象的,只有C++支持面向对象的程序设计,因此BREW中必须使用C语言模拟实现C++语言面向对象机制。在C++中继承是基于C++内存中数据是按照一定顺序

LonelyWinter的专栏 1266

深入解析Cuk、Zeta和Sepic拓扑:非隔离型开关电源的设计奥秘

本文深入解析了Cuk、Zeta和Sepic三种非隔离型开关电源拓扑的设计奥秘。它们均能实现升降压转换,但特性各异:Cuk拓扑输出反向电压,输入输出纹波极低;Sepic拓扑输出同极性电压,应用广泛;Zeta拓扑输出纹波小,适合精密供电。文章详细对比了其电路结构、工作原理、核心公式及选型指南,帮助工程师根据输入电压范围、输出极性及纹波要求,灵活选择最合适的拓扑方案。

weixin_28308325的博客 476

brew接口定义宏解析

a.#define VTBL(iname)  iname##Vtbl b.#define QINTERFACE(iname)\                      struct _##iname{\                             struct

muxiang1988的专栏 515

从动态规划到最优控制:Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用

本文深入解析了Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用,从动态规划到最优控制的演变过程。通过实际案例展示了HJB方程在机器人路径规划、工业机械臂优化等领域的实践价值,并探讨了数值求解方法和深度学习结合的神经HJB前沿进展。

weixin_28700411的博客 453

《Python基础教程》专栏总结篇

今天给大家带来的文章是《Python基础教程》专栏总结篇,希望能对同学们有所帮助。 文章目录 1. 背景 2. 专栏亮点 3. 你的收获 4. 详细目录

weixin_43178406的博客 73万+

BREW开发教程(7):BREW应用开发基础

“Hello,world”应用仅仅是一个极其简单的程序,实际开发BREW应用要比这个复杂得多。学会使用BREW编程,首先必需了解BREW API提供了哪些接口可供开发者使用,并了解BREW应用的程序框架。本章介绍开发BREW应用必需了解的几个核心接口、程序入口点、BREW提供的桩代码以及推荐使用的应用程序开发框架。 程序入口点 在BREW应用程序管理器启动一个Applet时,它会首先调用由Ap

引路蜂移动软件 1673

微信小程序 - error_msg:net::ERR_CONNECTION_RESET“(“errno“:600001,“errMsg“:“uploadFile:fail errcode:-101)

"errno":600001,"errMsg":"uploadFile:fail errcode:-101 cronet_error_code:-101 error_msg:net::ERR_CONNECTION_RESET"微信小程序,微信小程序wx.uploadFile报错,uniapp微信小程序uni.uploadFile上传文件报错,微信小程序调用wx.uploadFile返回错误ERR_CONNECTION_RESET,如何解决这个问题,上传图片出现报错,小程序上传视频报错,上传文件出现报错,如何

🏆 前端领域优质创作者 5407

brew安装教程,brew换国内软件源,brew换中科大源,brew常用命令,Mac的包管理器

brew安装brew换源brew常用命令 整理下来为个人记录之用,此文章经过一次迭代,以前用腾讯源,后来它不行了~~ 依据此教程操作之后brew和apt或pacman无异;速度极快。 很多人换了常用的四个源,但是没有让brew访问的所有GitHub的 URL 替换为国内源,导致速度仍然慢。话不多说,上图! brew安装 1.使用中科大镜像加快安装速度 依据brew官网示例,使用本地化的镜像加快brew的安装速度(https://docs.brew.sh/Installation#2) export.

Deng_Xian_Sheng的博客 2327

一文读懂5G网络整体架构(接入网+承载网+核心网)

接入网重构分级(分工更细、效率更高)、承载网三段化升级(管道更宽、更智能)、核心网服务化云化(管理更灵活、成本更低)最终实现“成本最优、资源灵活、场景适配”,才能支撑自动驾驶、工业互联网、智慧城市、VR/AR等各种新场景,真正走进我们的生活。

鲸落寰宇 427

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

[深入分析BREW机制]:Mod相关概念解析

 BREW MOD相关概念解析 目录 1、Mod与Applet、接口的关系 2、Mod的唯一标识 3、Applet、接口的唯一标识 4、Mod的实体组成 5、Mod的加载和启动  5.1 加载Mod  5.2 启动Mod 6、在simulator中运行动态Mod1、Mod与Applet、接口的关系本文之前谈到的都是Applet和接口,实际上BREW的运行单元是Mod,而Applet、接口只是M

chinesecoolman的专栏 2198

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

BREW是什么?

首先,BREW是个代表无线应用下载的缩写。从开发商的角度看,可以如下描述高通公司的BREW平台: 1. 一个API函数集,令开发商能创建用于无线设备(现是无线电话)的应用软件; 2. 也是一种手段,将应用出售并交给终端用户。 就电话而言,BREW是个处在应用软件和专用集成电路这两种级别间的廋客户(约150k)。因此开发商能在不用知道或关心设备芯片或是空中接口的情况下对BREW进行写入。而且,BRE

优快云_document的专栏 5484

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

《深入BREW开发》——第七章 创建新的BREW应用程序

第七章 创建新的BREW应用程序       在第六章中,我们介绍了Applet和模块的相关内容,并且熟悉了BREW开发环境,那么现在是开始创建一个属于我们自己的应用程序的时候了。在BREW中创建应用程序最简单的方式是,通过BREW在Visual Studio C++环境中的应用程序向导。通过向导,可以一步一步的让我们构建成功开发BREW应用程序所需要的组件。接下来我们就详细的介绍一下BREW

不抛弃,不放弃 2055

brew开发环境搭建

搭建SDK 环境1)安装VC2)安装VC插件3)网络安装https://brewx.qualcomm.com/oem/index.jsp?page=ox/tools/downloads

深度技术安全 2799

BREW触摸屏开发参考

 触摸屏开发参考 V0.11、 BREW触摸屏接口处理触摸屏事件与处理按键事件过程大体相同,只不过是事件的名称和事件参数的含义不同而已。例如,大部分手机的触摸屏事件是这样定义的EVT_PEN_DOWN 触摸笔按压屏幕EVT_PEN_MOVE 触摸笔在屏幕上移动EVT_PEN_STALE_MOVE ??EVT_PEN_UP 触摸笔从屏幕上离开事件参数dwParam存储了事件发生时触摸笔

wtyqm的专栏 3308
上一篇: BREW开发教程(2):BREW基础
下一篇: BREW开发教程(4):BREW消息处理机制
引路蜂
博客等级 码龄16年 3122粉丝 711原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值