clockapp.cpp

来自「c语言源玛,扫描的游戏代码,攻大家看.多体意见」· C++ 代码 · 共 184 行

CPP
184
字号

#include "ClockApp.h"
#include "Ring.h"

//这是一个“全局的临时变量”。显示的时候很多地方需要用到LEDBUFF作临时变量
//因此这里声明一个全局变量,这样代理里直接使用就可以,可以减少对栈空间的
//使用,及栈操作所耗时间
LEDBUFF led;

CClockApp *CClockApp::clockApp = NULL;
CClockApp::CClockApp()
{
#ifdef WIN32
    m_keystate = 0; m_keytick=0;
    m_tick = 0;
    m_led_lum = 0;
#endif
    m_currentFunc = &m_clock;
    clockApp = this;
}

CClockApp::~CClockApp()
{

}

void CClockApp::On64HzTimer()
{
    static UCHAR tick = 0;
    tick++;
    if(!(tick & 3)){
        // 16Hz, 日历计时
        m_clock.OnTick();
        m_datesetup.OnTick();
        m_timesetup.OnTick();
        m_alarmsetup.OnTick();
    }else if(2 == (tick & 3)){
        // 1/16节拍
        CRing::OnTick();
    }
    // 64Hz, 键盘扫描
    OnKeyboardTick();
}

//64Hz
void CClockApp::OnKeyboardTick()
{
    static USHORT resettick = 0;

    //按键状态检测
    static UCHAR keystate = 0;
    UCHAR key = GetKeyState();
    if(key == keystate && key != m_keystate){//按键变化了
        key ^= m_keystate; //哪个按键变化了
        if(key & m_keystate){//松开
            if(m_keystate == 0xff){
                if(keystate == 0) m_keystate = 0;
                return;
            }
            if((m_keystate == (KEY_LEFT|KEY_ADD)) ||
               (m_keystate == (KEY_LEFT|KEY_DEC))){
                if(key == KEY_ADD){// 左键+上键
                    if(m_led_lum < 4){
                        m_led_lum++; //LED亮度增加
                        CRing::Beep(1000, 1);
                    }
                }else if(key == KEY_DEC){//左键+下键
                    if(m_led_lum){
                        m_led_lum--;     //LED亮度降低
                        CRing::Beep(1000, 1);
                    }
                }else if(key == KEY_RIGHT){//左键+右键
                    //把秒置0
                    //if(m_currentFunc == &m_clock) m_clock.SetSecondZero();
                }
                m_keystate = KEY_LEFT;
                return;
            }
            OnKeyPress(key, m_keytick / 1000, 0);
            resettick = 10*64;
        }else{//按下
            if(m_keystate == 0xff) return;
            if(m_keystate == KEY_LEFT /*&& // 左键+上下键
               (key == KEY_ADD || key == KEY_DEC || key)*/){
                 m_keystate |= key;
                 return;
            }

            //如果正在播放闹钟的铃声
            if(CRing::IsPlayingRing()){
                //停止铃声
                CRing::StopRing();
                m_keystate = 0xff; //等待松开所有按键
                return;
            }
            switch(keystate){
            case 1:
            case 2:
            case 4:
            case 8:
            case 16:
            case 32:
            case 64:
            case 128:
                //单键按下
                m_keytick = 1;
                //m_keystate = keystate = key;
                CRing::Beep(1000, 1);
                OnKeyPress(key, 0, 1);
                resettick = 10*64;
                break;
            default:
                //多个键按下
                CRing::Beep(1500, 3);
                if(m_keystate && m_keystate != 0xff){
                    OnKeyPress(m_keystate, m_keytick / 1000, 0);
                    m_keystate = 0xff; //等待松开所有按键
                }
                resettick = 0;
                break;
            }
        }
        if(m_keystate != 0xff) m_keystate = keystate;
        return;
    }else if(m_keystate && m_keystate != 0xff){
        static UCHAR sendkey = 0;
        if(m_keytick < 60000) m_keytick += 1000/64;
        if(m_keytick > 1000 && !sendkey){//持续按住键1秒以后才开始连发按键
            OnKeyPress(m_keystate, m_keytick / 1000, 1);
            resettick = 10*64;
        }
        if(sendkey >= 9) sendkey = 0;
        else sendkey++;
    }
    /*if(keystate != 0xff) */keystate = key;

    //显示状态管理
    if(resettick && !m_keystate){
        if(!--resettick){//长时间没有按键了
            //切换到正常的时间显示
            if(m_currentFunc != &m_clock){
                m_currentFunc->OnKillFocus();
                m_currentFunc = &m_clock;
                m_currentFunc->OnSetFocus();
            }
        }
    }
}

void CClockApp::OnKeyPress(UCHAR key, UCHAR sec, UCHAR down)
{
    if(!m_currentFunc->OnKeyPress(key, sec, down)){
        static CInterface *faces[] = {&m_timesetup, &m_datesetup, &m_alarmsetup};
        static UCHAR facesIndex = 0;
        if((key == KEY_PREV || key == KEY_NEXT) && !down && !sec){//按上下键
            if(key == KEY_NEXT){
                if(facesIndex >= sizeof(faces)/sizeof(faces[0]) -1) facesIndex = 0;
                else facesIndex++;
            }else{
                if(facesIndex == 0) facesIndex = sizeof(faces)/sizeof(faces[0]) -1;
                else facesIndex--;
            }
            m_currentFunc->OnKillFocus();
            m_currentFunc = faces[facesIndex];
            m_currentFunc->OnSetFocus();
        }else if(key == KEY_RIGHT && down && sec > 4){//长按右键
            m_currentFunc->OnKillFocus();
            if(m_currentFunc == &m_clock){//进入设置模式
                m_currentFunc = faces[facesIndex = 0];
                m_currentFunc->OnSetFocus();
            }else{//退出设置模式
                m_currentFunc = &m_clock;
                m_currentFunc->OnSetFocus();
            }
            CleanKeystate();//等待释放右键
        }
    }
}

void CClockApp::CleanKeystate()
{
    if(m_keystate) m_keystate = 0xff;
}

⌨️ 快捷键说明

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