嵌入式开发交流网论坛
标题:
parseRC.c 实现minitos Menu 的菜单资源分析,资源见abc.rc
[打印本页]
作者:
福拓电子3
时间:
2020-6-29 07:24
标题:
parseRC.c 实现minitos Menu 的菜单资源分析,资源见abc.rc
/*
minitos Menu 采用和Windows一样的菜单设计API,快速设计嵌入式菜单系统。
可以根据所选择的菜单触发一个子程序运行。(酷吧,像windows的事件函数一样
)
minitos就是 mini Task OS.
http://www.dianzixuexi.com
电子学习网
minitos 嵌入操作系统 :
http://www.dianzixuexi.com
minitos相关频道
minitos Windows C++嵌入图形系统
http://www.dianzixuexi.com
Copyright (C) 福州福拓电子科技有限公司
本文实现minitos Menu 的菜单资源分析,资源见abc.rc
created by Linls,2003.8
*/
#include <stdio.h>
#include "Menu.h"
extern void rc__CreatePopupMenu(HMENU hMenu_Top,char Context[]);
//资源文件临时缓冲区
char RCBuf[1024*10],*pRCBuf;
//..........................................................
//return 0--fail
int ReadRCFile(char *RcName)
{
FILE *fp;
int i=0;
if( (fp=fopen(RcName,"r"))==NULL )
{
mos_printf("File Open Fail\r");
return 0;
}
while( !feof(fp) )
{
RCBuf
=fgetc(fp);
i++;
}
fclose(fp);
return 1;
}
void InitMenuRCBuf(char *RcName)
{
//...............................................
//初始化,移植,需要修改此处
ReadRCFile(RcName);
pRCBuf = &RCBuf[0];
}
//..........................................................
//是否字符为标示符字符
//"a..z A..Z 0..9 _"
int IsIdChar(char c)
{
if( (c>='a')&&(c<='z') )
return 1;
if( (c>='A')&&(c<='Z') )
return 1;
if( (c>='0')&&(c<='9') )
return 1;
return 0;
}
int IsNumber(char c)
{
if( (c>='0')&&(c<='9') )
return 1;
return 0;
}
//是否为分隔符 空格和TAB
int IsFGF(char c)
{
//空格和TAB
if( (c==0x20)||(c==0x09) )
return 1;
return 0;
}
//分隔符 , ;
int IsFGF_2(char c)
{
//空格和TAB
if( (c==0x20)||(c==0x09)||(c==',')||(c==';') )
return 1;
return 0;
}
//是否为分隔符 空格和TAB,0d,0a
int IsFGF_CR(char c)
{
//空格和TAB,0d,0a
if( (c==0x20)||(c==0x09)||(c==0x0d)||(c==0x0a) )
return 1;
return 0;
}
//跳过分隔符
void SkipFGF(void)
{
char c;
c= *pRCBuf;
//跳过分隔符
while( IsFGF(c) )
{
pRCBuf++;
c = *pRCBuf;
};
}
//跳过分隔符 , ;
void SkipFGF_2(void)
{
char c;
c= *pRCBuf;
//跳过分隔符
while( IsFGF_2(c) )
{
pRCBuf++;
c = *pRCBuf;
};
}
//跳过分隔符和回车
void SkipFGF_CR(void)
{
char c;
c= *pRCBuf;
//跳过分隔符和回车
while( IsFGF_CR(c) )
{
pRCBuf++;
c = *pRCBuf;
};
}
void GetCurrChar(char *CurrChar)
{
*CurrChar = *pRCBuf;
pRCBuf++;
}
//取一个有效字符,除空格,tab,0d,0a外都是有效字符
void GetValueChar(char *CurrChar)
{
char c;
c= *pRCBuf;
//跳过分隔符和回车
while( IsFGF_CR(c) )
{
pRCBuf++;
c = *pRCBuf;
};
*CurrChar = c;
pRCBuf++;
}
//回退一个字符
void ReturnOneChar(void)
{
pRCBuf--;
}
//从当前指针开始取一个标示符串
void GetIdStr(char str[])
{
char c;
int i;
c= *pRCBuf;
memset(str,0,100);
//跳过分隔符
while( ! IsIdChar(c) )
{
pRCBuf++;
c= *pRCBuf;
};
for(i=0;;i++)
{
str
= c;
pRCBuf++;
c= *pRCBuf;
if( ! IsIdChar(c) )
break;
}
}
//从当前指针开始取一个标示符串
void GetNumStr(char str[])
{
char c;
int i;
c= *pRCBuf;
memset(str,0,100);
//跳过非标示符
while( ! IsNumber(c) )
{
pRCBuf++;
c= *pRCBuf;
};
for(i=0;;i++)
{
str
= c;
pRCBuf++;
c= *pRCBuf;
if( ! IsNumber(c) )
break;
}
}
//取引号串里的内容
void Get_YH_Str(char str[])
{
char c;
int i;
c= *pRCBuf;
memset(str,0,100);
for(i=0;;i++)
{
str
= c;
pRCBuf++;
c= *pRCBuf;
//取到引号退出
if( c=='\"' )
break;
}
}
//bug???
//以后使用 MENUAPI HMENU CreateMenu_RC(char *RcName,PMENUITEM Item[])
//这样可以为每个菜单项设置指针,以后可设置菜单项参数
//
MENUAPI HMENU CreateMenu_RC(char *RcName)
{
char IdStr[100];
char CurrChar;
HMENU hPopupMenu_Top;
InitMenuRCBuf(RcName);
//................................................
//1.分析语法,如错误退出,bug??????
//............................................................
//2. 语法正确
hPopupMenu_Top = CreatePopupMenu();
memset(IdStr,0,100);
GetIdStr(IdStr); // MyMenu
GetIdStr(IdStr); // MENU
GetValueChar(&CurrChar); //{
while(1)
{
GetIdStr(IdStr); // POPUP/ITEM
if( !strcmp(IdStr,"ITEM") )
{
//ITEM
char Context1[100];
char NumStr[100];
int id;
SkipFGF_2();
GetCurrChar(&CurrChar); //"
Get_YH_Str(Context1); //File
GetCurrChar(&CurrChar); //"
SkipFGF_2();
GetNumStr(NumStr); //201
id= atoi(NumStr);
//菜单中加入该项
AppendMenu(hPopupMenu_Top,MF_ENABLED,id,Context1);
//可以定义一个菜单项指针数组,appendMenu完成后,把该菜单项付给给数组一项,以后可以利用该指针使用SetItemParam
}else
{
//POPUP
char Context2[100];
SkipFGF_2();
GetCurrChar(&CurrChar); //"
Get_YH_Str(Context2); //File
GetCurrChar(&CurrChar); //"
rc__CreatePopupMenu(hPopupMenu_Top,Context2);
}
GetValueChar(&CurrChar);
//结束符号
if (CurrChar=='}')
break;
else
{
ReturnOneChar();
}
}
return hPopupMenu_Top;
}
void rc__CreatePopupMenu(HMENU hMenu_Top,char Context[])
{
char IdStr[100];
char CurrChar;
HMENU hMenu;
hMenu = CreatePopupMenu();
AppendMenu(hMenu_Top,MF_POPUP,hMenu,Context);
GetValueChar(&CurrChar); //{
while(1)
{
GetIdStr(IdStr); // POPUP/ITEM
if( !strcmp(IdStr,"ITEM") )
{
//ITEM
char Context1[100];
char NumStr[100];
int id;
SkipFGF_2();
GetCurrChar(&CurrChar); //"
Get_YH_Str(Context1); //File
GetCurrChar(&CurrChar); //"
SkipFGF_2();
GetNumStr(NumStr); //201
id= atoi(NumStr);
//菜单中加入该项
AppendMenu(hMenu,MF_ENABLED,id,Context1);
}else
{
//POPUP
char Context2[100];
SkipFGF_2();
GetCurrChar(&CurrChar); //"
Get_YH_Str(Context2); //File
GetCurrChar(&CurrChar); //"
rc__CreatePopupMenu(hMenu,Context2);
}
GetValueChar(&CurrChar);
//结束符号
if (CurrChar=='}')
break;
else
{
ReturnOneChar();
}
}//while(1)
}
欢迎光临 嵌入式开发交流网论坛 (http://www.dianzixuexi.com/bbs/)
Powered by Discuz! X3.2