《最新vc++(vs)-windows编程与绘图程序设计.doc》由会员分享,可在线阅读,更多相关《最新vc++(vs)-windows编程与绘图程序设计.doc(119页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精品资料vc+(vs)-windows编程与绘图程序设计.1 Vc+2010开发平台概述1.1 Vc+2010概述1.2 Visual Studio 2010 集成开发环境1.2.1安装Visual Studio 20101.2.2配置Visual Studio 20101.2.3解决方案和项目1.2.4生成和调试工具1.2.5部署工具1.2.6 Ribbon界面设计可视化2 Visual Studio 2010 MFC基本程序设计2.1 MFC应用程序概述2.1.1简单的MFC应用程序2.1.2 MFC应用程序分析2.2 MFC应用程序的创建2.2.1 用AppWizard创建CLR控制台应
2、用程序2.2.2 用AppWizard创建win32控制台应用程序2.2.3 用AppWizard创建一个MFC应用程序1.打开vc+2010,从起始页中选择“新建项目”如图2.2.3.1。图2.2.3.1弹出图2.2.3.2所示界面,左侧选择“viaual c+语言”,中间选择“MFC 应用程序”, 图2.2.3.2名称为huitu,位置为桌面,点击“确定”,弹出图2.2.3.3界面。图2.2.3.3然后一路点击下一步(或者直接点击“完成”),则自动生成一个MFC 应用程序,此时查看生成的程序文件夹内包含的文件,如图2.2.3.4图2.2.3.4Huitu文件夹内文件如图2.2.3.5图2.
3、2.3.5点击启动调试工具拦(绿色三角,图2.2.3.6)或者按F5则系统调试运行,在弹出界面中选择是,弹出图2.2.3.7的程序运行界面。图2.2.3.6图2.2.3.7此时再看程序文件夹内的文件如图2.8图2.2.3.8可以看见多了debug文件夹,分别打开debug文件夹以及huitu文件夹内的debug文件夹看看都多了啥文件。至此,一个文正的MFC应用程序建立完成。保存退出vc+2010,要再次进入刚才建立的应用程序,直接点击程序文件夹内的“huitu.sln”即可。2.3 MFC的类2.3.1 MFC应用程序中包含的类2.3.2 应用程序类2.3.3 主框架类2.3.4 视图类2.3
4、.5 文档类2.3.6 对话框类2.3.7 菜单类2.3.8 线程基类3 Wndows窗体应用程序3.1 创建Wndows窗体应用程序1.启动vc+2010,如图3.1.1。图3.1.12.选择新建项目在打开的窗口中,左侧语言选择vc+,窗口中间选择“windows窗体应用程序”,窗口下面“名称”填写form,工程位置为桌面(图3.1.2),点击确定,建成的应用程序界面如图3.1.3。图3.1.2图3.1.33.2 窗体属性及设置3.3 窗体事件及处理3.4 窗体控件添加与编辑4 用户界面设计4.1 菜单设计4.1.1 菜单的类型4.1.2 菜单设计建立菜单的过程如下:1.打开工程。打开前面建
5、立的工程绘图(双击huitu工程文件夹中的huitu.sln)。2.打开资源视图。通过“视图-其他窗口-资源视图”菜单打开资源视图窗口,如图4.1.2.1,在vc+界面左侧显示资源视图窗口。图4.1.2.13.添加菜单。点击资源视图的menu,展开如图4.1.2.2所示图4.1.2.2可以看到在工程中有多个菜单,其中IDR_huituTYPE菜单是显示在各子文档界面中的菜单;IDR_MAINFRAME建立的菜单是程序主框架中显示的菜单(把所有子文档关闭后会显示);在此双击IDR_huituTYPE,打开窗口如图4.1.2.3所示。图4.1.2.3在请在此处键入位置点击,光标激活后输入“直线”,
6、同时会在文本框右边和下面分别出现写有“请在此键入”字样的文本框,右边的代表键入的直线菜单的子菜单,下面代表直线菜单同级的菜单,其他以此类推,选择直线菜单后,查看vc+界面中右下角的属性面板,可以看到“popup”属性设置的是“true”,代表直线菜单是弹出式菜单,它下面还有下一级菜单,否则,该属性如果设置为“false”,则它不能再添加子菜单了。按照以上方法,在直线菜单下设置“直线1”,“直线2”两个子菜单,建立与直线同级的“圆”菜单,其下设置“圆1”,“圆2”两个子菜单,如图4.1.2.4。图4.1.2.44.运行查看菜单。按F5或者点击启动调试工具(绿色三角箭头),在探出的窗口中选择是,启
7、动运行后测绘看到建立的菜单(图4.1.2.5)。图4.1.2.55.为菜单添加函数并且编写代码菜单添加后还不能运行,要想让它起作用,需要为其添加函数并在函数里添加代码,为菜单添加函数过程为(以直线1为例):选择直线1,在属性面板中把ID属性右边的值改为ID_line1,然后通过“项目-类向导”打开类向导窗口(图1.1.2.6)图4.1.2.6类名处选择huituView,在命令标签列表中找到并点击ID_line1,在消息标签中点击COMMAND,如图4.1.2.7。 I图4.1.2.7再点击“添加处理程序”按钮,弹出添加函数对话框图4.1.2.8成员函数名称默认(也可以修改),点确定,则与菜单
8、直线1对应的函数生成,此时可通过点击图4.1.2.7中的“编辑代码”进入函数,或者在vc界面右上角的“解决资源管理器”面板中展开源代码(图4.1.2.8),找到huituView.CPP双击该文件也可进入函数。图4.1.2.8在函数中的/ TODO: 在此添加命令处理程序代码下面添加CClientDC dc(this);dc.LineTo(500,500);两句,如图4.1.2.9图4.1.2.96.运行检验菜单功能按F5运行程序后点击直线1菜单,可以看到在用户区画出一条直线。4.1.3 创建弹出式菜单4.1.4 创建动态菜单4.1.5 创建基于对话框的菜单4.2 工具栏设计4.3 状态栏设计
9、5 对话框设计5.1 静态对话框5.1.1静态对话框的建立过程建立静态对话框的过程如下:1.打开或建立工程。按照前面方法打开或者建立一个工程(MFC工程或者窗体应用程序均可,此处以mfc工程为例)2.打开资源窗口。通过“视图-其他窗口-资源视图”打开资源视图窗口。3.建立对话框。在资源视图的DIALOG文件夹上单击右键选择insert dialog,弹出新建的对话框,根据需要可以修改对话框属性面板中的属性值。4.添加对话框类。在建立的该对话框上双击鼠标左键,弹出添加类向导,根据提示设置好参数后确认,则建立了与对话框对应的对话框类。5.1.2静态对话框的应用对话框的应用一般是实现人机交互,以下结
10、合huitu工程中的直线2菜单说明对话框的应用,功能为点击直线2菜单,弹出对话框,在对话框里设置好直线的起点与终点坐标并确认后在客户区画出设置的起点到终点的直线。1.打开工程。双击huitu.sln打开工程。2.添加对话框。通过“视图-其他窗口-资源视图”打开资源视图,在资源视图的DIALOG文件夹上单击右键选择insert dialog,弹出新建的对话框(图5.1.2.1),在属性面板中把对话框的ID属性修改为:IDD_line2_dlg。图5.1.2.13.建立对话框类。在建立的对话框上双击鼠标左键,弹出建立对话框类向导,名称中输入line2dlg,基类选择CDIalog(图5.1.2.2
11、),点击完成,完成对话框类的建立,可以看到在解决资源管理器的头文件和源文件中已经建立了相应的件。图5.1.2.24.添加控件。在对话框上从工具箱中添加四个静态文本框、四个编辑文本框、一个按钮,静态文本框的caption属性分别改为:起点x坐标,起点y坐标,终点x坐标,终点y坐标,按钮caption属性改为“确定”。如图5.1.2.3.图5.1.2.35.为编辑文本框添加变量。要使用文本框,必须为其添加对应的变量,选择第一个文本框,点击“项目-类向导”菜单打开类向导,选择“成员变量”标签(图5.1.2.4),鼠标点击IDC_EDIT1(编辑文本框1对应的ID),点击右边的添加变量按钮弹出添加变量
12、窗口。图5.1.2.4图5.1.2.5在变量设置窗口中,成员变量名称输入m_line1x,类别选择value,类型选择long(图5.1.2.5).点确定。用同样的方法为其他三个编辑框添加变量,结果如图 5.1.2.6所示。图5.1.2.66.为按钮添加函数,获取数据。为了点击按钮确定后获取坐标数据以便于画直线,需要为按钮添加函数,选择前面添加的按钮“确定”,通过“项目-类向导”菜单打开类向导,选择命令标签,点击确定按钮的ID(IDC_BUTTON1),点击消息列表中的BN_CLICKED(代表鼠标点击时触发函数或者事件运行),见图5.1.2.7,击添加处理程序,弹出处理程序对话框,默认之后点
13、击确定则为按钮添加了对应的函数,双击line2dlg.cpp会看见添加了如下函数:void line2dlg:OnClickedButton1()/ TODO: 在此添加控件通知处理程序代码图5.1.2.77.编写代码获取数据。在前面添加的按钮函数中编写如下代码获取数据:UpdateData(true);CDialog:EndDialog(0); /结束对话框该函数的作用是把输入文本框的坐标数据赋值到对应的变量中,即四个文本框对应的变量line1x,line1y,line1endx,line1endy。如果代码为UpdateData(false);则是指把变量中的数值显示到变量对应的文本框中。
14、CDialog:EndDialog(0);是为了结束对话框。8.为菜单添加代码,画对话框设置坐标的的直线。点击资源视图中的menu文件夹展开,双击IDR_huituTYPE菜单,选择直线2菜单,把属性中的ID属性改为ID_line2,通过“项目-类向导”打开类向导,类名选择Chuituview,命令标签中的对象选择ID_line2,消息选择COMMAND(图5.1.2.8),点击添加处理程序,弹出窗口中默认确定,则自动打开ChuituView.cpp,并且光标定位到该函数中,代码如下:void ChuituView:OnLine2()/ TODO: 在此命令处处理程序代码图5.1.2.8定位到
15、该代码窗口的最上端头文件处,添加以下一句:#include line2dlg.h目的是把对话框类包含进来,否则系统不认对话框中的信息。然后再online2()函数中添加如下代码:line2dlg dlg; /生成对话框对象dlg.DoModal();/显示对话框CClientDC dc(this);/生成设备环境对象,获取设备环境dc.MoveTo(dlg.m_line1x,dlg.m_line1y);/定位到起点坐标dc.LineTo(dlg.m_line1endx,dlg.m_line1endy);/从起点到终点画直线9.运行程序。编译运行,点击直线2菜单会弹出对话框,在对话框中设置好起点
16、终点坐标后点确定,则在客户区画出指定坐标的直线。5.2 非静态对话框5.3 通用对话框6常用控件6.1 公共控件6.2 容器6.3 数据控件7 键盘鼠标事件7.1键盘事件为了使用户掌握键盘消息及其处理消息,介绍一个键盘消息处理实例。1.实例说明 本实例通过工程向导创建一个单文档工程,在其中响应键盘的WM_KEYDOWN、WM_KEYUP、WM_CHAR消息,实现下面的功能: 当用户按下了Shift键,在视图窗口中显示提示信息“用户按下了Shift键”; 当用户释放了Shift键时,在视图窗口中显示提示信息“用户释放了Shift键!”; 当用户按下了Shift键后又按下了字符“B”键,在视图窗口
17、中显示提示信息“用户同时按下了Shift键和B键”(即输入B键或b键)。2.开发过程(1)创建工程。 利用MFC AppWizardEXE建立一个单文档的MFC工程“KeyboardDemo”。(2)在ClassView选项卡上用鼠标右键单击该类,并从弹出的快速菜单中选择Add Member Variable 菜单命令,为KeyboardDemoView类添加一个新的成员变量bShiftdown,将此成员变量的类型设置为BOOL,并将其访问权限设置为Private, 单击OK按钮,完成成员变量的添加操作。按照同样的方法,再添加2个BOOL型private成员变量bShiftup和bShiftB
18、, 接下来在KeyboardDemoView构造函数中给三个指示变量赋初值”false”。代码如下: CKeyboardDemoView:CKeyboardDemoView() bShiftdown=bShiftup=bShiftB=false;/赋初值 (3)利用“建立类向导”添加键盘消息及处理函数,步骤如下: 在”ClassName”列表框中,选择键盘消息的处理函数”CKeyboardDemoView”,在”Object IDs”列表框中选择“CKeyboardDemoView”, 则在“Message”列表框中,列出了MFC为其预定义的消息,分别选择WM_KEYDOWN、WM_KEYUP
19、、WM_CHAR消息, 单击“Add Function”按钮,MFC就会为其自动添加相应的消息映射宏和消息处理函数。(4)添加实现代码:在资源文件“KeyboardDemoView.cpp”中添加各键盘消息函数的实现代码。 OnKeyDown函数的代码如下: void CKeyboardDemoView:OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) if(nChar=VK_SHIFT)/判断Shift键是否被按下 bShiftdown=true; bShiftup=false; Invalidate(true); /显示信息 CView:On
20、KeyDown(nChar, nRepCnt, nFlags); 注:Invalidate(TRUE)将整个窗口设置为需要重绘的无效区域,它会产生WM_PAINT消息,这样OnDraw将被调用。OnKeyUp函数的代码如下: void CKeyboardDemoView:OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags) if(nChar=VK_SHIFT)/判断Shift键是否被释放 bShiftup=true; bShiftdown=false; Invalidate(true);/显示信息 CView:OnKeyUp(nChar, nRepCnt
21、, nFlags); OnChar函数的代码如下: void CKeyboardDemoView:OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) /判断是否同时敲击了字符键B键和Shift键 if(nChar=b)|(nChar=B) /if(nChar=66)|(nChar=98) if(bShiftdown) bShiftB=true; bShiftdown=false; Invalidate(true); CView:OnChar(nChar, nRepCnt, nFlags); 在资源文件”KeyboardDemoView.cpp”的OnDr
22、aw函数中,实现在客户区窗口输出按键提示信息。代码如下: void CKeyboardDemoView:OnDraw(CDC* pDC) if(bShiftdown)/按下了Shift键 pDC-TextOut(20,20,用户按下了Shift键!); if(bShiftup)/释放了Shift键 pDC-TextOut(20,20,用户释放了Shift键!); if(bShiftB)/同时按下了Shift键和B键 pDC-TextOut(20,20,用户同时按下Shift键和B键!); bShiftB=false; 举例:CDC* pDC =GetDC();if (nChar=VK_UP)
23、pDC-Ellipse(40,40,200,200);键盘事件总结:Vc+中键盘事件中函数原型如下(以键盘按下为例,其他类似)OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)其中:nChar :表示按键的字符代码。nRepCnt:表示按键的重复次数。nFlags:表示扫描码、先前键状态、键转换状态等。nChar的取值表:虚拟键码对应值对应键VK_LBUTTON1鼠标左键VK_RBUTTON2鼠标右键VK_CANCEL3CancelVK_MBUTTON4鼠标中键VK_XBUTTON15VK_XBUTTON26VK_BACK8BackspaceVK_
24、TAB9TabVK_CLEAR12ClearVK_RETURN13EnterVK_SHIFT16ShiftVK_CONTROL17CtrlVK_MENU18AltVK_PAUSE19PauseVK_CAPITAL20Caps LockVK_KANA21VK_HANGUL21VK_JUNJA23VK_FINAL24VK_HANJA25VK_KANJI25*VK_ESCAPE27EscVK_CONVERT28VK_NONCONVERT29VK_ACCEPT30VK_MODECHANGE31VK_SPACE32SpaceVK_PRIOR33Page UpVK_NEXT34Page DownVK_EN
25、D35EndVK_HOME36HomeVK_LEFT37Left ArrowVK_UP38Up ArrowVK_RIGHT39Right ArrowVK_DOWN40Down ArrowVK_SELECT41SelectVK_PRINT42PrintVK_EXECUTE43ExecuteVK_SNAPSHOT44SnapshotVK_INSERT45InsertVK_DELETE46DeleteVK_HELP47Help48049150251352453554655756857965A66B67C68D69E70F71G72H73I74J75K76L77M78N79O80P81Q82R83S8
26、4T85U86V87W88X89Y90ZVK_LWIN91VK_RWIN92VK_APPS93VK_SLEEP95VK_NUMPAD096小键盘 0VK_NUMPAD197小键盘 1VK_NUMPAD298小键盘 2VK_NUMPAD399小键盘 3VK_NUMPAD4100小键盘 4VK_NUMPAD5101小键盘 5VK_NUMPAD6102小键盘 6VK_NUMPAD7103小键盘 7VK_NUMPAD8104小键盘 8VK_NUMPAD9105小键盘 9VK_MULTIPLY106小键盘 *VK_ADD107小键盘 +VK_SEPARATOR108小键盘 EnterVK_SUBTRAC
27、T109小键盘 -VK_DECIMAL110小键盘 .VK_DIVIDE111小键盘 /VK_F1112F1VK_F2113F2VK_F3114F3VK_F4115F4VK_F5116F5VK_F6117F6VK_F7118F7VK_F8119F8VK_F9120F9VK_F10121F10VK_F11122F11VK_F12123F12VK_F13124VK_F14125VK_F15126VK_F16127VK_F17128VK_F18129VK_F19130VK_F20131VK_F21132VK_F22133VK_F23134VK_F24135VK_NUMLOCK144Num LockV
28、K_SCROLL145ScrollVK_LSHIFT160VK_RSHIFT161VK_LCONTROL162VK_RCONTROL163VK_LMENU164VK_RMENU165VK_BROWSER_BACK166VK_BROWSER_FORWARD167VK_BROWSER_REFRESH168VK_BROWSER_STOP169VK_BROWSER_SEARCH170VK_BROWSER_FAVORITES171VK_BROWSER_HOME172VK_VOLUME_MUTE173VolumeMuteVK_VOLUME_DOWN174VolumeDownVK_VOLUME_UP175V
29、olumeUpVK_MEDIA_NEXT_TRACK176VK_MEDIA_PREV_TRACK177VK_MEDIA_STOP178VK_MEDIA_PLAY_PAUSE179VK_LAUNCH_MAIL180VK_LAUNCH_MEDIA_SELECT181VK_LAUNCH_APP1182VK_LAUNCH_APP2183VK_OEM_1186; :VK_OEM_PLUS187= +VK_OEM_COMMA188VK_OEM_MINUS189- _VK_OEM_PERIOD190VK_OEM_2191/ ?VK_OEM_3192 VK_OEM_4219 VK_OEM_5220 |VK_O
30、EM_6221 VK_OEM_7222 VK_OEM_8223VK_OEM_102226VK_PACKET231VK_PROCESSKEY229VK_ATTN246VK_CRSEL247VK_EXSEL248VK_EREOF249VK_PLAY250VK_ZOOM251VK_NONAME252VK_PA1253VK_OEM_CLEAR2547.2 鼠标事件7.2.1客户区鼠标消息当鼠标通过客户区时,就会触发客户区鼠标消息。常用的客户区鼠标消息消息名称消息说明WM_LBUTTONDBLCLK鼠标左键被双击WM_LBUTTONDOWN鼠标左键被按下WM_LBUTTONUP鼠标左键被释放WM_MBU
31、TTONDBLCLk鼠标中键被双击WM_MBUTTONDOWN鼠标中键被按下WM_MBUTTONUP鼠标中键被释放WM_MOUSEMOVE鼠标移动穿过客户区域WM_RBUTTONDBLCLK鼠标右键被双击WM_RBUTTONDOWN鼠标右键被按下WM_RBUTTONUP鼠标右键被释放WM_MOUSEWHEEL在客户区内鼠标滚轮滚动应用程序一般是处理客户区鼠标消息。非客户区鼠标消息可以被Windows本身妥善的处理。 客户区鼠标消息处理函数的一般形式为: void OnXxxYyy(UINT nFlag, CPoint point); 如WM_LBUTTONDOWN的消息处理函数,其声明如下:
32、void OnLButtonDown(UINT nFlag, CPoint point); 函数的两个参数说明如下: point:为CPoint类对象,记录了当前光标的x,y坐标,这个坐标是以相对于窗口客户区左上角的设备坐标而言的。 nFlags:为鼠标动作的条件标志,取值是以下各种取值的组合。各取值含义如下:MK_LBUTTON:按下了鼠标的左键。MK_MBUTTON:按下了鼠标的中键。MK_RBUTTON:按下了鼠标的右键。MK_CONTROL:按下了键盘上的Ctrl键。MK_SHIFT:按下了键盘上的Shift键。在实际编程中,常使用nFlags参数与以上可能取值进行位与运算,来判断消息
33、生成时的鼠标键以及Shift以及Ctrl的状态。 如检测Shift键和Ctrl键的状态,如下: void OnLButtonDown(UINT nFlags,CPoint point) /判断是否Ctrl键和Shift键同时按下 if(nFlags&MK_CONTROL)&(nFlags&MK_SHIFT) void CMouseDemoView:OnMouseMove(UINT nFlags, CPoint point) /移动鼠标时鼠标左键是按下的 if(nFlags&MK_LBUTTON) = MK_LBUTTON) 鼠标捕捉 如果你的鼠标移出了某个窗口的客户区范围,那么此窗口将不再继续
34、收到客户区鼠标消息。 SetCapture和ReleaseCapture 如果你用SetCapture进行了鼠标捕捉,那么,即使你的鼠标移出了窗口客户区,仍然可以收到客户区鼠标消息,直到调用ReleaseCapture释放鼠标捕捉或在某个窗口上进行点击为止。 注意: 一旦某个窗口捕获了鼠标,其他窗口将无法得到鼠标消息。 因此,当窗口不再需要捕获鼠标消息时,应及时使用ReleaseCapture函数将鼠标释放。7.2.2非客户区鼠标消息当鼠标通过非客户区时,就会触发非客户区鼠标消息。常见的非客户区鼠标消息消息名称消息说明WM_NCLBUTTONDBLCLK 鼠标左键被双击WM_NCLBUTTON
35、DOWN鼠标左键被按下WM_NCLBUTTONUP鼠标左键被释放WM_NCMBUTTONDBLCLK鼠标中键被双击WM_NCMBUTTONDOWN鼠标中键被按下WM_NCMBUTTONUP鼠标中键被释放WM_NCMOUSEMOVE鼠标移动穿过客户区域WM_NCRBUTTONDBLCLK鼠标右键被双击WM_NCRBUTTONDOWN鼠标右键被按下WM_NCRBUTTONUP鼠标右键被释放7.2.3实例1.鼠标消息的处理及鼠标相关的操作。 实例说明: 通过工程向导创建一个单文档工程,在其中响应鼠标的WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息 实现功能: 当
36、按下鼠标左键并移动鼠标时,在客户区窗口内将绘制鼠标的移动轨迹,同时光标变为“十字”光标或自定义光标。 当按下鼠标左键时,鼠标的移动范围被限制的整个客户区窗口范围时,即鼠标不能移到客户区外。 当释放了鼠标左键后,鼠标恢复原来的活动区域。开发步骤: (1)创建工程。启动Visual C+,利用MFC APPWizardEXE建立一个新的MFC工程,工程名为“MouseDemo”, 在MFC AppWizard Step1的时候选择“Single documents”即基于单文档的MFC工程,之后的步骤使用默认值。 (2)利用“ClassWizard”添加鼠标消息及处理函数: 在”ClassName
37、”列表框中,选择鼠标消息的处理类”CMouseDemoView”,在“Message”列表框中, 列出了MFC预定义的消息,分别选择WM_LBUTTONDOWN、WM_LBUTTONUP、WM_MOUSEMOVE消息,单击“Add Function”按钮, MFC就会为其自动添加相应的消息映射宏和消息处理函数。 (3)添加实现代码 首先在头文件”MouseDemoView.h”中声明变量startpoint、rcOldClip。 代码如下: public: CPoint startpoint; RECT rcOldClip;添加WM_LBUTTONDOWN的消息处理代码如下: void CMouseDemoView:OnLButtonDown(UINT nFlags, CPoint point) GetClipCursor(&rcOldClip);/获取原鼠标活动的有效区域 startpoint=point; /鼠标所在点为起始点 SetCapture(); /进行鼠标捕捉 CView:OnLButtonDown(nFlags, point); 添加WM_LBUTTONUP的消息处理代码如下: void CMouseDemoView:OnLButtonUp(UINT nFlags, CPoint point) ClipCursor(&rcOldClip);/恢复原来的鼠标活动区域
限制150内