第17讲鼠标消息响应和界面设计课件.ppt

上传人:可**** 文档编号:87341722 上传时间:2023-04-16 格式:PPT 页数:35 大小:2.42MB
返回 下载 相关 举报
第17讲鼠标消息响应和界面设计课件.ppt_第1页
第1页 / 共35页
第17讲鼠标消息响应和界面设计课件.ppt_第2页
第2页 / 共35页
点击查看更多>>
资源描述

《第17讲鼠标消息响应和界面设计课件.ppt》由会员分享,可在线阅读,更多相关《第17讲鼠标消息响应和界面设计课件.ppt(35页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第第17讲讲 鼠标消息响应和界面设计鼠标消息响应和界面设计本讲主要内容鼠标消息响应 设计应用程序界面元素 工具栏状态栏鼠标光标窗口标题与图标2鼠标消息响应【例【例9-4】修改例9-3的单文档应用程序MyTextOut,程序运行后使用菜单命令,调用对话框输入显示的文本内容,在鼠标点击位置显示文本。3鼠标消息响应【编程步骤编程步骤】(1)例9-3中已经做好的对话框资源保留不变。在本例中只需要使用该对话框输入的文本内容,输入的坐标值不在本例中使用。4鼠标消息响应(3)编写鼠标消息的响应函数。当用户在视图窗口中单击鼠标左键时,应用程序要捕获鼠标,记下鼠标当时的位置坐标,以便将文本串显示于该位置。当用户

2、松开鼠标左键时,应用程序要释放鼠标,并刷新视图,以显示程序运行结果。6记录鼠标位置的变量类型为CPoint类型,变量名为 m_TextPos,该变量设计为CMyTextOutView类的成员,以便从该类的成员函数OnLButtonDown(UINT nFlags,CPoint point)的第二个参数point中取得鼠标当前位置信息。打开MyTextOutView.h文件,添加代码如下:鼠标消息响应7鼠标消息响应class CMyTextOutView:public CView protected:CPoint m_TextPos;/记录鼠标左击当时的位置坐标/Generated messag

3、e map functionsprotected:/AFX_MSG(CMyTextOutView)afx_msg void OnLButtonDown(UINT nFlags,CPoint point);/自动生成afx_msg void OnLButtonUp(UINT nFlags,CPoint point);/自动生成;8void CMyTextOutView:OnLButtonUp(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultReleaseCapture();/

4、必须释放鼠标CView:OnLButtonUp(nFlags,point);Invalidate(TRUE);/刷新视图鼠标消息响应为什么要捕获和释放鼠标呢?由于用户的鼠标可以在屏幕上任意移动。当鼠标移出窗口外时,窗口无法收到鼠标消息。此时,如果松开了鼠标左键,应用程序由于无法接受到该条消息而不会调用松开鼠标消息响应函数,这样就造成了错误。如何避免这种情况发生呢?解决的办法是要让窗口在鼠标移出窗口外时仍然能接受到鼠标消息。而Windows提供了一个API函数SetCapture()解决了这一问题。Invalidate()是CWnd类的成员函数,功能是刷新整个客户区。可以在CWnd派生类中直接调

5、用函数Invalidate()。视图类是CWnd类的派生类,在此调用之刷新当前视图。10鼠标消息响应(4)修改相关文件中的代码。打开MyTextOutView.cpp文件,重新编写OnDraw函数:void CTextOut_3View:OnDraw(CDC*pDC)CTextOut_3Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);/TODO:add draw code for native data herepDC-TextOut(m_TextPos.x,m_TextPos.y,pDoc-m_strText);编译连接,运行程序界面如图所示。11设计应用

6、程序界面元素【编程步骤编程步骤】1添加“文字”工具栏(1)在ResourceView中的Toolbar中插入新的工具栏,创建新的自定义工具栏 IDR_MY_TOOLBAR。13设计应用程序界面元素(3)进行“显示文字”按钮图标的编辑。如图所示。15设计应用程序界面元素(4)添加工具栏成员变量并修改OnCreate函数。打开MainFrm.h,添加新的工具栏成员变量添加新的工具栏成员变量。class CMainFrame:public CFrameWnd protected:/control bar embedded membersCStatusBar m_wndStatusBar;CToolB

7、ar m_wndToolBar;CToolBar m_wndMyBar;/新的成员变量16设计应用程序界面元素/设置工具栏窗口的标题m_wndMyBar.SetWindowText(_T(我的工具栏我的工具栏);m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);m_wndMyBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);DockControlBar(&m_wndMyBar,AFX_IDW_DOCKBAR_TOP);re

