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 + -
显示快捷键?