爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1691|回复: 9
收起左侧

[其它] SIEAPI.H公用函数库(2008-1-05更新,大家一起来完善)

[复制链接]
发表于 2007-10-24 16:27:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
写这个函数库的目的,就是为了相同功能的函数代码,放在一个文件中,以方便在写程序调用时使用!

使用:把sieapi.h复制到编译器中的inc目录下
在文件头中写上#include "..\inc\sieapi.h"
就可以使用文件里面的函数了!

目前的函数列表:
//获取手机内部对应的字体
 __INTRINSIC uint FontType(int index);
 //播放声音文件,支持手机内部所有声音文件
 __INTRINSIC int PlayMusic(const char *fname, uint VOLUME, uint RepeatNum);
 //动态菜单创建函数
 __INTRINSIC TMenu *BuildMenu(char *Title[]);
 __INTRINSIC void DrawMenu(void *gui, int cur_item, void *user_pointer);
 __INTRINSIC void FreeMenu(TMenu *Menu);
 __INTRINSIC int  MenuCount(TMenu *Menu);
 //文件菜单相关函数
 __INTRINSIC int  FileCount(TFile *File);
 __INTRINSIC void FreeFile(TFile *File);
 //媒体功能是否使用中-------------
 __INTRINSIC int IsMediaActive(void);
 //十六进制转换为十进制-----------
 __INTRINSIC ulong HexToInt(char *HEX);
 //数据转换
 __INTRINSIC void  Ascii2WS(uword *data,WSHDR *ws, const char *s, int maxlen);
 __INTRINSIC void  WS2Ascii(uword *data, WSHDR *ws, char *s, int maxlen);
 __INTRINSIC void  FreeFontLib(uword *data);//释放字库内存
 __INTRINSIC uword *LoadFontLib(void);//加载字库内存
 //二十四节气
 __INTRINSIC void  LunarHolDay(WSHDR* ws,int LunarId);//返回对应的二十四节气字串
 __INTRINSIC int   LunarHolId(TDate date);//返回对应的二十四节气ID(1..24)
 __INTRINSIC ubyte LunarYearId(ulong year);// 返回某公历是否闰年
 __INTRINSIC uword BetweenDaySum(TDate start,TDate end);//计算两日期之间的天数
 __INTRINSIC uword GetDayFromYearBegin(ulong AYear,ubyte AMonth,ubyte ADay);// 取某日期到年初的天数
 __INTRINSIC ubyte FileExists(char *FileName,int *Handle);//判断文件是否存在!

添加数据类型:
#define word  unsigned short
#define uint  unsigned int
#define ulong unsigned long
#define uchar unsigned char
#define TVoid typedef void
#define TStruct typedef struct
添加数据结构:
//定义区域属性
TStruct{
  int t;//top
  int l;//left
  int r;//Right;
  int b;//Bottom;
}TRect;
//定义字体属性
TStruct{
  char Pen[4];//文字颜色
  char Brush[4];//边框颜色
  word Size;//字体大小
}TFont;
函数下载地址(sieapi.h):
http://sieelf.googlecode.com/svn/SieELF/inc

[ 本帖最后由 comerose 于 2008-1-5 10:16 编辑 ]

评分

参与人数 1金钱数 +200 贡献分 +1 收起 理由
subiaoyi + 200 + 1 支持一下

查看全部评分

发表于 2007-10-24 18:04:28 | 显示全部楼层
using _CSTD strtoul;

这个不需要IAR的library中已经带了。。。在library那里设置为nomarl就可以了,所以国外的swilib就把这个函数删了。。。

extern  unsigned  long   strtoul  (const  char  *nptr,char  **endptr,int  base);
就可以。


下面是rect_patcher.h,这里面的东西可以统一一下,还有一些的,忘了。。。具体看着办吧

#pragma inline
void patch_rect(RECT*rc,int x,int y, int x2, int y2)
{
  rc->x=x;
  rc->y=y;
  rc->x2=x2;
  rc->y2=y2;
}

#pragma inline
void patch_header(const HEADER_DESC* head)
{
  ((HEADER_DESC*)head)->rc.x=0;
  ((HEADER_DESC*)head)->rc.y=YDISP;
  ((HEADER_DESC*)head)->rc.x2=ScreenW()-1;
  ((HEADER_DESC*)head)->rc.y2=HeaderH()+YDISP-1;
}