8、turn 0;编译连接,运行程序界面如图所示。编译连接,运行程序界面如图所示。设置框架窗口的允许停靠性质 设置工具栏的停靠性质。其中参数指定了工具栏将停靠在应用程序框架窗口的哪个边上 确定工具栏如何被停靠在框架窗口上。通过确定工具栏如何被停靠在框架窗口上。通过CFrameWnd:DockControlBar函函数完成。函数原型如下:数完成。函数原型如下:void DockControlBar(CControlBar*pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL)其参数如下:其参数如下:pBar:要停靠的控件栏指针。:要停靠的控件栏指针。nDockBarI

9、D:确定停靠在框架窗口的哪条边上。可以取值参数如表:确定停靠在框架窗口的哪条边上。可以取值参数如表9-7。lpRect:以屏幕坐标表示目标框架窗口非用户区中可被控件条停靠的位置。默以屏幕坐标表示目标框架窗口非用户区中可被控件条停靠的位置。默认参数为认参数为NULL。18设计应用程序界面元素2修改状态栏状态栏在应用程序中的主要作用是起到提示作用。下面需要在状态栏中增加一个新的窗格,用来显示鼠标当前的位置坐标。因为需要知道鼠标移动时的位置坐标,故需要在视图类的视图类的OnMouseMove函数函数中添加相关代码。19设计应用程序界面元素(1)在状态栏资源中添加一个窗格。实现的方法是打开MainFr

10、m.cpp文件,找到静态数组indicators的定义,在第一个数组元素ID_SEPARATOR后面增加一个新的数组元素,即添加了一个新的窗格,为了表明这个窗格的用途,故命名为ID_INDICATOR_MOUSE_POS。修改后的代码如下。static UINT indicators=ID_SEPARATOR,/状态提示行窗格ID_INDICATOR_MOUSE_POS,ID_INDICATOR_MOUSE_POS,/鼠标位置坐标值窗格ID_INDICATOR_CAPS,/大写ID_INDICATOR_NUM,/数字键ID_INDICATOR_SCRL,/滚动;20设计应用程序界面元素(2)在

11、ResourceView的String Table中添加ID_INDICATOR_MOUSE_POS,在Caption中输入“鼠标的当前坐标”。21设计应用程序界面元素(3)添加鼠标移动消息的响应函数。编写函数代码,将鼠标的位置坐标信息显示在状态栏新增的窗格中。22设计应用程序界面元素3鼠标光标的编辑与使用光标(cursor)是一种特殊的、可移动的3232点阵图形,用来作为鼠标指针的图形标志。光标与图标的最大区别是光标有一个热点,用于确定光标当前的像素位置。设置不同状态的光标是为了更加形象地表示出当前应用程序的状态,例如在执行“显示文字”命令时,改变鼠标光标的形状,用于表示当前的程序行为状态。

12、24设计应用程序界面元素(1)创建新自定义的光标资源。打开ResourceView标签,编辑“显示文字”光标,其ID为IDC_CURSOR_TEXT。设置其热点。25设计应用程序界面元素(2)在点击了“显示文字”菜单之后,光标形状就修改为IDC_CURSOR_TEXT。在CMyTextOutDoc.h中增加一个标志变量m_nText_Flag,初始化其值为0。当其值为1时表示当前处于“文本显示”命令状态。class CMyTextOutDoc:public CDocument protected:/create from serialization onlyint m_nText_Flag;/

13、当其为1时,标识当前处于“显示文本”状态 CMyTextOutDoc:CMyTextOutDoc()/TODO:add one-time construction code here m_nText_Flag=0;/初始值为026设计应用程序界面元素(3)改变光标形状的行为可在OnSetCursor函数中来实现。打开ClassWizard,class name选择CMyTextOutView,即要改变鼠标光标的窗口对象(CWin的子类)是CMyTextOutView,选择处理窗口的ON_WM_SETCURSOR消息,添加OnSetCursor函数。见图。程序运行时,只要鼠标进入到该窗口的区域,

14、Windows就会给该窗口对象发送ON_WM_SETCURSOR消息,并触发OnSetCursor函数。这样就可以在OnSetCursor函数中增加控制鼠标光标的逻辑,如可以简单的显示自定义光标,也可以加入一些复杂的逻辑,比如在一定的区域内显示自定义光标,在其它区域显示标准光标。28设计应用程序界面元素编写OnSetCursor函数,代码如下。BOOL CMyTextOutView:OnSetCursor(CWnd*pWnd,UINT nHitTest,UINT message)/TODO:Add your message handler code here and/or call defau

15、ltCMyTextOutDoc*pDoc=GetDocument();if(pDoc-m_nText_Flag=1):SetCursor(AfxGetApp()-LoadCursor(IDC_CURSOR_TEXT);return TRUE;/return CView:OnSetCursor(pWnd,nHitTest,message);OnSetCursor函数是CWnd类的成员函数,其原型如下。fx_msg BOOL OnSetCursor(CWnd*pWnd,UINT nHitTest,UINT message);如果鼠标输入没有被捕获并且鼠标使光标在CWnd对象内移动,则框架调用这个成

16、员函数。当用户将鼠标指针移到视图客户区时,鼠标不被捕获,Windows发送一个WM_ SETCURSOR消息到视图类。它传递的一个参数是窗口句柄pWnd,即鼠标指针所指的窗口,这里指的是视图窗口本身;OnSetCursor传递的第二个参数是nHitTest,这是一个鼠标点击测试代码,它以HTxxx开头,用于WM_NCHITTEST消息;OnSetCursor传递的第三个参数是触发事件的鼠标消息的ID,例如WM_MOUSEMOVE。WM_ SETCURSOR是专门用来设置鼠标指针的消息,当设置了鼠标指针以后,应该让它返回TRUE以防止indows再作缺省处理。因此,本例中将调用父窗口的代码ret

17、urn CView:OnSetCursor(pWnd,nHitTest,message);注释掉,替换为return TRUE,这样才能够改变光标的形状。SetCursor函数是API函数,故而使用全局访问符:来引导。该函数的功能是确定光标的形状。函数原型如下。HCURSOR SetCursor(HCURSOR hCursor);其参数hCursor为光标的句柄,该光标由LoadCursor函数载入。如果该参数为NULL,则该光标从屏幕上移开。仅当新光标与前面的光标不同时,才设置新光标,否则,该函数立即返回。其返回值:如果有前一个光标,则返回值是前光标的句柄;如果没有前光标,则返回值是NULL

18、。29设计应用程序界面元素第二种方法:在应用程序的CMyTextOutApp:InitInstance()函数中设置窗口标题。BOOL CMyTextOutApp:InitInstance()AfxEnableControlContainer();m_pMainWnd-UpdateWindow();m_pMainWnd-SetWindowText(文本显示案例文本显示案例);/设置标题栏 return TRUE;CWnd类的成员函数SetWindowText()函数将窗口的标题设为指定的文本。如果窗口为一个控件,则将设置控件内的文本,同时使一条WM_SETTEXT消息被发送到这个窗口。函数原型

19、如下。void SetWindowText(LPCTSTR lpszString);其参数lpszString指向一个CString对象或以null结尾的字符串,将被用作新的标题或控件文本。31设计应用程序界面元素5应用程序主窗口图标的修改在Windows中每个文件都有一个图标(icon)。应用程序的图标通常出现在程序标题栏的左上角、Windows桌面上、资源管理器的窗口中以及Windows底部的任务栏中。一般情况下,应用程序采用MFC应用程序向导提供的默认图标。下面我们学习添加自己的图标。(1)通过Insert|Resource命令插入Icon图标资源,使用图标资源编辑器编辑插入的图标IDI

20、_MY_ICON。32设计应用程序界面元素(2)为了在标题栏中显示新创建的图标,在MyTextOut.cpp文件的InitInstance()函数中添加如下代码。BOOL CMyTextOutApp:InitInstance()HICON hIcon=AfxGetApp()-LoadIcon(IDI_MY_ICON);m_pMainWnd-SetIcon(hIcon,TRUE);m_pMainWnd-SetIcon(hIcon,FALSE);m_pMainWnd-ShowWindow(SW_SHOW);m_pMainWnd-UpdateWindow();return TRUE;编译连接运行程序

21、。使用CWinApp类的成员函数LoadIcon()载入新创建的图标资源IDI_MY_ICON,LoadIcon()函数的原型如下。HICON LoadIcon(LPCTSTR lpszResourceName)const;HICON LoadIcon(UINT nIDResource)const;其功能是载入可执行文件中以lpszResourceName为名或是nIDResource指定的图标资源。调用CWnd类的成员函数SetIcon()将图标设定为其参数所标识的图标。该函数原型如下。HICON SetIcon(HICON hIcon,BOOL bBigIcon);返回值是指向一个图标的句

22、柄。参数hIcon指以前图标的句柄:参数bBigIcon如果为TRUE,则指定了3232像素的图标;如果为FALSE,则指定了1616像素的图标。调用CWnd类的另一个成员函数ShowWindow()来设置窗口的可视状态。该函数原型如下。BOOL ShowWindow(int nCmdShow);其返回值是,如果窗口原来可见,则返回非零值;如果CWnd原来是隐藏的,则返回0。其参数nCmdShow指定了CWnd应如何被显示 33设计应用程序界面元素MFC程序的工程有3个文件夹,debug,release和res。查看其中的debug目录发现所生成的应用程序MyTextOut的EXE文件仍使用默认图标。若要修改EXE文件的图标,只要将res文件夹中的MyTextOut.ico图标文件替换成想要的图标文件,之后删除debug和release文件夹,重新编译程序,再查看debug目录,可见MyTextOut的EXE文件已使用替换的图标。34课堂练习完成例9-4,例9-5。课后作业1.完成未能在课上完成的课堂练习。2.习题9-06(“设置字体”菜单项先不做)、9-08。35

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