⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcugui.c

📁 Keil平台
💻 C
📖 第 1 页 / 共 5 页
字号:
/*
* Filename     : mcugui.c
* Author       : Li Dawen
* Copyright (c): Coslight Group .co
* Create Date  : 2002.04.27
* Version      : 0.1.0
*/

#define MCUGUI_MODULE

#include "config.h"

//#include "includes.h"
//#include "mcugui.h"
//#include "module.h"
//#include "save.h"
//#include "lcd.h"
//#include "resource.h"
//#include "dialog.h"
//#ifdef OS_CMX
//    #include "cxfuncs.h"
//    #include "hard.h"
//    #include "eeprom.h"
//#endif
//#ifdef OS_PMX
//    #include "pxfuncs.h"
//    #include "pxconfig.h"
//#endif
#define IDLE_CYC  800/(TICK_SIZE*2)

GUIMSGQ   MsgQ;
uint timeoutflag;
int Lcd_LampDelay = 0;
uchar MsgQueueBuf[GUIMSGBUF_SIZE];
int KeyMsgCount = 0;
int TimerCount[10];
int TimerFull[10];


/*****************************************************************************/
/* init and quit function */
void  InitGUI(void)
{
    uchar i;
    LcdInit();
    TimerInit();
    for (i = 0; i < 10; i++)
    {
        TimerCount[i] = -TimerFull[i];
    }
    
    MsgQ.msgbuf = MsgQueueBuf;
    MsgQ.head   = 0;
    MsgQ.tail   = 0;
    MsgQ.count  = 0;

    Gui.active_win  = 0;
    Gui.win_status  = 0;
    Gui.active_ctrl = 0;
    Gui.page_topy   = 0;
    Gui.ctrl_top    = 0;
    Gui.ctrl_bottom = 4;
    Gui.ctrl_last   = 4;
    Gui.quit = 0;
    TimeTick();
   // LoadWin(10);    //first win
	LoadWin(42);    //port frame  menu
}

void  QuitGUI(void)
{
    LcdClose();
}
/*****************************************************************************/
/* GUI window manage function */
uchar GetMsg(GUIMSG* msg)
{
    /* get key status*/
    uchar keycode;
    OSTimeDlyHMSM(0,0,0,5);//cxtwAtm(TICK_SIZE);//delay 改为系统延时
    if (kbhit())
    {
        //on lamp
        LcdOnLamp();
//        PostMsg(MSG_TSTART, 1);
        TimerAct(1, MSG_TSTART);
        Lcd_LampDelay = 0;
        BeepSet(4);
        keycode = (uchar)getch();
        if (keycode == KEY_F4)
        {
            Gui.quit = 1;
        }
        else
        {
            PostMsg(MSG_KEY, keycode);
        }
    }

    /* get msg from msg Queue*/
    if (MsgQ.count)
    {
        msg->type  = MsgQ.msgbuf[MsgQ.head++];
        msg->data  = MsgQ.msgbuf[MsgQ.head++];
        MsgQ.count--;
        if (MsgQ.head >= GUIMSGBUF_SIZE)
        {
            MsgQ.head = 0;
        }
        return TRUE;
    }
    else
    {
        msg->type = MSG_IDLE;
        msg->data = 0;
        return FALSE;
    }
}

void  PostMsg(uchar type, uchar data)
{
    if (MsgQ.count < GUIMSG_COUNT)
    {
        // avoid in a row MSG
        if ((MsgQ.last_type == type) && (MsgQ.last_data == data))
        {
            return;
        }
        MsgQ.msgbuf[MsgQ.tail++] = type;
        MsgQ.msgbuf[MsgQ.tail++] = data;
        MsgQ.last_type = type;
        MsgQ.last_data = data;
        if (MsgQ.tail >= GUIMSGBUF_SIZE)
        {
            MsgQ.tail = 0;
        }
        MsgQ.count++;
    }
    else
    {
        Gui.err = ERR_MSGBUFOVER;
    }
}

void  SendMsg(uchar type, uchar data)
{
    Win[Gui.active_win].proc(type, data);
}
int GuiPop(void)
{
    if (Gui.stack_top > 0)
    {
        return Gui.stack_buf[Gui.stack_top--];
    }
    else
    {
        Gui.err = 1;
        return 0;
    }
}