#pragma inline
void patch_input(const INPUTDIA_DESC* inp)
{
  ((INPUTDIA_DESC*)inp)->rc.x=0;
  ((INPUTDIA_DESC*)inp)->rc.y=HeaderH()+1+YDISP;
  ((INPUTDIA_DESC*)inp)->rc.x2=ScreenW()-1;
  ((INPUTDIA_DESC*)inp)->rc.y2=ScreenH()-SoftkeyH()-1;
}

#pragma inline
int get_string_width(WSHDR *ws, int font)
{
  int width=0;
  unsigned short *body=ws->wsbody;
  int len=body[0];
  while(len)
  {
    width+=GetSymbolWidth(body[len],font);
    len--;
  }
  return (width);
}

#pragma inline
void patch_dialog(INPUTDIA_DESC* dialog, int x,int y,int x2, int y2)
{
  dialog->rc.x = x;
  dialog->rc.y = y;
  dialog->rc.x2 = x2;
  dialog->rc.y2 = y2;
}

评分

参与人数 1金钱数 +200 收起 理由
subiaoyi + 200 奖励:感谢-你和大家分享资源与经验!

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2007-10-24 18:14:49 | 显示全部楼层

                               
登录/注册后可看大图


再支持一下。。。

不过我觉得不需要用sieapi这么笼统的称呼,还是分类整合比较好。
回复 支持 反对

使用道具 举报

发表于 2007-10-27 23:57:26 | 显示全部楼层
#pragma inline
int get_string_width(WSHDR *ws, int font)
{
  int width=0;
  unsigned short *body=ws->wsbody;
  int len=body[0];
  while(len)
  {
    width+=GetSymbolWidth(body[len],font);
    len--;
  }
  return (width);
}


建议while(len)
改成while(0<len)
以为如果有不可知的结果有初始化时body[0]<0,那这个循环就不能退出了
当然有的系统会检查body[len]是否越界,那么就没有这个问题了,因为这时len越界,系统就会当掉,呵呵!

[ 本帖最后由 lz_email 于 2007-10-28 00:00 编辑 ]

评分

参与人数 1金钱数 +215 收起 理由
binghelingxi + 215 有见地,建议加入ELF开发

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2007-10-28 08:58:04 | 显示全部楼层
补全函数库的同时能否有详细的函数说明,WIN32都有API手册或者MSDN可查,编ELF什么都没有,很让人郁闷啊
回复 支持 反对

使用道具 举报

发表于 2007-10-28 15:57:23 | 显示全部楼层
cfgeditcn中的代码,配合cnfont.dat可以实现中文直接输出,中文化elf的一种途径。
集合在一起就不用每一个文件都要增加了。

void init_font_lib(void);\\这个是读取数据,放在main里面

void free_font_lib(void);\\这个在killer里面

// GB2UC  用法类似utf8_2ws,maxlen为0好像就不限制长度。
void ascii2ws(WSHDR *ws, const char *s, int maxlen);


// UC2GB 用法类似ws2utf8,maxlen为0好像就不限制长度。
void ws2ascii(WSHDR *ws, char *s, int maxlen);

code.c

1.78 KB, 下载次数: 1

code.h

228 Bytes, 下载次数: 0

回复 支持 反对

使用道具 举报

发表于 2007-10-28 16:27:58 | 显示全部楼层
建议建立一个
int  asciisprintf (WSHDR *,const char *format,...);
像wsprintf 一样的输出,这样就可以ascii的格式化输出了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-9 01:10:29 | 显示全部楼层
函数更新有!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-5 10:17:06 | 显示全部楼层
更新一下函数!
回复 支持 反对

使用道具 举报

发表于 2008-1-5 10:34:03 | 显示全部楼层
intprintf(const char *fmt, ...)
{
    const char *s;
    int d;
    char buf[16];
    va_listap;
    va_start(ap, fmt);
    while (*fmt) {
        if (*fmt != %) {
            putchar(*fmt++);
            continue;
        }
        switch (*++fmt) {
            case s:
                s = va_arg(ap, const char *);
                for ( ; *s; s++) {
                    putchar(*s);
                }
                break;
            case d:
                d = va_arg(ap, int);
                itoa(d, buf, 10);
                for (s = buf; *s; s++) {
                    putchar(*s);
                }
                break;
            /* Add other specifiers here... */              
            default:  
                putchar(*fmt);
                break;
        }
        fmt++;
    }
    va_end(ap);
    return 1;   /* Dummy return value */
}

根据这个可以编写出asciisprintf 吗???????????、
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2025-6-3 09:18

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表