77范文网 - 专业文章范例文档资料分享平台

MINIGUI输入模块代码文件分析(8)

来源:网络收集 时间:2019-04-09 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

timeout_count = __mg_timer_counter + repeat_threshold;

// repeat last event

if (old_lwe.type == LWETYPE_KEY //如果旧底层事件类型为LWETYPE_KEY && old_lwe.data.ke.event == KE_KEYDOWN) {//且为KEYDOWN类型 memcpy (lwe, &old_lwe, sizeof (LWEVENT)); //将旧事件复制给lwe lwe->data.ke.status |= KS_REPEATED;//将lwe的键盘状态设置为重复 return 1; }

if (!(old_lwe.type == LWETYPE_MOUSE //如果旧底层事件类型为鼠标事件 && (old_lwe.data.me.event == ME_LEFTDOWN || old_lwe.data.me.event == ME_RIGHTDOWN || old_lwe.data.me.event == ME_MIDDLEDOWN))) {

//且为鼠标左键或右键或者中间键的击键事件

// reset delay time

timeout_count = __mg_timer_counter + timeout_threshold; }

// reset delay time

lwe->type = LWETYPE_TIMEOUT;设置事件类型为超时事件 lwe->count = __mg_timer_counter;//计时器等与系统计时器事件 return 1; }

return 0; //如果是错误事件返回0 }

//event不等于0,此时表示有事件发生

timeout_count = __mg_timer_counter + timeout_threshold; // There was a event occurred.

if (event & IAL_MOUSEEVENT) { //如果事件类型包含IAL_MOUSEEVENT if (!IAL_UpdateMouse ())//更新鼠标信息 return 0;

lwe->type = LWETYPE_MOUSE;//设置底层事件类型为LWETYPE_MOUSE if (RefreshCursor(&me->x, &me->y, &button)) {//刷新光标信息 me->event = ME_MOVED;//鼠标事件为ME_MOVED time1 = 0; time2 = 0;

if (oldbutton == button) //如果前一个鼠标事件的类型与当前鼠标事件的类型相同 return 1; //返回1,表示获得事件成功 }

//如果前一个鼠标事件不是鼠标左键击键事件并且当前的鼠标事件是左键击键事件

if ( !(oldbutton & IAL_MOUSE_LEFTBUTTON) && (button & IAL_MOUSE_LEFTBUTTON) ) {

if (time1) {//如果time1不为0

interval = __mg_timer_counter - time1;//时间间隔等于当前时钟计数减去time1 if (interval <= dblclicktime)//如果时间间隔小于双击事件时间间隔 me->event = ME_LEFTDBLCLICK;//鼠标事件为左键双击事件 else

me->event = ME_LEFTDOWN;//否则为单击事件 time1 = 0; //time1设为0 } else {

time1 = __mg_timer_counter; //如果time1为0,设置time1为当前时钟计数 me->event = ME_LEFTDOWN; //鼠标事件为单击事件 }

goto mouseret; }

if ( (oldbutton & IAL_MOUSE_LEFTBUTTON) && //如果前一个鼠标事件为单击 !(button & IAL_MOUSE_LEFTBUTTON) )//且当前事件不为左键单击事件 {

me->event = ME_LEFTUP; //鼠标事件类型为左键释放 goto mouseret; }

//如果前一个鼠标事件不是右击事件且当前事件为右击事件 if ( !(oldbutton & IAL_MOUSE_RIGHTBUTTON) && (button & IAL_MOUSE_RIGHTBUTTON) ) {

if (time2) { //如果time2不为0

interval = __mg_timer_counter - time2; //两次击键的时间间隔

if (interval <= dblclicktime)//如果两次击键的时间间隔小于双击的时间间隔 me->event = ME_RIGHTDBLCLICK; //鼠标事件为右键双击事件 else //两次击键的时间间隔大于双击的时间间隔 me->event = ME_RIGHTDOWN; //鼠标事件为右键单击事件 time2 = 0;//将time2置为0 } else {

time2 = __mg_timer_counter; //如果time2为0,将time2设置为当前的时间 me->event = ME_RIGHTDOWN; //鼠标事件为右键单击事件 }

goto mouseret; }

//如果前一个事件为鼠标右键单击事件且当前事件不为鼠标右键单击事件 if ( (oldbutton & IAL_MOUSE_RIGHTBUTTON) &&

!(button & IAL_MOUSE_RIGHTBUTTON) ) {

me->event = ME_RIGHTUP;//则鼠标事件为鼠标右键释放事件 goto mouseret; } }

//如果事件类型包含键盘事件 if (event & IAL_KEYEVENT) {//

int nr_keys = IAL_UpdateKeyboard ();//更新键盘信息

if (nr_keys == 0)//如果nr_keys为0,表示获取事件信息失败返,回0 return 0;

lwe->type = LWETYPE_KEY; //设置底层事件类型为LWETYPE_KEY keystate = IAL_GetKeyboardState (); //获取键盘状态信息

//该循环的作用是判断哪个键按下或者弹起,记录相应事件的发生事件和扫描码等信息 for (i = 1; i < nr_keys; i++) {

if (!oldkeystate[i] && keystate[i]) { ke->event = KE_KEYDOWN; ke_time =__mg_timer_counter; ke->scancode = i; olddownkey = i; break; }

if (oldkeystate[i] && !keystate[i]) { ke->event = KE_KEYUP; ke->scancode = i; break; } }

if (i == nr_keys) { //如果将所有的键都扫描完

if (olddownkey == 0) //且没有键按下时,返回0,表示获取事件失败 return 0;

ke->scancode = olddownkey; //若有键按下,则键盘事件的扫描码就为olddownkey interval = __mg_timer_counter - ke_time; //计算时间间隔 treat_longpress (ke, interval);//判断按键类型 if (ke->event == 0) //表示获取事件失败 return 0; //返回0 }

make = (ke->event == KE_KEYDOWN)?1:0;

if (i != nr_keys) {//没有将所有的键都扫描完 unsigned leds; //用于点亮见哦按的三个LED灯

switch (ke->scancode) {

case SCANCODE_CAPSLOCK: //如果按键扫描码为大小写锁定键 if (make && caps_off) { //如果是按键消息且caps_off为1 capslock = 1 - capslock; //转换锁定状态

leds = slock | (numlock << 1) | (capslock << 2);//设置leds的值 IAL_SetLeds (leds);//用leds的值点亮对应的LED等 status = (DWORD)leds << 16;将leds加入状态信息 }

//如果是键释放消息,caps_off,如果是键按下消息,caps_off置0 caps_off = 1 - make;//设置caps_off的值 break;

case SCANCODE_NUMLOCK: if (make && num_off) { numlock = 1 - numlock;

leds = slock | (numlock << 1) | (capslock << 2); IAL_SetLeds (leds);

status = (DWORD)leds << 16; }

num_off = 1 - make; break;

case SCANCODE_SCROLLLOCK: if (make & slock_off) { slock = 1 - slock;

leds = slock | (numlock << 1) | (capslock << 2); IAL_SetLeds (leds);

status = (DWORD)leds << 16; }

slock_off = 1 - make; break; //设置系统按键状态

case SCANCODE_LEFTCONTROL: control1 = make; break;

case SCANCODE_RIGHTCONTROL: control2 = make; break;

case SCANCODE_LEFTSHIFT: shift1 = make; break;

case SCANCODE_RIGHTSHIFT: shift2 = make; break;

case SCANCODE_LEFTALT: alt1 = make; break;

case SCANCODE_RIGHTALT: alt2 = make; break; }

//根据按键信息设置状态信息

status &= ~(MASK_KS_SHIFTKEYS);

status |= (DWORD)((capslock << 8) | (numlock << 7) | (slock << 6) | (control1 << 5) | (control2 << 4) | (alt1 << 3) | (alt2 << 2) | (shift1 << 1) | (shift2)); // Mouse button status

if (oldbutton & IAL_MOUSE_LEFTBUTTON) status |= KS_LEFTBUTTON;

else if (oldbutton & IAL_MOUSE_RIGHTBUTTON) status |= KS_RIGHTBUTTON; }

ke->status = status;

memcpy (oldkeystate, keystate, nr_keys); memcpy (&old_lwe, lwe, sizeof (LWEVENT)); return 1; }

old_lwe.type = 0; return 0; mouseret:

status &= ~(MASK_KS_BUTTONS); //鼠标按钮状态的掩码

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库MINIGUI输入模块代码文件分析(8)在线全文阅读。

MINIGUI输入模块代码文件分析(8).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/583185.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: