




已阅读5页,还剩113页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 Vc+2010开发平台概述31.1Vc+2010概述31.2 Visual Studio 2010 集成开发环境31.2.1安装Visual Studio 201031.2.2配置Visual Studio 201031.2.3解决方案和项目31.2.4生成和调试工具31.2.5部署工具31.2.6 Ribbon界面设计可视化42 Visual Studio 2010 MFC基本程序设计42.1 MFC应用程序概述42.1.1简单的MFC应用程序42.1.2 MFC应用程序分析42.2 MFC应用程序的创建42.2.1 用AppWizard创建CLR控制台应用程序42.2.2 用AppWizard创建win32控制台应用程序42.2.3 用AppWizard创建一个MFC应用程序52.3 MFC的类92.3.1 MFC应用程序中包含的类92.3.2 应用程序类102.3.3 主框架类102.3.4 视图类102.3.5 文档类102.3.6 对话框类102.3.7 菜单类102.3.8 线程基类103 Wndows窗体应用程序113.1 创建Wndows窗体应用程序113.2 窗体属性及设置123.3 窗体事件及处理133.4 窗体控件添加与编辑134 用户界面设计134.1 菜单设计134.1.1 菜单的类型134.1.2 菜单设计134.1.3 创建弹出式菜单204.1.4 创建动态菜单204.1.5 创建基于对话框的菜单204.2 工具栏设计204.3 状态栏设计205 对话框设计205.1 静态对话框205.1.1静态对话框的建立过程205.1.2静态对话框的应用215.2 非静态对话框315.3 通用对话框316常用控件316.1 公共控件316.2 容器316.3 数据控件317 键盘鼠标事件327.1键盘事件327.2 鼠标事件427.2.1客户区鼠标消息427.2.2非客户区鼠标消息457.2.3实例468 图形文本与图像处理518.1图形设备接口GDI(Graphics Device Interface)518.2 设备上下文DC(device context)548.2.1 设备上下文概述548.2.2 CDC类578.3 绘图环境608.3.1绘图环境介绍608.3.2映射模式与坐标系618.3.3绘图颜色718.3.4设置绘图属性728.3.6几何对象的结构和类798.4 画笔和画刷858.4.1画笔858.4.2画刷928.5 绘图998.5.1 绘图步骤998.5.2 画像素点998.5.3 画线状图1008.5.4 拖放画动态直线1048.5.5 画填充图1098.5.6 清屏1118.5.7 在控件上绘图1128.6 文本绘制1158.7 位图1158.8 图标和光标1168.9 图像处理1169 文件处理11610 数据库编程1161 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 用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.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.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.打开工程。打开前面建立的工程绘图(双击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在请在此处键入位置点击,光标激活后输入“直线”,同时会在文本框右边和下面分别出现写有“请在此键入”字样的文本框,右边的代表键入的直线菜单的子菜单,下面代表直线菜单同级的菜单,其他以此类推,选择直线菜单后,查看vc+界面中右下角的属性面板,可以看到“popup”属性设置的是“true”,代表直线菜单是弹出式菜单,它下面还有下一级菜单,否则,该属性如果设置为“false”,则它不能再添加子菜单了。按照以上方法,在直线菜单下设置“直线1”,“直线2”两个子菜单,建立与直线同级的“圆”菜单,其下设置“圆1”,“圆2”两个子菜单,如图4.1.2.4。图4.1.2.44.运行查看菜单。按F5或者点击启动调试工具(绿色三角箭头),在探出的窗口中选择是,启动运行后测绘看到建立的菜单(图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成员函数名称默认(也可以修改),点确定,则与菜单直线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 状态栏设计5 对话框设计5.1 静态对话框5.1.1静态对话框的建立过程建立静态对话框的过程如下:1.打开或建立工程。按照前面方法打开或者建立一个工程(MFC工程或者窗体应用程序均可,此处以mfc工程为例)2.打开资源窗口。通过“视图-其他窗口-资源视图”打开资源视图窗口。3.建立对话框。在资源视图的DIALOG文件夹上单击右键选择insert dialog,弹出新建的对话框,根据需要可以修改对话框属性面板中的属性值。4.添加对话框类。在建立的该对话框上双击鼠标左键,弹出添加类向导,根据提示设置好参数后确认,则建立了与对话框对应的对话框类。5.1.2静态对话框的应用对话框的应用一般是实现人机交互,以下结合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),点击完成,完成对话框类的建立,可以看到在解决资源管理器的头文件和源文件中已经建立了相应的件。图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),点击右边的添加变量按钮弹出添加变量窗口。图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,击添加处理程序,弹出处理程序对话框,默认之后点击确定则为按钮添加了对应的函数,双击line2dlg.cpp会看见添加了如下函数:void line2dlg:OnClickedButton1()/ TODO: 在此添加控件通知处理程序代码图5.1.2.77.编写代码获取数据。在前面添加的按钮函数中编写如下代码获取数据:UpdateData(true);CDialog:EndDialog(0); /结束对话框该函数的作用是把输入文本框的坐标数据赋值到对应的变量中,即四个文本框对应的变量line1x,line1y,line1endx,line1endy。如果代码为UpdateData(false);则是指把变量中的数值显示到变量对应的文本框中。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定位到该代码窗口的最上端头文件处,添加以下一句:#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菜单会弹出对话框,在对话框中设置好起点终点坐标后点确定,则在客户区画出指定坐标的直线。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”键,在视图窗口中显示提示信息“用户同时按下了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, 接下来在KeyboardDemoView构造函数中给三个指示变量赋初值”false”。代码如下: CKeyboardDemoView:CKeyboardDemoView() bShiftdown=bShiftup=bShiftB=false;/赋初值 (3)利用“建立类向导”添加键盘消息及处理函数,步骤如下: 在”ClassName”列表框中,选择键盘消息的处理函数”CKeyboardDemoView”,在”Object IDs”列表框中选择“CKeyboardDemoView”, 则在“Message”列表框中,列出了MFC为其预定义的消息,分别选择WM_KEYDOWN、WM_KEYUP、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:OnKeyDown(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, 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”的OnDraw函数中,实现在客户区窗口输出按键提示信息。代码如下: 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) 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_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_END35EndVK_HOME36HomeVK_LEFT37Left ArrowVK_UP38Up ArrowVK_RIGHT39Right ArrowVK_DOWN40Down ArrowVK_SELECT41SelectVK_PRINT42PrintVK_EXECUTE43ExecuteVK_SNAPSHOT44SnapshotVK_INSERT45InsertVK_DELETE46DeleteVK_HELP47Help48049150251352453554655756857965A66B67C68D69E70F71G72H73I74J75K76L77M78N79O80P81Q82R83S84T85U86V87W88X89Y90ZVK_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_SUBTRACT109小键盘 -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 LockVK_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_UP175VolumeUpVK_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_OEM_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_MBUTTONDBLCLk鼠标中键被双击WM_MBUTTONDOWN鼠标中键被按下WM_MBUTTONUP鼠标中键被释放WM_MOUSEMOVE鼠标移动穿过客户区域WM_RBUTTONDBLCLK鼠标右键被双击WM_RBUTTONDOWN鼠标右键被按下WM_RBUTTONUP鼠标右键被释放WM_MOUSEWHEEL在客户区内鼠标滚轮滚动应用程序一般是处理客户区鼠标消息。非客户区鼠标消息可以被Windows本身妥善的处理。 客户区鼠标消息处理函数的一般形式为: void OnXxxYyy(UINT nFlag, CPoint point); 如WM_LBUTTONDOWN的消息处理函数,其声明如下: void OnLButtonDown(UINT nFlag, CPoint point); 函数的两个参数说明如下: point:为CPoint类对象,记录了当前光标的x,y坐标,这个坐标是以相对于窗口客户区左上角的设备坐标而言的。 nFlags:为鼠标动作的条件标志,取值是以下各种取值的组合。各取值含义如下:MK_LBUTTON:按下了鼠标的左键。MK_MBUTTON:按下了鼠标的中键。MK_RBUTTON:按下了鼠标的右键。MK_CONTROL:按下了键盘上的Ctrl键。MK_SHIFT:按下了键盘上的Shift键。在实际编程中,常使用nFlags参数与以上可能取值进行位与运算,来判断消息生成时的鼠标键以及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) 鼠标捕捉 如果你的鼠标移出了某个窗口的客户区范围,那么此窗口将不再继续收到客户区鼠标消息。 SetCapture和ReleaseCapture 如果你用SetCapture进行了鼠标捕捉,那么,即使你的鼠标移出了窗口客户区,仍然可以收到客户区鼠标消息,直到调用ReleaseCapture释放鼠标捕捉或在某个窗口上进行点击为止。 注意: 一旦某个窗口捕获了鼠标,其他窗口将无法得到鼠标消息。 因此,当窗口不再需要捕获鼠标消息时,应及时使用ReleaseCapture函数将鼠标释放。7.2.2非客户区鼠标消息当鼠标通过非客户区时,就会触发非客户区鼠标消息。常见的非客户区鼠标消息消息名称消息说明WM_NCLBUTTONDBLCLK 鼠标左键被双击WM_NCLBUTTONDOWN鼠标左键被按下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消息 实现功能: 当按下鼠标左键并移动鼠标时,在客户区窗口内将绘制鼠标的移动轨迹,同时光标变为“十字”光标或自定义光标。 当按下鼠标左键时,鼠标的移动范围被限制的整个客户区窗口范围时,即鼠标不能移到客户区外。 当释放了鼠标左键后,鼠标恢复原来的活动区域。开发步骤: (1)创建工程。启动Visual C+,利用MFC APPWizardEXE建立一个新的MFC工程,工程名为“MouseDemo”, 在MFC AppWizard Step1的时候选择“Single documents”即基于单文档的MFC工程,之后的步骤使用默认值。 (2)利用“ClassWizard”添加鼠标消息及处理函数: 在”ClassName”列表框中,选择鼠标消息的处理类”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);/恢复原来的鼠标活动区域 ReleaseCapture(); /释放鼠标捕捉 CView:OnLButtonUp(nFlags, point); 添加WM_MOUSEMOVE的消息处理代码如下: void CMouseDemoView:OnMouseMove(UINT nFlags, CPoint point) CDC * pDC=GetDC(); /获得DC HCURSOR cursor; /鼠标光标句柄 RECT rcClip; /限制矩形区域 if(nFlags&MK_LBUTTON) = MK_LBUTTON) /移动鼠标时鼠标左键是按下的 GetWindowRect(&rcClip); /获取客户区窗口区域 ClipCursor(&rcClip); /将鼠标的移动限制的客户区 cursor=AfxGetApp()-LoadStandardCursor(IDC_CROSS); /载入标准十字光标 SetCursor(cursor); /使用新光标 pDC-MoveTo(startpoint.x,startpoint.y); /开始画线 pDC-LineTo(point.x,point.y); startpoint=point; CView:OnMouseMove(nFlags, point); (4)编译运行程序解释: (1)在鼠标消息响应函数中,根据参数nFlags可以判断鼠标的左、右、中键以及键盘上的Shift键和Ctrl键的按下状态。 在本例的OnMouseMove()函数中,就利用nFlags参数判断鼠标左键是否被按下来完成画线功能。 (2)当按下鼠标左键并移动鼠标时,在OnMouseMove()函数中通过调用API函数ClipCursor()将鼠标的活动区域限制在客户区窗口中。 而当鼠标左键释放时,在函数OnLButtonUp()中,通过ClipCursor()将鼠标的活动区域恢复为原来状态。2.实例2:CDC* pDC =GetDC();if (nFlags=MK_LBUTTON) pDC-LineTo(point.x,point.y);CView:OnLButtonDown(nFlags, point);3.实例3:CDC* pDC =GetDC();CPen pen;pen.CreatePen(PS_SOLID,5,RGB(255,0,0);CPen* pOldPen=pDC-SelectObject(&pen);if (nFlags=MK_LBUTTON) pDC-MoveTo(400,300);pDC-LineTo(point.x,point.y);pDC-SelectObject(pOldPen);4.实例4:CDC* pDC =GetDC();CPen pen;pen.CreatePen(PS_SOLID,2,RGB(255*rand(),255*rand(),255*rand(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 肌腱损伤基因治疗-洞察及研究
- 山东省日照市东港区2024-2025年八年级下学期期末考试物理试题(含答案)
- 江苏省南通市2025-2026学年七年级语文上学期第一次月考复习试卷(含答案)
- 福建省莆田市第九中学2024-2025学年七年级上学期期中考试数学试卷(含答案)
- 13.1热量 比热容 同步练习(含解析)2025-2026学年人教版(2024)九年级全册
- 部门员工安全培训制度课件
- 避孕药具管理培训课件
- 边沟施工安全培训内容课件
- 触觉反馈人机工效-洞察及研究
- 基于微米级精度的制造工艺如何重构农业机械管路系统的标准化流程
- 乡村文旅规划
- 提高手术安全核查正确率PDCA医院改善项目申报书
- 广东省普通高中学科教学水平评估指标详述
- 污水处理厂人员培训方案
- 苏教版五年级上册数学分层作业设计 5.5 小数乘小数(附答案)
- 现货黄金购买合同模板
- 学术道德与学术规范
- 《机械基础》课件-V带传动
- 全国大学英语六级词汇表
- 中职学校实训室管理制度及流程
- JJG 4-2015钢卷尺行业标准
评论
0/150
提交评论