void GuiPush(int value)
{
    if (Gui.stack_top < 9*8)
    {
        Gui.stack_buf[++Gui.stack_top] = value;
    }
    else
    {
        Gui.stack_top = 9;
    }
}
int GuiStack(void)
{
    return Gui.stack_top;
}
void  LoadWin(int index)
{
    int i;
    if (Gui.active_win == index)
    {
        LcdCls();
        PostMsg(MSG_PAINT, 0xFF);
        return;
    }
    GuiPush(Gui.active_win);
    GuiPush(Gui.win_status);
    GuiPush(Gui.active_ctrl);
    GuiPush(Gui.page_topy);
    GuiPush(Gui.ctrl_top);
    GuiPush(Gui.ctrl_bottom);
    GuiPush(Gui.ctrl_last);
    GuiPush(Gui.page);
    GuiPush(Gui.max_page);

    Gui.active_win = index;
    Gui.win_status = Win[index].style;
    Gui.active_ctrl= 0;
    Gui.page_topy  = 0;
    Gui.ctrl_top   = 0;
    i = 0;
    while (1)
    {
        if (Win[index].controls[i].y < 8)
        {
            Gui.ctrl_bottom = i;
        }
        if (Win[index].controls[i].type & CTRL_END)
        {
            Gui.ctrl_last = i;
            break;
        }
        i++;
    }
    Gui.page = 0;
    if (Win[Gui.active_win].style & WS_PAGESCROLL)
    {
        Gui.max_page = Win[index].controls[Gui.ctrl_last].y/8;
    }
    else
    {
        Gui.max_page = Win[index].controls[Gui.ctrl_last].y/2;
    }

    LcdWinStyle(Win[Gui.active_win].style);
    PostMsg(MSG_INIT, 0);
    MoveFocus(FOCUS_HOME);
    LcdCls();
    PostMsg(MSG_PAINT, 0xFF);
    if (Win[Gui.active_win].style & BS_NOFOCUS)
    {
        Gui.win_status = 0;
        LcdCursorSize(0);
    }
    else
    {
        if (Gui.win_status&WS_EDITON)
        {
            LcdCursorSize(8);
        }
        else
        {
            LcdCursorSize(0);
        }
    }
}

void  CloseWin(void)
{
    Gui.page = 0;
    Gui.max_page = 0;
    if (GuiStack() > 9)
    {
        Gui.max_page    = GuiPop();
        Gui.page        = GuiPop();
        Gui.ctrl_last   = GuiPop();
        Gui.ctrl_bottom = GuiPop();
        Gui.ctrl_top    = GuiPop();
        Gui.page_topy   = GuiPop();
        Gui.active_ctrl = GuiPop();
        Gui.win_status  = GuiPop();
        Gui.active_win  = GuiPop();
        LcdWinStyle(Win[Gui.active_win].style);
    }

    LcdCls();
    if (Gui.win_status&WS_EDITON)
    {
        LcdCursorSize(8);
    }
    else
    {
        LcdCursorSize(0);
    }
    PostMsg(MSG_PAINT, 0xFF);
}
/*****************************************************************************/

void  MainGUIProc()
{
    GUIMSG msg;
    InitGUI();
    LcdCls();
    do {
        if (GetMsg(&msg))
            Win[Gui.active_win].proc(msg.type, msg.data);
//        else
//            PostMsg(MSG_PAINT, 0xFF);
        if (Gui.quit)
            break;
    }while(TRUE);
}

