项目十 鼠标和键盘事件的响应
- 格式:ppt
- 大小:204.50 KB
- 文档页数:38
可视化实验二实现Windows应用程序对键盘与鼠标的响应。
.docVisual C++面向对象与可视化程序设计实验二实验报告一、实验目的1、使用API函数编制包含各种资源的Windows应用程序;2、实现Windows应用程序对键盘与鼠标的响应。
二、实验内容1、问题描述:(1)创建一个菜单,其中有三个菜单项,分别为“文件”、“计算”和“帮助”,其中,“文件”菜单项包含“打开”、“保存”、“画图”、“退出”等菜单选项;“计算”菜单包含“总和”、“方差”、“均方根”等菜单选项;“帮助”菜单项包含“计算总和帮助”、“计算方差帮助”和“计算均方根帮助”以及“关于”等项。
(2)若单击“画图”菜单项,则绘出P103图形。
若在用户区内按下鼠标左键,则动态创建一个包括“删除计算总和”、“添加计算平均值”和“修改计算均方差”三个菜单项的弹出式菜单,由此菜单控制“计算”菜单中菜单项删除、添加与修改。
(要求新的弹出式菜单开始时不可用,按下右键后变为可用。
)单击“修改计算均方差”菜单项后,“计算”菜单下的“计算均方差”项改为“线性拟合”,单击“添加计算平均值”菜单项后,“计算”菜单中添加上了“计算平均值”菜单项。
(3)将光标设定为自己名字中的某个字、图标设定为自己名字中的另一个字。
2、应用程序中所用到的资源、消息,简介主要函数的功能;3、程序实现4、操作结果三、程序代码#include"windows.h"#include"E08700212叶孙晓.h"HMENU hmenu,haddmenu;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARA M);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow){HWND hwnd;MSG Msg;HACCEL hAccel;WNDCLASS wndclass;char lpszMenuName[]="Menu";char lpszClassName[]="菜单";char lpszTitle[]="E08700212叶孙晓二";wndclass.style=0;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wndclass.lpszMenuName=lpszMenuName;wndclass.lpszClassName=lpszClassName;if(!RegisterClass(&wndclass)){MessageBeep(0);return FALSE;}hwnd=CreateWindow(lpszClassName,lpszTitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,NULL);ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd);hAccel=LoadAccelerators(hInstance,lpszMen uName); while(GetMessage(&Msg,NULL,0,0)){if(!TranslateAccelerator(hwnd,hAccel,&Msg)){TranslateMessage(&Msg);DispatchMessage(&Msg);}}return Msg.wParam;LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam){static bool draw = false;static bool pingjunzhiadd = true;static bool left = true;HDC hdc;PAINTSTRUCT ps;HPEN hp;HBRUSH hb;switch(message){case WM_COMMAND:switch(LOWORD(wParam)){case IDM_EXIT:SendMessage(hwnd,WM_DESTROY,0,0);break;case IDM_fangchamodify:ModifyMenu(hmenu,IDM_fangcha,MF_BYCOMMAND,IDM_nihe,"线性拟合");DrawMenuBar(hwnd);break;case IDM_pingjunzhiadd:if(pingjunzhiadd){InsertMenu(hmenu,IDM_junfanggen,MF_BYCOMMAND|MF_ENABLED,IDM_pingjunz hi,"平均值");DrawMenuBar(hwnd);pingjunzhiadd = false;break;case IDM_DRAW:hmenu = GetMenu(hwnd);draw = true;break;}break;case WM_LBUTTONDOWN:if(left){hmenu=GetMenu(hwnd);haddmenu=CreateMenu();AppendMenu(haddmenu,MF_GRAYED,IDM _zonghedelete,"删除计算总和");AppendMenu(haddmenu,MF_GRAYED,IDM_fangchamodify,"修改计算方差");AppendMenu(haddmenu,MF_GRAYED,IDM _pingjunzhiadd,"添加计算平均值");InsertMenu(hmenu,3,MF_POPUP|MF_BYPOSITION,(UINT)haddmenu,"修改菜单");DrawMenuBar(hwnd);}left = false;break;case WM_RBUTTONDOWN:EnableMenuItem(haddmenu,IDM_zonghedelete,MF_ENABLED);EnableMenuItem(haddmenu,IDM_fangchamodify,MF_ENABLED);EnableMenuItem(haddmenu,IDM_pingjunzhi add,MF_ENABLED);DrawMenuBar(hwnd);break;case WM_PAINT:if(draw){hdc = BeginPaint (hwnd, &ps);SetMapMode(hdc,MM_TEXT);Rectangle(hdc,130,60,270,200);hb=CreateHatchBrush(HS_CROSS,RGB(255, 0,0));SelectObject(hdc,hb);Ellipse(hdc,130,70,270,190);hp=CreatePen(PS_DASHDOT,1,RGB(0,255,0 ));SelectObject(hdc,hp);MoveToEx(hdc,100,130,NULL);LineT o(hdc,300,130);MoveToEx(hdc,200,30,NULL);LineT o(hdc,200,230);EndPaint(hwnd,&ps);DeleteObject(hp);DeleteObject(hb);}break;case WM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,message,wParam,lParam);}return 0;} 头文件#define IDM_ADDMENU 14#define IDM_DELMENU 16 #define IDM_OPEN 11 #define IDM_SA VE 13 #define IDM_lcw 17#define IDM_DRAW 12 #define IDM_EXIT 15#define IDM_zonghe 18#define IDM_fangcha 19#define IDM_junfanggen 21 #define IDM_zonghehelp 22#define IDM_fangchahelp 23#define IDM_junfanggenhelp 24#define IDM_ABOUT 20 #define IDM_zonghedelete 30#define IDM_fangchamodify 31#define IDM_pingjunzhiadd 32#define IDM_nihe 33 #define IDM_pingjunzhi 34资源文件//Microsoft Developer Studio generated resource script.//#include "resource.h"#define APSTUDIO_READONLY_SYMBOLS/////////////////////////////////////////////////////////////////// // //////////// Generated from the TEXTINCLUDE 2 resource.//#include "afxres.h"#include"windows.h"#include"E08700212叶孙晓.h"E08700212 ICON D:\E08700212二\E08700212.ICOE08700212 CURSOR D:\E08700212二\E08700212.CURMenu MENU DISCARDABLE{POPUP"文件(&F)"{MENUITEM"打开(&O)\tCtrl+O", IDM_OPENMENUITEM"画图(&G)", IDM_DRAWMENUITEM"保存(&S)", IDM_SAVE MENUITEM"另存为(&A)", IDM_lcw MENUITEM SEPARATORMENUITEM"退出(&X)", IDM_EXIT}POPUP"计算(&C)"{MENUITEM"计算总和(&S)", IDM_zongheMENUITEM"计算方差(&D)", IDM_fangchaMENUITEM"线性拟合", IDM_junfanggen}POPUP"帮助(&H)"{MENUITEM"计算总和的帮助", IDM_zonghehelpMENUITEM"计算方差的帮助", IDM_fangchahelpMENUITEM"计算均方根的帮助", IDM_junfanggenhelpMENUITEM SEPARATORMENUITEM"关于(&A)", IDM_ABOUT}/////////////////////////////////////////////////////////////////// // ////////#undef APSTUDIO_READONLY_SYMBOLS/////////////////////////////////////////////////////////////////// // ////////// Chinese (中国) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) #ifdef _WIN32LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED#pragma code_page(936)#endif //_WIN32#ifdef APSTUDIO_INVOKED/////////////////////////////////////////////////////////////////// // //////////// TEXTINCLUDE//1 TEXTINCLUDE DISCARDABLEBEGIN"resource.h\0"END2 TEXTINCLUDE DISCARDABLEBEGIN"#include ""afxres.h""\r\n""#include""windows.h""\r\n""#include""E08700212叶孙晓.h""\r\n""E08700212 ICON D:\\E08700212二\\E08700212.ICO\r\n""E08700212 CURSOR D:\\E08700212二\\E08700212.CUR\r\n""Menu MENU DISCARDABLE\r\n""{\r\n"" POPUP""文件(&F)""\r\n"" {\r\n"" MENUITEM""打开(&O)\\tCtrl+O"", IDM_OPEN \r\n"" MENUITEM""画图(&G)"", IDM_DRAW \r\n"" MENUITEM""保存(&S)"", IDM_SAVE MENUITEM""另存为(&A)"", IDM_lcw MENUITEM SEPARATOR\r\n"" MENUITEM""退出(&X)"", IDM_EXIT\r\n""\r\n"" }\r\n"" POPUP""计算(&C)""\r\n"" { \r\n"" MENUITEM""计算总和(&S)"", IDM_zonghe \r\n"" MENUITEM""计算方差(&D)"", IDM_fangcha\r\n"" MENUITEM""线性拟合"", IDM_junfanggen\r\n"" }\r\n""\r\n"" POPUP""帮助(&H)""\r\n"" { \r\n"" MENUITEM""计算总和的帮助"", IDM_zonghehelp\r\n"" MENUITEM""计算方差的帮助"", IDM_fangchahelp\r\n"" MENUITEM""计算均方根的帮助"", IDM_junfanggenhelp\r\n"" MENUITEM SEPARATOR\r\n"" MENUITEM""关于(&A)"", IDM_ABOUT\r\n"" }\0"END3 TEXTINCLUDE DISCARDABLEBEGIN"\r\n""\0"END#endif // APSTUDIO_INVOKED#endif // Chinese (中国) resources/////////////////////////////////////////////////////////////////// //////////#ifndef APSTUDIO_INVOKED/////////////////////////////////////////////////////////////////// // //////////// Generated from the TEXTINCLUDE 3 resource.///////////////////////////////////////////////////////////////////// // ////////#endif五、实验心得通过这次实验学会了使用API函数编制包含各种资源的Windows 应用程序,在实验过程中,光标的设置,课本上对这块阐述的很简短,很多都需要自己去理解。
pygame键盘和⿏标事件的处理pygame 的键盘和⿏标事件的处理所谓事件,就是程序上发⽣的事。
例如⽤户按下键盘上的某个键或者单击、移动⿏标,对于这些事件,游戏程序需要作出反应。
如《pygame 图像/图形绘制》中例⼦,程序会⼀直运⾏下去,直到⽤户关闭窗⼝⽽产⽣⼀个 QUIT 事件,pygame 会接收⽤户的各种操作(例如按键盘上的键、移动⿏标等)产⽣事件。
事件随时可能发⽣,⽽且量可能会很⼤,pygame 的做法是把⼀系列的事件存放到⼀个队列⾥逐个处理。
在上节例⼦中使⽤了pygame.event.get()来处理所有事件,如果使⽤pygame.event.wait() , pygame 会等到发⽣⼀个事件时才继续下去,⼀般在游戏中不太实⽤,因为游戏往往是需要动态运作的。
pygame 的常⽤事件如下所⽰:事件产⽣途径参数QUIT⽤户按下“关闭”按钮NoneACTIVEEVENT pygame 被激活或者隐藏gain 、stateKEYDOWN键盘被按下unicode 、key 、modKEYUP键盘被放开key 、modMOUSEMOTION⿏标移动pos 、rel 、buttonsMOUSEBUTTONDOWN⿏标被按下pos 、buttonMOUSEBUTTONUP⿏标被放开pos 、button1. pygame 的键盘事件的处理通常⽤pyagme.event.get()获取所有事件,若event.type == KEYDOWN , 这时是键盘事件,再判断按键的event.key的种类(即 K_a 、 K_b 、K_LEFT 这种形式)。
⽤户也可以使⽤pygame.key.get_pressed()来获取所有被按下的键值,对应的就是键是否被按下。
keys_pressed = pygame.key.get_pressed()if keys_pressed[K_SPACE]:# 空格键被按下fire() # 发射⼦弹在 key 模块下有很多函数,如下:key.get_focused(): 返回当前的 pygame 窗⼝是否被激活。
在程序运行中,产生事件的主体有很多,其中尤其以键盘和鼠标为最多。
本文就来探讨一下在C#中和这二个主体相关的事件的处理过程。
一.本文介绍的程序设计和运行的软件环境:(1).微软公司视窗2000服务器版(2) FrameWork SDK Beta 2二.C#中处理鼠标相关的事件:鼠标相关的事件大致有六种,分别是:"MouseHover"、"MouseLeave"、"MouseEnter"、"MouseMove"、"MouseDown"和"MouseUp"。
(1).如何在C#程序中定义这些事件:在C#中是通过不同的Delegate来描述上述事件,其中描述"MouseHover"、"MouseLeave"、"MouseEnter"事件的Delegate是"EventHandler",而描述后面的三个事件的Delegate是"MouseEventHandler"来描述。
这二个Delegate分别被封装在不同的命名空间,其中"EventHandler"被封装在"System"命名空间;"MouseEventHandler"被封装在"Syetem.Windows.Froms"命名空间中的。
在为"MouseHover"、"MouseLeave"、"MouseEnter"事件通过数据的类是"EventArgs",他也被封装在"System"命名空间中;而为后面的三个事件提供数据的类是"MouseEventArgs",他却被封装在"Syetem.Windows.Froms"命名空间。
第9章鼠标和键盘事件【教学目标】(1)熟悉应用各种鼠标事件;(2)了解鼠标光标形状属性及其设置;(3)了解鼠标的拖放,包括手动拖放和自动拖放的实现过程;(4)熟悉应用键盘事件,包括Key Press事件、 KeyDown和KeyUp事件及它们触发的顺序。
【教学重难点】1.教学重点:教学目标中的(1)、(4)。
2.教学难点:用代码实现各种鼠标事件和键盘事件。
【教学方法】讲授法+直观演示法+任务驱动法【教学手段】CAI课件+课堂直观演示+课堂练习【教学时数】4+2课时【教学过程设计思想】以课堂讲授为主,针对同一问题,通过典型例子来理解鼠标和键盘事件的执行过程。
【教学内容】9.1 鼠标事件一、鼠标键参数在编写代码的过程中,当触发鼠标事件后,还需知道用户按下了哪个键,然后才能对其作出响应,这一过程就用到了Button参数。
该参数值表示按键的不同状态,具体如课本P175表9-1。
三键鼠标的Button值如下图所示: 4二、举例:【举例1】代码见课本P176所示。
通过该例子说明如下:(1)在MouseDown和MouseUp事件中,Button参数只能判断是否按下或松开某个键,而不能同时检查两个键被按下或松开,因此Button参数的取值只有三种,即十进制的1、2、4值。
(2)在MouseMove事件中,Button参数可判断按下了1 个或同时按下2 个、3个键。
【举例2】题目见课本P177所示。
讲解步骤:(培养学生的自学能力考虑)(1)学生操作;(2)老师解释。
9.2 鼠标光标一、光标形状属性MousePointer鼠标光标的形状是由MousePointer属性来决定的。
该属性可通过程序代码来设置,也可在相应的属性窗口来设置。
MousePointer的属性值取值及形状如课本P182表9-4所示。
二、设置鼠标光标形状属性1、通过属性窗口设置步骤如下:(1)选择需要设置鼠标光标的窗体或控件;(2)在属性窗口中设置MousePointer属性。