在设计一个win32 GUI程序的时候一定会有人机交互的部份,比如鼠标、键盘等。哪用ACLLib库可不可实现这样的交互操作设计?后来研究了一下ACLLib库代码,是可以实现鼠标、键盘的交换的。下面以鼠标交互操作设计为例来分享下,运用ACLLib库如何编程实现。
最终效果,用ACLLib库设计的鼠标交互操作,左键按下画圆,右键按下画方。颜色,运用随机函数实现随机颜色。
先来分析下ACLLib库封装了多少鼠标事件,看下源代码(鼠标事件部份):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
case WM_LBUTTONDOWN: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_DOWN); break; case WM_LBUTTONUP: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_UP); break; case WM_LBUTTONDBLCLK: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), LEFT_BUTTON, BUTTON_DOUBLECLICK); break; case WM_MBUTTONDOWN: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_DOWN); break; case WM_MBUTTONUP: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_UP); break; case WM_MBUTTONDBLCLK: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MIDDLE_BUTTON, BUTTON_DOUBLECLICK); break; case WM_RBUTTONDOWN: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_DOWN); break; case WM_RBUTTONUP: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_UP); break; case WM_RBUTTONDBLCLK: if (g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), RIGHT_BUTTON, BUTTON_DOUBLECLICK); break; case WM_MOUSEMOVE: if(g_mouse != NULL) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam), MOUSEMOVE, MOUSEMOVE); break; case WM_MOUSEWHEEL: if(g_mouse == NULL) break; if(HIWORD(wParam) == 120) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam),MIDDLE_BUTTON,ROLL_UP); else if(HIWORD(wParam)==65416) g_mouse((int) LOWORD(lParam), (int) HIWORD(lParam),MIDDLE_BUTTON,ROLL_DOWN); break; |
从上面源代码可以看到ACLLib库封装了11个鼠标事件,具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
WM_LBUTTONDOWN:? ? ? //鼠标左键按下 WM_LBUTTONUP: ? ? //鼠标左键抬起 WM_LBUTTONDBLCLK: //鼠标左键双击 WM_MBUTTONDOWN: ? ? //鼠标中键按下 WM_MBUTTONUP: //鼠标中键抬起 WM_MBUTTONDBLCLK: //鼠标中键双击 WM_RBUTTONDOWN: //鼠标右键按下 WM_RBUTTONUP: //鼠标右键抬起 WM_RBUTTONDBLCLK: //鼠标右键双击 WM_MOUSEMOVE: //鼠标移动 WM_MOUSEWHEEL: //鼠标滚轮 |
分析完ACLLib库鼠标事件后,来写一个鼠标交互操作的demo。具体实现,鼠标左键按下画圆,右键按下画方。
定义一个鼠标回调函数void MouseEvent(int x, int y, int button, int event),实现鼠标左键按下画圆,右键按下画方功能。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
void MouseEvent(int x, int y, int button, int event) { if (button == LEFT_BUTTON && event == BUTTON_DOWN) { beginPaint(); setBrushColor(EMPTY); int R = rand() % 256; int G = rand() % 256; int B = rand() % 256; setPenColor(RGB(R, G, B)); setPenWidth(2); ellipse(x - 5, y - 5, x + 5, y + 5); endPaint(); } if (button == RIGHT_BUTTON && event == BUTTON_DOWN) { beginPaint(); setBrushColor(EMPTY); int R = rand() % 256; int G = rand() % 256; int B = rand() % 256; setPenColor(RGB(R, G, B)); setPenWidth(2); rectangle(x - 5, y - 5, x + 5, y + 5); endPaint(); } } |
注册回调函数registerMouseEvent(MouseEvent)。
以下就完成了鼠标左键按下画圆,右键按下画方的小demo。
ACLLib库鼠标交互操作源代码:
ACLLib库鼠标交互操作执行档下载地址:
链接:https://pan.baidu.com/s/19qFnA1JN5lmZS2uCyF0AeQ
提取码:f708
注:弄清楚ACLLib库鼠标事件后,实现起来就会非常的简单,所以一定要弄明白再来写代码。