嵌入式开发交流网论坛

标题: 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