/**/
void  DefaultWinProc(uchar msg_type, uchar msg_data)
{
//    int i;
    const CONTROL *ctrl;
    ctrl = &Win[Gui.active_win].controls[Gui.active_ctrl];
    switch (msg_type)
    {
    case MSG_KEY:
        if (Gui.win_status&WS_EDITON)
        {
            switch (ctrl->type&MASK_CTRLTYPE)
            {
                case CTRL_EDIT: EditCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
                case CTRL_LIST: ListCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
                default: break;
            }
        }
        else
        {
            switch (msg_data)
            {
            case KEY_HELP:
                if (Win[Gui.active_win].tag[0])
                {
                    HelpBox("", Win[Gui.active_win].tag, 0);
                }
                else if (Win[Gui.active_win].style & BS_NOFOCUS)
                {
                    HelpBox("", HelpText[2], 0);
                }
                else
                {
//                    HelpBox("", HelpText[11], 0);
                    
                    switch (ctrl->type&MASK_CTRLTYPE)
                    {
                    case CTRL_EDIT: EditCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
                    case CTRL_LIST: ListCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
                    case CTRL_BUTTON: ButtonCtrlProc(Gui.active_ctrl, msg_type, msg_data);  break;
                    default:    break;
                    }
                    
                }
                break;
            case KEY_OK:
                switch (ctrl->type&MASK_CTRLTYPE)
                {
                case CTRL_EDIT: EditCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
                case CTRL_LIST: ListCtrlProc(Gui.active_ctrl, msg_type, msg_data); break;
                case CTRL_BUTTON: ButtonCtrlProc(Gui.active_ctrl, msg_type, msg_data);  break;
                default:    break;
                }
                break;
            case KEY_ESC:    PostMsg(MSG_CLOSE, 0);     break;

            case KEY_UP:     
                //PostMsg(MSG_FOCUSMOVE, FOCUS_PREV); 
                MoveFocus(FOCUS_PREV);
                break;
            case KEY_DOWN:   
                //PostMsg(MSG_FOCUSMOVE, FOCUS_NEXT); 
                MoveFocus(FOCUS_NEXT);
                break;
            case KEY_LEFT:   
                //PostMsg(MSG_FOCUSMOVE, FOCUS_HOME); 
                MoveFocus(FOCUS_HOME);
                break;
            case KEY_RIGHT:  
                //PostMsg(MSG_FOCUSMOVE, FOCUS_END);  
                MoveFocus(FOCUS_END);
                break;
        
            case KEY_DATA:  PostMsg(MSG_LOAD, 62);  break;
            default: break;
            }
            PostMsg(MSG_PAINT, 0xFF);
        }
        break;

    case MSG_LOAD:      LoadWin(msg_data);    break;
    case MSG_CLOSE:     CloseWin();           break;
    case MSG_CLS:       LcdCls();               break;
    case MSG_INIT:                      break;
    case MSG_COMMAND:   CommandProc(msg_data);  break;

    case MSG_SCROLLUP:   SrcollUp(); break;
    case MSG_SCROLLDOWN: SrcollDown(); break;
    case MSG_FOCUSMOVE:
        MoveFocus(msg_data);
        PostMsg(MSG_PAINT, 0xFF);
        break;

    case MSG_UPDATA:
        if (msg_data == 0xFF)
        {
            LcdUpdate();
        }
        break;
    case MSG_PAINT:
        WinPaint(msg_type, msg_data);
        break;
    case MSG_SAVE:
        break;

    case MSG_TIMER:
        if (msg_data == TIME_CHANGE_SEC)
        {
            PostMsg(MSG_PAINT, 0xFF);
        }
        TimerProc(msg_data);
        break;
    case MSG_TPLAY:
    case MSG_TSTART:
    case MSG_TSTOP:
    case MSG_TOUT:
    case MSG_TRELOAD: 
        TimerAct( msg_data, msg_type); 
        break;
    case MSG_IDLE: 
        GuiIdle(); 
        break;
    case MSG_NULL:  
        break;
    default:
        break;
    }

}

/*****************************************************************************/
void WinPaint(uchar msg_type, uchar msg_data)
{
    int i;
    const CONTROL   *ctrl;
    ctrl = &Win[Gui.active_win].controls[Gui.active_ctrl];
    if (msg_data == 0xFF)
    {
        if ( (Win[Gui.active_win].style & ES_NOCAPTION) == 0 && (Gui.page_topy == 0))
        {
            TextOut(0, 0, Win[Gui.active_win].caption, FONT_DEFAULT);
        }
        for (i = Gui.ctrl_top; i <= Gui.ctrl_bottom; i++)
        {
            switch (Win[Gui.active_win].controls[i].type&MASK_CTRLTYPE)
            {
            case CTRL_EDIT:     EditCtrlProc(i, MSG_PAINT, 0);      break;
            case CTRL_BUTTON:   ButtonCtrlProc(i, MSG_PAINT, 0);    break;
            case CTRL_LIST:     ListCtrlProc(i, MSG_PAINT, 0);      break;
            case CTRL_GRID:     GridCtrlProc(i, MSG_PAINT, 0);      break;
            case CTRL_CLOCK:    ClockCtrlProc(i, MSG_PAINT, 0);     break;
            case CTRL_BMP:      BmpCtrlProc(i, MSG_PAINT, 0);       break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -