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

2019-03-23 10:34

switch (type) { case POLLIN: temp = &rset; break; case POLLOUT: temp = wsetptr; break; case POLLERR: temp = esetptr; break; } } }

return (n > 0); }

4、输入等待事件: IAL_WaitEvent

static int wait_event (int which, int maxfd, fd_set *in, fd_set *out, fd_set *except, struct timeval *timeout) {

fprintf(stderr,\); fd_set rfds; int retvalue = 0; int fd, e;

if (!in) { //如果可读文件描述符集合为空 in = &rfds; //设置可读文件描述符指向rfds

FD_ZERO (in);//将rfds对应的内存空间的文件描述符清空 }

//如果事件类型为鼠标事件且鼠标的文件描述符mouse_fd >= 0 if (which & IAL_MOUSEEVENT && mouse_fd >= 0) { fd = mouse_fd; //文件描述符等于鼠标文件描述符 FD_SET (fd, in); //将文件描述符fd加入到可读文件描述符中 #ifdef _LITE_VERSION //如果为非多线程模式,

if (fd > maxfd) maxfd = fd; //如果文件描述符大于最大文件描述符大于0, #endif }

//如果事件类型为键盘事件且键盘的文件描述符kbd_fd >= 0 if (which & IAL_KEYEVENT && kbd_fd >= 0) { fd = kbd_fd; //文件描述符等于鼠标文件描述符

FD_SET (kbd_fd, in); //将文件描述符fd加入到可读文件描述符中 #ifdef _LITE_VERSION

if (fd > maxfd) maxfd = fd; //如果文件描述符大于最大文件描述符 #endif

}

//将处于就绪状态并且已经包含在fd_set结构中的描述符总数赋给e e = select (maxfd + 1, in, out, except, timeout) ; if (e > 0) {//如果e大于0

fd = mouse_fd; //设置文件描述符为鼠标描述符 /* If data is present on the mouse fd, service it: */

if (fd >= 0 && FD_ISSET (fd, in)) { //如果fd大于0且位于可读文件描述符集中 FD_CLR (fd, in); //从可读文件描述符集中删除该描述符

retvalue |= IAL_MOUSEEVENT; //返回值设为包含IAL_MOUSEEVENT }

fd = kbd_fd; //设置文件描述符为鼠标描述符 /* If data is present on the keyboard fd, service it: */

if (fd >= 0 && FD_ISSET (fd, in)) {//如果fd大于0且位于可读文件描述符集中 FD_CLR (fd, in); //从可读文件描述符集中删除该描述符 if (read_key ()) //读取键盘按键信息成功

retvalue |= IAL_KEYEVENT; //返回值设为包含IAL_KEYEVENT else { /* play at a timeout event *///读取键盘按键信息失败 if (timeout) { //timeout不为0

timeout->tv_sec = 0; //设置timeout为0 timeout->tv_usec = 0; } } }

} else if (e < 0) {//如果e<0,表示出现错误,返回-1 return -1; }

return retvalue;//返回retvalue }

5、读取键盘按键信息

static int read_key (void) {

static unsigned char last; struct QVFbKeyData l_kbd_data; int ret;

unsigned char scancode;

ret = read (kbd_fd, &l_kbd_data, sizeof (struct QVFbKeyData));

if (ret == sizeof (struct QVFbKeyData)) { kbd_data = l_kbd_data; }

else

return 0;

if (kbd_data.repeat) { return 0; }

if (kbd_data.unicode == 0 && !kbd_data.press) { kbd_state [last] = 0; } else {

// scancode = keycode_to_scancode (HIWORD (kbd_data.unicode) & 0x00FF, // LOWORD (kbd_data.unicode));

scancode = keycode_to_scancode (LOWORD (kbd_data.unicode),HIWORD (kbd_data.unicode) & 0x00FF);

kbd_state [scancode] = kbd_data.press ? 1 : 0; last = scancode; }

nr_changed_keys = last + 1; return 1; }

6 、解析事件ParseEvent

函数作用:将event时间转换成 MSG 类型的事件并加入到消息队列中

static void ParseEvent (PMSGQUEUE msg_que, int event) {

LWEVENT lwe; PMOUSEEVENT me; PKEYEVENT ke; MSG Msg;

ke = &(lwe.data.ke); me = &(lwe.data.me); me->x = 0; me->y = 0;

Msg.hwnd = HWND_DESKTOP; Msg.wParam = 0; Msg.lParam = 0;

lwe.status = 0L;

//根据event事件获得底层事件lwe的值 if (!GetLWEvent (event, &lwe)) return;

Msg.time = __mg_timer_counter; //若底层事件为超时事件

if (lwe.type == LWETYPE_TIMEOUT) {

Msg.message = MSG_TIMEOUT;//消息类型为MSG_TIMEOUT Msg.wParam = (WPARAM)lwe.count; Msg.lParam = 0;

QueueMessage (msg_que, &Msg);//将消息加入消息队列 }

else if (lwe.type == LWETYPE_KEY) {//若底层事件为键盘事件

Msg.wParam = ke->scancode;//消息的wParam成员值为键盘事件的扫描码成员 Msg.lParam = ke->status;//消息的wParam成员值为键盘事件的状态成员 if (ke->event == KE_KEYDOWN){//如果键盘事件为击键事件 Msg.message = MSG_KEYDOWN;//消息类型为MSG_KEYDOWN }

else if (ke->event == KE_KEYUP) {//如果键盘事件为按键释放事件 Msg.message = MSG_KEYUP;//消息类型为MSG_KEYUP }

else if (ke->event == KE_KEYLONGPRESS) { Msg.message = MSG_KEYLONGPRESS; }

else if (ke->event == KE_KEYALWAYSPRESS) { Msg.message = MSG_KEYALWAYSPRESS; }

if (!(srv_evt_hook && srv_evt_hook (&Msg))) { QueueMessage (msg_que, &Msg); } }

else if (lwe.type == LWETYPE_MOUSE) {//若底层事件为鼠标事件 Msg.wParam = me->status;//消息的wParam参数为鼠标的状态信息 switch (me->event) {//判断鼠标事件的类型,并依此确定消息的类型 case ME_MOVED: //鼠标移动事件 Msg.message = MSG_MOUSEMOVE; SetCursor (GetSystemCursor (IDC_ARROW)); break;

case ME_LEFTDOWN:

Msg.message = MSG_LBUTTONDOWN; break; case ME_LEFTUP:

Msg.message = MSG_LBUTTONUP; break;

case ME_LEFTDBLCLICK:

Msg.message = MSG_LBUTTONDBLCLK;

break;

case ME_RIGHTDOWN:

Msg.message = MSG_RBUTTONDOWN; break; case ME_RIGHTUP:

Msg.message = MSG_RBUTTONUP; break;

case ME_RIGHTDBLCLICK:

Msg.message = MSG_RBUTTONDBLCLK; break; }

Msg.lParam = MAKELONG (me->x, me->y);//将鼠标信息转换为消息的lParam if (!(srv_evt_hook && srv_evt_hook (&Msg))) {

QueueMessage (msg_que, &Msg);//将消息加入消息队列 } } }

7、获取底层事件:GetLWEvent

根据event的值确定lwe的成员值

BOOL GetLWEvent (int event, PLWEVENT lwe) {

static LWEVENT old_lwe = {0, 0}; unsigned int interval; int button;

PMOUSEEVENT me = &(lwe->data.me); PKEYEVENT ke = &(lwe->data.ke); const char* keystate; int i;

int make; /* 0 = release, 1 = presse */ //如果事件类型为0,表示超时事件或者错误事件 if (event == 0) {

/*#define DEF_USEC_TIMEOUT 300000 timeoutusec = DEF_USEC_TIMEOUT | timeoutusec = mytimeoutusec; timeout_threshold = timeoutusec / 10000; timeout_count = timeout_threshold;

#define DEF_REPEAT_TIME 50000 repeatusec = DEF_REPEAT_TIME; | repeatusec = myrepeatusec repeat_threshold = repeatusec / 10000; */ //如果超时

if (__mg_timer_counter >= timeout_count) {


MINIGUI输入模块代码文件分析(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:公路施工压实问题探讨

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: