xm_user.h 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  1. //****************************************************************************
  2. //
  3. // Copyright (C) 2012 ShenZhen ExceedSpace
  4. //
  5. // Author ZhuoYongHong
  6. //
  7. // File name: xm_user.h
  8. // constant,macro & basic typedef definition of user
  9. //
  10. // Revision history
  11. //
  12. // 2010.09.01 ZhuoYongHong Initial version
  13. //
  14. //****************************************************************************
  15. #ifndef _XM_USER_H_
  16. #define _XM_USER_H_
  17. #include <xm_type.h>
  18. #if defined (__cplusplus)
  19. extern "C"{
  20. #endif
  21. // Macro definition
  22. // 定时器资源
  23. #define XM_MAX_TIMER 16 // 系统最大可分配定时器资源
  24. #define XM_MAX_MSG 32 // 系统消息队列大小
  25. #define MAX_HWND_STACK 8 // 视窗栈最大层次
  26. #define MAX_HWND_WIDGET_COUNT 4 // 一个窗口中最大允许定义的控件个数
  27. #define MAX_STACK_WIDGET_COUNT 8 // 视窗栈最大允许同时定义的控件个数 (所有视窗中的控件累加个数)
  28. // 消息类型定义
  29. #define XM_KEYDOWN 0x01
  30. // wp 按键键值,lp 按键状态
  31. #define XM_KEYUP 0x02
  32. // wp 按键键值,lp 按键状态
  33. #define XM_QUIT 0x03 // 消息循环退出消息
  34. // wp保留为0, lp为程序设置的返回值
  35. #define XM_CHAR 0x04 // 字符消息
  36. // wp = 0, lp为16为Unicode16编码
  37. // wp != 0, 字符编码值为Unicode编码 (wp << 16) | lp,
  38. #define XM_TIMER 0x05 // 定时器消息
  39. // wp 定时器ID,lp 保留为0
  40. #define XM_PAINT 0x06 // 屏幕刷新消息
  41. // wp,lp保留为0
  42. #define XM_COMMAND 0x07 // 命令消息
  43. // wp为命令ID,lp与命令ID相关
  44. #define XM_ALARM 0x08 // 闹铃消息
  45. #define XM_CLOCK 0x09 // 每秒消息
  46. // wp,lp保留为0
  47. #define XM_MCI 0x0A // 流媒体播放控制消息
  48. // wp MCI通知码
  49. // lp 与wp相关的附属信息
  50. #define XM_ENTER 0x0B // 视窗进入
  51. // wp = 0, 新视窗进入 (该视窗未创建)
  52. // lp 保留为0
  53. // wp = 1, 从其他视窗返回到该视窗 (该视窗已创建)
  54. // lp
  55. // bit 0 1 表示视窗重进入是因为分辨率修改
  56. // 0 其他原因进入
  57. // bit 1~7 0 保留为0
  58. //
  59. #define XM_LEAVE 0x0C // 视窗退出
  60. // lp保留为0
  61. // wp = 0, 视窗彻底退出 (该视窗被摧毁)
  62. // wp = 1, 视窗临时离开,如压入新的其他视窗 (该视窗当前状态保留)
  63. #define XM_SYSTEMEVENT 0x10 // 系统事件定义
  64. // lp 保留为0
  65. // wp 参考 XM_SYSTEMEVENT 的 WP 参数定义
  66. // 1) 一般情况下视窗view无需处理该事件,由系统缺省处理
  67. // 2) 若视窗view需要处理某个事件,处理完后需判断是否继续将事件传递给系统缺省处理。
  68. // 通过调用API XM_BreakSystemEventDefaultProcess 可终止系统缺省处理(即系统不再处理该事件)
  69. #define XM_TOUCHDOWN 0x11 // 触摸事件按下
  70. // lp
  71. // bit 0 ~ 15 触摸点x坐标
  72. // bit 16 ~ 31 触摸点y坐标
  73. // wp 保留为0
  74. #define XM_TOUCHUP 0x12 // 触摸事件释放
  75. // lp 保留为0
  76. // wp 保留为0
  77. #define XM_TOUCHMOVE 0x13 // 触摸事件移动
  78. // lp
  79. // bit 0 ~ 15 触摸点x坐标
  80. // bit 16 ~ 31 触摸点y坐标
  81. // wp 保留为0
  82. #define XM_TOUCHREPEATED 0x14 // 触摸事件长按
  83. // lp
  84. // bit 0 ~ 15 触摸点x坐标
  85. // bit 16 ~ 31 触摸点y坐标
  86. // wp 保留为0
  87. // XM_SYSTEMEVENT 的 WP 参数定义
  88. // 卡、文件系统事件
  89. #define SYSTEM_EVENT_CARD_DETECT 0 // SD卡准备中(SD卡检测中)
  90. // "SD卡已插入,正在识别中"
  91. #define SYSTEM_EVENT_CARD_UNPLUG 1 // SD卡拔出事件
  92. // "SD卡已移除"
  93. #define SYSTEM_EVENT_CARD_INSERT_WRITE_PROTECT 2 // SD卡插入(写保护)
  94. // "SD卡已写保护,请将'写保护'开关关闭"
  95. #define SYSTEM_EVENT_CARD_INSERT 3 // SD卡插入(读写允许)
  96. #define SYSTEM_EVENT_CARD_FS_ERROR 4 // SD卡插入,数据卡已识别(读写模式),卡文件系统已安装
  97. // "SD卡文件系统错误,请重新格式化"
  98. // 无法在数据卡上创建保存视频记录的目录,
  99. // 存在与目录同名的文件时,将其重命名(自动修复)
  100. // 无法自动修复时需要提示"格式化或者换卡"
  101. #define SYSTEM_EVENT_CARD_VERIFY_ERROR 5 // SD卡读写校验检查失败,
  102. // "SD卡已损坏, 请尝试重新格式化"
  103. #define SYSTEM_EVENT_CARD_INVALID 6 // SD卡无法识别 (检测到卡插入,但卡没有应答卡控的任何指令)
  104. // "SD卡无法识别,请重新插入"
  105. #define SYSTEM_EVENT_CARD_DISK_FULL 7 // SD卡磁盘已满
  106. // "SD卡已写满,请尝试重新格式化"
  107. #define SYSTEM_EVENT_CARD_FS_UNSUPPORT 8 // 无法支持的其他文件系统格式exFAT或者NTFS
  108. // "SD卡文件系统不支持,请重新格式化"
  109. // 显示外设接入、断开事件
  110. #define SYSTEM_EVENT_AVOUT_PLUGOUT 20 // AVOUT拔出
  111. #define SYSTEM_EVENT_AVOUT_PLUGIN 21 // AVOUT插入
  112. #define SYSTEM_EVENT_HDMI_PLUGIN 22 // HDMI设备插入
  113. #define SYSTEM_EVENT_HDMI_PLUGOUT 23 // HDMI设备拔出
  114. #define SYSTEM_EVENT_BL_OFF 24 // 关闭背光
  115. #define SYSTEM_EVENT_BL_ON 25 // 开启背光
  116. // 快捷按键事件
  117. #define SYSTEM_EVENT_ADJUST_BELL_VOLUME 30 // 快捷按键事件,调整铃声音量、开启、关闭
  118. #define SYSTEM_EVENT_ADJUST_MIC_VOLUME 31 // 快捷按键事件,调整录音音量、开启、关闭
  119. #define SYSTEM_EVENT_ONE_KEY_PROTECT 32 // 快捷按键事件,紧急录像(一键锁定)
  120. #define SYSTEM_EVENT_ONE_KEY_PHOTOGRAPH 33 // 快捷按键事件,一键拍照
  121. #define SYSTEM_EVENT_URGENT_RECORD 32 // 快捷按键事件,紧急录像(一键锁定)
  122. #define SYSTEM_EVENT_ONE_KEY_REBOOT 34 // 快捷按键事件,一键重启
  123. // 系统电池事件
  124. #define SYSTEM_EVENT_MAIN_BATTERY 40 // 主电池变化事件
  125. #define SYSTEM_EVENT_BACKUP_BATTERY 41 // 备份电池变化事件
  126. // USB拔插事件
  127. #define SYSTEM_EVENT_USB_DISCONNECT 50 // USB断开连接
  128. #define SYSTEM_EVENT_USB_CONNECT_CHARGE 51 // USB作为充电线使用
  129. #define SYSTEM_EVENT_USB_CONNECT_UDISK 52 // USB已连接,作为其他设备的U盘使用
  130. #define SYSTEM_EVENT_USB_CONNECT_CAMERA 53 // USB已连接,作为其他设备的Camera输入使用
  131. // GPS北斗导航事件
  132. #define SYSTEM_EVENT_GPSBD_DISCONNECT 60 // GPSBD已断开
  133. #define SYSTEM_EVENT_GPSBD_CONNECT_ANTENNA_OPEN 61 // GPSBD已连接(天线未连接)
  134. #define SYSTEM_EVENT_GPSBD_CONNECT_ANTENNA_SHORT 62 // GPSBD已连接(天线短路)
  135. #define SYSTEM_EVENT_GPSBD_CONNECT_ANTENNA_OK 63 // GPSBD已连接(天线连接正常)
  136. #define SYSTEM_EVENT_GPSBD_CONNECT_LOCATE_OK 64 // GPSBD已定位
  137. // 视频项事件
  138. #define SYSTEM_EVENT_VIDEOITEM_LOW_SPACE 80 // 视频项可循环空间低,可能是锁定项占用空间太多或者是其他格式的文件占用磁盘空间太多
  139. // 这个事件在卡插入时、视频记录过程中发出。
  140. // "循环录像空间不足,请解锁视频或重新格式化"
  141. #define SYSTEM_EVENT_VIDEOITEM_LOW_SPEED 81 // 视频项文件写入速度低(慢速卡、文件系统碎片过多均会导致)
  142. // 这个事件在记录过程中发出。
  143. // 当写入速度已无法满足实时记录时(存在严重丢帧现象),提醒格式化SD卡
  144. // "SD卡写入速度较慢,可能需要重新格式化"
  145. #define SYSTEM_EVENT_VIDEOITEM_LOW_PREFORMANCE 82 // 文件系统的参数需要重新配置,确保满足视频记录的要求
  146. // 一般指SD卡的簇大小太小,导致卡读写速度无法满足高清视频实时的写入
  147. // 这个事件在卡插入时发出
  148. // 即需要提醒格式化SD卡
  149. // "SD卡读写效率较低,可能需要重新格式化"
  150. #define SYSTEM_EVENT_VIDEOITEM_ERROR 83 // 视频项数据库异常,需要格式化SD卡
  151. // 这个事件在卡插入时发出
  152. #define SYSTEM_EVENT_VIDEOITEM_RECYCLE_CONSUMED 84 // 视频项数据库异常,可循环使用的资源已耗尽,
  153. // 即已锁定的视频文件总数量已达到系统定义的最大数量
  154. // 需要手工删除视频或者格式化SD卡
  155. // 这个事件在卡录制过程中发出
  156. // "锁定的录像文件已满, 录像已停止, 请删除文件或重新格式化"
  157. #define SYSTEM_EVENT_VIDEOITEM_LOW_SPACE_ALARM 85 // 可循环录像时间低于指定的阈值报警
  158. // 按照当前的录像视频平均波特率, SD卡可循环录像空间的时间低于定义的报警阈值
  159. // "可循环录像时间已低于报警阈值"
  160. // 系统升级事件
  161. #define SYSTEM_EVENT_SYSTEM_UPDATE_FILE_CHECKED 90 // 找到合法的系统升级文件
  162. #define SYSTEM_EVENT_SYSTEM_UPDATE_FILE_MISSED 91 // 无法找到系统升级文件。
  163. // 当升级失败后(掉电异常),下次启动时自动进入到系统升级模式。
  164. // 若无法找到升级文件,投递该系统事件
  165. #define SYSTEM_EVENT_SYSTEM_UPDATE_FILE_ILLEGAL 92 // 非法的系统升级文件
  166. //
  167. #define SYSTEM_EVENT_SYSTEM_UPDATE_SUCCESS 93
  168. #define SYSTEM_EVENT_SYSTEM_UPDATE_FAILURE 94
  169. // 测速雷达报警事件
  170. #define SYSTEM_EVENT_RADAR_ALARM (100) // 测速雷达信号报警
  171. //#define SYSTEM_EVENT_RECORD_SPACE
  172. // CCD断开事件
  173. #define SYSTEM_EVENT_CCD0_LOST_CONNECT 110
  174. #define SYSTEM_EVENT_CCD1_LOST_CONNECT 111
  175. #define SYSTEM_EVENT_CCD2_LOST_CONNECT 112
  176. #define SYSTEM_EVENT_CCD3_LOST_CONNECT 113
  177. #define SYSTEM_EVENT_CCD4_LOST_CONNECT 114
  178. #define SYSTEM_EVENT_CCD5_LOST_CONNECT 115
  179. #define SYSTEM_EVENT_CCD6_LOST_CONNECT 116
  180. #define SYSTEM_EVENT_CCD7_LOST_CONNECT 117
  181. #define SYSTEM_EVENT_CCD8_LOST_CONNECT 118
  182. #define SYSTEM_EVENT_CCD9_LOST_CONNECT 119
  183. #define SYSTEM_EVENT_CCDA_LOST_CONNECT 120
  184. #define SYSTEM_EVENT_CCDB_LOST_CONNECT 121
  185. #define SYSTEM_EVENT_CCDC_LOST_CONNECT 122
  186. #define SYSTEM_EVENT_CCDD_LOST_CONNECT 123
  187. #define SYSTEM_EVENT_CCDE_LOST_CONNECT 124
  188. #define SYSTEM_EVENT_CCDF_LOST_CONNECT 125
  189. // CCD连接事件
  190. #define SYSTEM_EVENT_CCD0_CONNECT 130
  191. #define SYSTEM_EVENT_CCD1_CONNECT 131
  192. #define SYSTEM_EVENT_CCD2_CONNECT 132
  193. #define SYSTEM_EVENT_CCD3_CONNECT 133
  194. #define SYSTEM_EVENT_CCD4_CONNECT 134
  195. #define SYSTEM_EVENT_CCD5_CONNECT 135
  196. #define SYSTEM_EVENT_CCD6_CONNECT 136
  197. #define SYSTEM_EVENT_CCD7_CONNECT 137
  198. #define SYSTEM_EVENT_CCD8_CONNECT 138
  199. #define SYSTEM_EVENT_CCD9_CONNECT 139
  200. #define SYSTEM_EVENT_CCDA_CONNECT 140
  201. #define SYSTEM_EVENT_CCDB_CONNECT 141
  202. #define SYSTEM_EVENT_CCDC_CONNECT 142
  203. #define SYSTEM_EVENT_CCDD_CONNECT 143
  204. #define SYSTEM_EVENT_CCDE_CONNECT 144
  205. #define SYSTEM_EVENT_CCDF_CONNECT 145
  206. #define XM_BARCODE 0x11 // 条形码输入事件
  207. // wp, lp保留为0
  208. #define XM_USB 0x12 // USB输入事件
  209. // wp USB事件类型
  210. // lp 保留为0
  211. #define XM_VIDEOSTOP 0x20 // 视频播放结束消息
  212. // wp 退出码 (参考app_video.h定义)
  213. // 视频播放消息(XM_VIDEOSTOP)的退出码(8bit)定义
  214. #define AP_VIDEOEXITCODE_FINISH 0x00 // 解码播放结束
  215. #define AP_VIDEOEXITCODE_LOWVOLTAGE 0x01 // 低压异常结束
  216. #define AP_VIDEOEXITCODE_STREAMERROR 0x02 // 流格式错误
  217. #define AP_VIDEOEXITCODE_OTHERERROR 0x03 // 其他异常(如SD卡异常、文件系统异常等)
  218. #define XM_USER 0x80 // 用户自定义消息(0x80 ~ 0xFF)
  219. // Window视窗标志定义
  220. #define HWND_DISPATCH ((BYTE)0x01) // 消息派发中
  221. #define HWND_DIRTY ((BYTE)0x02) // 标识窗口需要重绘(包括所有控件)
  222. #define HWND_ANIMATE ((BYTE)0x80) // 标识视窗支持动画效果
  223. // Widget控件标志定义
  224. #define WDGT_VISUAL ((BYTE)0x01) // 标识控件处于可视状态
  225. #define WDGT_ENABLE ((BYTE)0x02) // 标识控件处于使能状态
  226. #define WDGT_FOCUS ((BYTE)0x04) // 标识控件具有可聚焦属性,即可被聚焦
  227. #define WDGT_SELECT ((BYTE)0x08) // 标识控件处于选择状态 (CheckBox控件可具有该标志)
  228. #define WDGT_FOCUSED ((BYTE)0x10) // 标识控件处于聚焦状态,即拥有输入焦点
  229. #define WDGT_DIRTY ((BYTE)0x20) // 标识控件处于脏状态,需要重绘
  230. #define WIDGET_IS_FOCUS(flag) ((flag) & WDGT_FOCUS)
  231. #define WIDGET_IS_FOCUSED(flag) ((flag) & WDGT_FOCUSED)
  232. #define WIDGET_IS_SELECT(flag) ((flag) & WDGT_SELECT)
  233. #define WIDGET_IS_ENABLE(flag) ((flag) & WDGT_ENABLE)
  234. #define WIDGET_IS_VISUAL(flag) ((flag) & WDGT_VISUAL)
  235. #define WIDGET_IS_DIRTY(flag) ((flag) & WDGT_DIRTY)
  236. #define HWND_VIEW 0x01 // 视窗类型
  237. #define HWND_ALERT 0x02 // 弹窗类型
  238. #define HWND_EVENT 0x03 // 通知类型
  239. #define XM_VIEW_DEFAULT_ALPHA 255 // 视窗缺省透明度
  240. // 缺省定制属性
  241. #define HWND_CUSTOM_DEFAULT ((DWORD)(0))
  242. // 获取视窗回调函数
  243. #define XMPROC(hwnd) HWND_##hwnd##_WindowProc
  244. // 视窗回调函数声明
  245. #define XMPROC_DECLARE(hwnd) \
  246. extern void HWND_##hwnd##_WindowProc (XMMSG *msg);
  247. // 视窗回调函数定义开始
  248. #define XM_MESSAGE_MAP_BEGIN(hwnd) \
  249. void HWND_##hwnd##_WindowProc (XMMSG *msg) {
  250. // 消息处理函数定义
  251. #define XM_ON_MESSAGE(event,proc) \
  252. if(msg->message == event) \
  253. { \
  254. proc (msg); \
  255. return; \
  256. }
  257. // 视窗回调函数定义结束
  258. #define XM_MESSAGE_MAP_END \
  259. XM_DefaultProc (msg); \
  260. }
  261. // 视窗定义
  262. #define XMHWND_DEFINE(x,y,cx,cy,hwnd,erase,lpWidget,cbWidget,alpha,type) \
  263. XMHWND hWnd_##hwnd## = {\
  264. x,y,cx,cy, \
  265. XMPROC(hwnd), \
  266. lpWidget, cbWidget, \
  267. alpha, \
  268. erase, \
  269. type, \
  270. 0, 0, 0, 0 \
  271. };
  272. #define XMHWND_DECLARE(hwnd) extern XMHWND hWnd_##hwnd##;
  273. // 获取视窗回调函数
  274. #define XMWDGTPROC(hwnd) WDGT_##hwnd##_WindowProc
  275. // 视窗回调函数声明
  276. #define XMWDGTPROC_DECLARE(hwnd) \
  277. extern void WDGT_##hwnd##_WindowProc (const XMWDGT *pWidget, BYTE bWidgetFlag, void *pUserData, XMMSG *msg);
  278. // 视窗回调函数定义开始
  279. #define WIDGET_MESSAGE_MAP_BEGIN(hwnd) \
  280. void WDGT_##hwnd##_WindowProc (const XMWDGT *pWidget,BYTE bWidgetFlag,void *pUserData,XMMSG *msg) {
  281. // 消息处理函数定义
  282. #define WIDGET_ON_MESSAGE(event,proc) \
  283. if(msg->message == event) \
  284. { \
  285. proc (pWidget,bWidgetFlag,pUserData,msg); \
  286. return; \
  287. }
  288. // 视窗回调函数定义结束
  289. #define WIDGET_MESSAGE_MAP_END \
  290. }
  291. // 消息传递控制选项
  292. #define XMMSG_OPTION_SYSTEMEVENT_DEFAULT_PROCESS 0x00000001 // 请求系统事件消息的缺省处理
  293. // structure definition
  294. // 消息结构定义
  295. typedef struct tagXMMSG {
  296. WORD message; // 消息类型
  297. WORD wp; // 消息字节参数
  298. DWORD lp; // 消息字参数
  299. DWORD option; // 消息控制选项
  300. } XMMSG;
  301. // 视窗栈定义
  302. typedef struct _HWND_NODE {
  303. HANDLE hwnd;
  304. BYTE * lpWidgetFlag; // 视窗的子控件标志
  305. void ** UserData; // 视窗子控件的用户数据
  306. void * PrivateData; // 窗口的私有数据
  307. BYTE flag; // 视窗的状态标志
  308. BYTE cbWidget; // 子控件个数
  309. BYTE alpha; // 视窗alpha因子
  310. UINT animatingDirection;
  311. //xm_osd_framebuffer_t framebuffer;
  312. } HWND_NODE;
  313. // 获取视窗结构的句柄
  314. #define XMHWND_HANDLE(hwnd) ((HANDLE)(&(hWnd_##hwnd##)))
  315. #define ADDRESS_OF_HANDLE(handle) ((void *)(handle))
  316. // typedef definition
  317. typedef void (*XMWNDPROC)(XMMSG *);
  318. typedef struct tagXMWND {
  319. // XMWNDPROC lpfnWndProc; // 控件消息回调函数
  320. XMCOORD _x; // 控件X坐标(绝对坐标)
  321. XMCOORD _y; // 控件X坐标(绝对坐标)
  322. XMCOORD _cx; // 控件宽度
  323. XMCOORD _cy; // 控件高度
  324. } XMWND;
  325. typedef struct tagXMWDGT {
  326. // XMWNDPROC lpfnWndProc; // 控件消息回调函数
  327. XMCOORD _x; // 控件X坐标(绝对坐标)
  328. XMCOORD _y; // 控件X坐标(绝对坐标)
  329. XMCOORD _cx; // 控件宽度
  330. XMCOORD _cy; // 控件高度
  331. DWORD dwTitleID; // 控件标题文本的资源ID.
  332. // 0 表示视窗定制,由视窗调用相应的控件文本设置函数完XM_XXXSetText
  333. // (DWORD)(-1)表示无文字输出,如按钮为图片时
  334. WORD wForBmpID; // 前景图片ID, 0 表示无图片。在Button中对应于释放时的图片效果
  335. WORD wBkgBmpID; // 背景图片ID, 0 表示无图片。在Button中对应于按下时的图片效果
  336. WORD wDisBmpID; // 禁止状态图片ID, 0 表示无图片
  337. BYTE bHotKey; // 与控件对应的热键。0 表示无热键对应
  338. BYTE bCommand; // 控件命令,0 表示无命令。
  339. // 控件热键按下或聚焦状态下按下空格,控件将该命令投递到消息队列。
  340. BYTE bFlag; // 控件初始状态。见 Widget控件标志定义
  341. BYTE bType; // 子控件类型。通过控件类型获取控件的回调函数
  342. } XMWDGT;
  343. // 视窗结构定义 (32字节,Cache line aligned)
  344. typedef struct tagXMHWND {
  345. XMCOORD _x; // 视窗X坐标(绝对坐标)
  346. XMCOORD _y; // 视窗Y坐标(绝对坐标)
  347. XMCOORD _cx; // 视窗宽度
  348. XMCOORD _cy; // 视窗宽度
  349. XMWNDPROC lpfnWndProc; // 视窗消息回调函数
  350. const XMWDGT *lpWidget; // 视窗子控件列表
  351. // 控件定义在ROM中,减小RAM的需求,不可以修改
  352. // 但可以修改控件的标志(Flag), 见 Widget控件标志定义
  353. BYTE cbWidget; // 控件的个数
  354. BYTE alpha; // 透明因子Alpha,0 全透明 255 全覆盖
  355. BYTE erase; // 是否擦除背景, 0 表示不擦除背景 1 表示擦除背景
  356. BYTE type; // 窗口类型 (视窗、弹窗)
  357. XMCOORD view_x; // 视窗窗口的x坐标
  358. XMCOORD view_y; // 视窗窗口的y坐标
  359. XMCOORD view_cx; // 视窗窗口的宽度
  360. XMCOORD view_cy; // 视窗窗口的高度
  361. DWORD scale_mode; // 视窗缩放模式,
  362. // 0 --> 自动缩放模式(缺省属性)
  363. // 1 --> 非缩放模式
  364. } XMHWND, *PXMHWND;
  365. // function protocol type
  366. // 获取消息,当消息队列为空时,用户任务挂起
  367. // 此函数仅允许内核使用,应用程序不允许使用。
  368. // XMBOOL XM_GetMessage (XMMSG *msg);
  369. // 检索指定的消息。
  370. // msg可为NULL,即删除指定的消息
  371. // bMsgFilterMin = 0 && bMsgFilterMax = 0表示检索所有消息
  372. // 成功返回TRUE,失败返回FALSE
  373. XMBOOL XM_PeekMessage(XMMSG *msg, BYTE bMsgFilterMin, BYTE bMsgFilterMax);
  374. //
  375. XMBOOL XM_GetMessage (XMMSG *msg);
  376. // 向消息队列投递消息
  377. XMBOOL XM_PostMessage (WORD message, WORD wp, DWORD lp);
  378. // 直接调用视窗回调函数
  379. // XMBOOL XM_SendMessage (WORD message, WORD wp, DWORD lp); // 已取消该函数
  380. // 派发消息
  381. XMBOOL XM_DispatchMessage (XMMSG *msg);
  382. // 终止系统事件消息的缺省处理
  383. void XM_BreakSystemEventDefaultProcess (XMMSG *msg);
  384. // 投递消息循环结束消息
  385. // wExitCode 定义
  386. #define XMEXIT_REBOOT (1) // 重启
  387. #define XMEXIT_SLEEP (2) // 关机
  388. #define XMEXIT_EXCEPT (3) // 异常
  389. #define XMEXIT_CHANGE_RESOLUTION (3) // 修改UI分辨率事件
  390. XMBOOL XM_PostQuitMessage (WORD wExitCode);
  391. // 清除消息队列中的所有消息
  392. void XM_FlushMessage (void);
  393. // 删除队列中所有非COMMAND消息
  394. void XM_FlushMessageExcludeCommandAndSystemEvent (void);
  395. // 设置及获取私有数据
  396. XMBOOL XM_SetWindowPrivateData (HANDLE hWnd, void *PrivateData);
  397. void * XM_GetWindowPrivateData (HANDLE hWnd);
  398. // 设置定时器(以ms为单位),idTimer为定时器ID
  399. XMBOOL XM_SetTimer (BYTE idTimer , DWORD dwTimeout);
  400. // 删除定时器
  401. XMBOOL XM_KillTimer (BYTE idTimer);
  402. // 系统缺省消息处理函数
  403. void XM_DefaultProc (XMMSG *msg);
  404. // 系统事件消息缺省处理
  405. // hWnd 当前视窗句柄
  406. // msg 系统事件消息
  407. void XM_DefaultSystemEventProc (HANDLE hWnd, XMMSG *msg);
  408. // 使整个窗口无效。系统投递XM_PAINT消息到消息队列尾部
  409. XMBOOL XM_InvalidateWindow (void);
  410. // 使某个控件无效。系统投递XM_PAINT消息到消息队列尾部
  411. XMBOOL XM_InvalidateWidget (BYTE bWidgetIndex);
  412. // 系统检查消息队列中的XM_PAINT消息。若存在,将其移至消息队列首部,以便在下一个消息循环中XM_PAINT消息被处理
  413. XMBOOL XM_UpdateWindow (void);
  414. // XM_PushWindow
  415. // 在当前视窗上压入新的视窗。应用于需要保存其过程且可以逐级返回的情形。
  416. // 执行Push操作后,消息队列被清空
  417. // 桌面不需要压入到栈中。当栈为空时,自动将桌面压入到栈顶。
  418. // 如字典应用中,检索初始界面-->检索结果界面-->字典正文界面-->正文属性界面,其视窗栈表示如下
  419. // 栈顶--> 正文属性界面
  420. // 字典正文界面
  421. // 检索结果界面
  422. // 栈底--> 检索初始界面
  423. XMBOOL XM_PushWindow (HANDLE hWnd);
  424. // 在压入新的视窗时,同时指定新窗口的定制信息
  425. // 定制信息(dwCustomData)通过XM_ENTER消息的lp参数传入
  426. XMBOOL XM_PushWindowEx (HANDLE hWnd, DWORD dwCustomData);
  427. // XM_PullWindow
  428. // 1) hWnd = 0, 弹出栈顶视窗,用于返回到前一个视窗。
  429. // 如从 “正文属性界面” 返回到 “字典正文界面”
  430. //
  431. // 2) hWnd != 0, 循环弹出栈顶视窗,直到找到指定的视窗(hWnd),并将该视窗置为栈顶视窗
  432. // 如输出一个字符,导致从 “正文属性界面” 返回到 “检索初始界面”
  433. XMBOOL XM_PullWindow (HANDLE hWnd);
  434. // XM_JumpWindow
  435. // 将视窗栈中所有视窗清除,然后跳到新的视窗。一般用于功能性跳转使用
  436. // 如上面的视窗栈情况下,按下“系统时间”功能键,会直接调用XM_WndGoto,跳转到“系统时间”。
  437. XMBOOL XM_JumpWindow (HANDLE hWnd);
  438. // 跳转(JUMP)视窗弹出类型定义
  439. typedef enum {
  440. XM_JUMP_POPDEFAULT = 0, // 将视窗栈中所有视窗清除(除去桌面),然后跳到新的视窗
  441. XM_JUMP_POPDESKTOP, // 将视窗栈中所有视窗清除(包括桌面),然后跳到新的视窗
  442. XM_JUMP_POPTOPVIEW, // 将视窗栈的栈顶视窗清除,然后跳到新的视窗
  443. } XM_JUMP_TYPE;
  444. // XM_JumpWindow
  445. // 将视窗栈中栈顶视窗或所有视窗清除(取决于JumpType),然后跳到新的视窗。一般用于功能性跳转使用
  446. // 如上面的视窗栈情况下,按下“系统时间”功能键,会直接调用XM_WndGoto,跳转到“系统时间”。
  447. XMBOOL XM_JumpWindowEx (HANDLE hWnd, DWORD dwCustomData, XM_JUMP_TYPE JumpType);
  448. // XM_GetWindowID
  449. // 获取当前视窗(即栈顶视窗)的唯一ID
  450. // 当栈中存在多个同一视窗句柄的视窗时,可区分每个视窗。
  451. BYTE XM_GetWindowID (void);
  452. // 矩形缩放
  453. XMBOOL XM_InflateRect (XMRECT *lprc, XMCOORD dx, XMCOORD dy);
  454. // 矩形移动
  455. XMBOOL XM_OffsetRect (XMRECT *lprc, XMCOORD dx, XMCOORD dy);
  456. // 将窗口(视窗或控件)坐标转换为屏幕坐标
  457. XMBOOL XM_ClientToScreen (HANDLE hWnd, XMPOINT *lpPoint);
  458. // 将屏幕坐标转换为窗口(视窗或控件)坐标
  459. XMBOOL XM_ScreenToClient (HANDLE hWnd, XMPOINT *lpPoint);
  460. // 获取窗口(视窗或控件)的位置信息
  461. XMBOOL XM_GetWindowRect (HANDLE hwnd, XMRECT* lpRect);
  462. // 设置窗口实例的位置(相对显示区原点)
  463. XMBOOL XM_SetWindowPos (HANDLE hWnd,
  464. XMCOORD x, XMCOORD y, // 屏幕坐标
  465. XMCOORD cx, XMCOORD cy
  466. );
  467. // 获取桌面的视窗句柄
  468. HANDLE XM_GetDesktop (void);
  469. // 获取桌面的显示区域坐标
  470. void XM_GetDesktopRect (XMRECT *lpRect);
  471. XMBOOL XM_SetRect (XMRECT* lprc, XMCOORD xLeft, XMCOORD yTop, XMCOORD xRight, XMCOORD yBottom);
  472. // 使能视窗创建、关闭时的动画效果
  473. XMBOOL XM_EnableViewAnimate (HANDLE hWnd);
  474. // 禁止视窗创建、关闭时的动画效果
  475. XMBOOL XM_DisableViewAnimate (HANDLE hWnd);
  476. // 设置当前聚焦控件
  477. XMBOOL XM_SetFocus (BYTE bWidgetIndex);
  478. // (BYTE)(-1)表示没有聚焦的控件
  479. BYTE XM_GetFocus (void);
  480. // 设置子控件的选择状态
  481. XMBOOL XM_SetSelect (BYTE bWidgetIndex, XMBOOL bSelect);
  482. // 设置子控件的使能状态
  483. XMBOOL XM_SetEnable (BYTE bWidgetIndex, XMBOOL bEnable);
  484. // 设置子控件的可视状态
  485. XMBOOL XM_SetVisual (BYTE bWidgetIndex, XMBOOL bVisual);
  486. // 获取控件的视窗子控件索引, 失败返回(BYTE)(-1)
  487. BYTE XM_GetWidgetIndex (const XMWDGT *pWidget);
  488. // 获取控件的用户数据
  489. void *XM_GetWidgetUserData (BYTE bWidgetIndex);
  490. // 设置控件的用户数据
  491. XMBOOL XM_SetWidgetUserData (BYTE bWidgetIndex, void *pUserData);
  492. // 获取当前视窗的句柄
  493. HANDLE XM_GetWindow (void);
  494. // 系统启动时由系统负责调用,只调用一次
  495. void XM_AppInit (void);
  496. // 系统启动时由系统负责调用,只调用一次
  497. void XM_AppExit (void);
  498. // 获取视窗关联的framebuffer对象
  499. // 仅在XM_PAINT消息时视窗被自动关联一个framebuffer对象
  500. // 其他消息处理过程中,若需要即刻刷新显示,执行以下流程
  501. // 1) 创建一个与视窗关联的framebuffer对象,XM_osd_framebuffer_create
  502. // 2) 设置framebuffer对象到视窗对象 XM_SetWindowFrameBuffer
  503. // 3) 执行显示过程
  504. // 4) 设置NULL framebuffer对象到视窗对象 XM_SetWindowFrameBuffer
  505. // 5) 关闭framebuffer,将修改刷新到显示设备 XM_osd_framebuffer_close
  506. //
  507. // 详细请参考 alert_view的CountDownPaint实现
  508. //
  509. //xm_osd_framebuffer_t XM_GetWindowFrameBuffer (HANDLE hWnd);
  510. // 设置视窗关联的framebuffer对象
  511. //
  512. // 详细请参考 alert_view的CountDownPaint实现
  513. //
  514. //XMBOOL XM_SetWindowFrameBuffer (HANDLE hWnd, xm_osd_framebuffer_t framebuffer);
  515. // 获取视窗的全局Alpha因子
  516. unsigned char XM_GetWindowAlpha (HANDLE hWnd);
  517. // 设置视窗的全局Alpha因子
  518. XMBOOL XM_SetWindowAlpha (HANDLE hWnd, unsigned char alpha);
  519. // 设置视图切换时Animating效果方向
  520. void XM_SetViewSwitchAnimatingDirection (UINT AnimatingDirection);
  521. // ALERTVIEW视图的按键回调函数定义
  522. // uKeyPressed 表示当前按下的物理按键键值
  523. typedef void (*FPALERTCB) (void *UserPrivate, UINT uKeyPressed);
  524. #define XM_COMMAND_OK 0
  525. #define XM_COMMAND_CANCEL 1
  526. typedef void (*FPOKCANCELCB) (UINT Command);
  527. #define XM_OKCANCEL_OPTION_ENABLE_POPTOPVIEW 0x00000001 // 弹出栈顶视窗
  528. #define XM_OKCANCEL_OPTION_SYSTEM_MODEL 0x00000002 // 系统模式, 忽略系统事件
  529. // ALERTVIEW视图的控制选项
  530. #define XM_ALERTVIEW_OPTION_ENABLE_COUNTDOWN 0x00000001 // "倒计时显示"使能
  531. #define XM_ALERTVIEW_OPTION_ENABLE_KEYDISABLE 0x00000002 // "禁止按键操作"使能
  532. #define XM_ALERTVIEW_OPTION_ENABLE_CALLBACK 0x00000004 // "按键回调函数"使能
  533. // 按钮按下时,调用按键回调函数
  534. // 按钮个数可以为0或非0
  535. #define XM_ALERTVIEW_OPTION_ADJUST_COUNTDOWN 0x00000008 // 使能倒计时计数调整
  536. // 视窗显示对齐方式选项定义
  537. #define XM_VIEW_ALIGN_CENTRE 0x00000001 // 视窗居中对齐(相对显示区域)
  538. #define XM_VIEW_ALIGN_BOTTOM 0x00000002 // 视窗底部居中对齐(相对显示区域)
  539. // 显示信息视图
  540. // 0 视图参数错误,视图显示失败
  541. // 1 视图创建并显示
  542. XMBOOL XM_OpenAlertView (
  543. DWORD dwInfoTextID, // 信息文本资源ID
  544. // 非0值,指定显示文字信息的资源ID
  545. DWORD dwImageID, // 图片信息资源ID
  546. // 非0值,指定显示图片信息的资源ID
  547. DWORD dwButtonCount, // 按钮个数
  548. // 当超过一个按钮时,
  549. // 第一个按钮,使用VK_F1(Menu)
  550. // 第二个按键,使用VK_F2(Mode)
  551. // 第三个按键,使用VK_F3(Switch)
  552. DWORD dwButtonNormalTextID[], // 按钮文字资源ID
  553. // 0
  554. // 表示没有定义Button,Alert仅为一个信息提示窗口。
  555. // 按任意键或定时器自动关闭
  556. // 其他值
  557. // 表示Button文字信息的资源ID,Alert需要显示一个按钮
  558. DWORD dwButtonPressedTextID[], // 按钮按下文字资源ID
  559. // 0
  560. // 表示没有定义该资源。
  561. // 按钮按下时使用dwButtonNormalTextID资源
  562. // 其他值
  563. // 表示Button按下时文字信息的资源ID
  564. DWORD dwBackgroundColor, // 背景色
  565. // 0
  566. // 表示使用缺省背景色
  567. // 其他值
  568. // 表示有效填充背景色,背景色可指定Alpha分量
  569. float fAutoCloseTime, // 指定自动关闭时间 (秒单位),
  570. // 0.0 表示禁止自动关闭
  571. float fViewAlpha, // 信息视图的视窗Alpha因子,0.0 ~ 1.0
  572. // 0.0 表示全透
  573. // 1.0 表示全覆盖
  574. FPALERTCB alertcb, // 按键用户回调函数
  575. void *UserPrivate, // 按键用户回调函数的私有参数
  576. DWORD dwAlignOption, // 视图的显示对齐设置信息
  577. // 相对OSD显示的原点(OSD有效区域的左上角)
  578. // XM_VIEW_ALIGN_CENTRE
  579. // 视窗居中对齐(相对OSD显示区域)
  580. // XM_VIEW_ALIGN_BOTTOM
  581. // 视窗底部居中对齐(相对OSD显示区域)
  582. DWORD dwOption // ALERTVIEW视图的控制选项
  583. // XM_ALERTVIEW_OPTION_ENABLE_COUNTDOWN
  584. // 倒计时显示使能
  585. // XM_ALERTVIEW_OPTION_ENABLE_KEYDISABLE
  586. // "禁止按键操作"使能
  587. );
  588. // 打开铃声音量调节视窗
  589. XMBOOL XM_OpenBellSoundVolumeSettingView (void);
  590. // 打开MIC录音音量调节视窗
  591. XMBOOL XM_OpenMicSoundVolumeSettingView (void);
  592. int XM_Main (void);
  593. #if defined (__cplusplus)
  594. }
  595. #endif /* end of __cplusplus */
  596. #endif // _XM_USER_H_