第17讲鼠标消息响应和界面设计.ppt
《第17讲鼠标消息响应和界面设计.ppt》由会员分享,可在线阅读,更多相关《第17讲鼠标消息响应和界面设计.ppt(35页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第17讲讲 鼠标消息响应和界面设计鼠标消息响应和界面设计本讲主要内容鼠标消息响应 设计应用程序界面元素 工具栏状态栏鼠标光标窗口标题与图标2鼠标消息响应【例例9-4】修改例9-3的单文档应用程序MyTextOut,程序运行后使用菜单命令,调用对话框输入显示的文本内容,在鼠标点击位置显示文本。3鼠标消息响应【编程步骤编程步骤】(1)例9-3中已经做好的对话框资源保留不变。在本例中只需要使用该对话框输入的文本内容,输入的坐标值不在本例中使用。4鼠标消息响应(2)使用ClassWizard为视图类中添加鼠标消息的响应函数。在Message Maps标签中,Class name为CMyTextOut
2、View,ObjectIDs为CMyTextOutView,Messages为WM_LBUTTONDOWN,点击“Add Function”,为CMyTextOutView类添加了成员函数OnLButtonDown。类似地,为“释放鼠标左键”事件,即WM_LBUTTONUP消息添加响应函数OnLButtonUp。5鼠标消息响应(3)编写鼠标消息的响应函数。当用户在视图窗口中单击鼠标左键时,应用程序要捕获鼠标,记下鼠标当时的位置坐标,以便将文本串显示于该位置。当用户松开鼠标左键时,应用程序要释放鼠标,并刷新视图,以显示程序运行结果。6记录鼠标位置的变量类型为CPoint类型,变量名为 m_Tex
3、tPos,该变量设计为CMyTextOutView类的成员,以便从该类的成员函数OnLButtonDown(UINT nFlags,CPoint point)的第二个参数point中取得鼠标当前位置信息。打开MyTextOutView.h文件,添加代码如下:鼠标消息响应7鼠标消息响应class CMyTextOutView:public CView protected:CPoint m_TextPos;/记录鼠标左击当时的位置坐标/Generated message map functionsprotected:/AFX_MSG(CMyTextOutView)afx_msg void OnLB
4、uttonDown(UINT nFlags,CPoint point);/自动生成afx_msg void OnLButtonUp(UINT nFlags,CPoint point);/自动生成;8鼠标消息响应打开MyTextOutView.cpp文件,编写两个鼠标消息响应函数。void CMyTextOutView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call defaultSetCapture();/捕获鼠标/将鼠标单击时的位置坐标保存到变量m_Text
5、Pos中 m_TextPos=point;CView:OnLButtonDown(nFlags,point);CWnd:SetCapture()用于捕获鼠标,无论鼠标光标位置在何处,都会将鼠标消息送给调用它的那一个窗口。在用完后,需要用ReleaseCapture()释放窗口对鼠标的控制,否则其他窗口将无法接收到鼠标消息。这一工作最好是在鼠标左键松开OnLButtonUp()时来做。9void CMyTextOutView:OnLButtonUp(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or c
6、all defaultReleaseCapture();/必须释放鼠标CView:OnLButtonUp(nFlags,point);Invalidate(TRUE);/刷新视图鼠标消息响应为什么要捕获和释放鼠标呢?由于用户的鼠标可以在屏幕上任意移动。当鼠标移出窗口外时,窗口无法收到鼠标消息。此时,如果松开了鼠标左键,应用程序由于无法接受到该条消息而不会调用松开鼠标消息响应函数,这样就造成了错误。如何避免这种情况发生呢?解决的办法是要让窗口在鼠标移出窗口外时仍然能接受到鼠标消息。而Windows提供了一个API函数SetCapture()解决了这一问题。Invalidate()是CWnd类的成
7、员函数,功能是刷新整个客户区。可以在CWnd派生类中直接调用函数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_st
8、rText);编译连接,运行程序界面如图所示。11设计应用程序界面元素【例例9-5】修改例9-4的单文档应用程序MyTextOut,为之增加界面修饰。包括:(1)为“显示文本”菜单命令添加工具栏按钮;(2)在状态栏中显示鼠标当前位置坐标,以及命令按钮的说明信息;(3)随不同的命令状态改变鼠标光标形状;(4)修改应用程序主窗口标题以及图标。12设计应用程序界面元素【编程步骤编程步骤】1添加“文字”工具栏(1)在ResourceView中的Toolbar中插入新的工具栏,创建新的自定义工具栏 IDR_MY_TOOLBAR。13设计应用程序界面元素(2)当鼠标光标在按钮位图的外面时,进行双击操作,就
9、会弹出下面的“Toolbar Button Properties”对话框,在其中设置“显示文本”按钮的ID。注意:这里的ID:ID_TEXT_OUTPUT与“文字|显示文字”菜单中的ID设为完全相同。14设计应用程序界面元素(3)进行“显示文字”按钮图标的编辑。如图所示。15设计应用程序界面元素(4)添加工具栏成员变量并修改OnCreate函数。打开MainFrm.h,添加新的工具栏成员变量添加新的工具栏成员变量。class CMainFrame:public CFrameWnd protected:/control bar embedded membersCStatusBar m_wndSt
10、atusBar;CToolBar m_wndToolBar;CToolBar m_wndMyBar;/新的成员变量16设计应用程序界面元素(5)在MainFrm.cpp中为CMainFrame:OnCreate函数添加如下代码,以便将自定义的工具栏IDR_MY_TOOLBAR与新添加的工具栏成员变量m_wndMyBar联系起来。同时设置新工具栏的停靠属性。int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if(!m_wndMyBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_
11、TOP|CBRS_GRIPPER|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_wndMyBar.LoadToolBar(IDR_MY_TOOLBAR)TRACE0(Failed to create my toolbarn);return-1;将工具栏资源将工具栏资源IDR_MY_TOOLBAR与工具栏成员变量与工具栏成员变量m_wndMyBar联联系起来系起来生成工具栏资源时需要设定工具栏的样生成工具栏资源时需要设定工具栏的样式,这些样式使用宏名代表,使用式,这些样式使用宏名代表,使用“|”可以同时使用几种样式。可以同时使用几种样式。参数值说明TBSTYLE_FLAT创建
12、平面工具栏,即工具栏和按钮都是透明的TBSTYLE_TRANSPARENT创建透明工具栏。在透明工具栏中,工具栏是透明的,但按钮不是。WS_CHILD子窗口WS_VISIBLE初始状态下是可见的CBRS_TOP创建时工具栏位于框架窗口的上边处CBRS_GRIPPER显示工具栏的把手CBRS_FLYBY在状态栏中显示工具栏按钮的提示信息CBRS_SIZE_DYNAMIC允许用户在浮动工具栏时动态改变工具栏的形状,如由水平改为垂直样式17设计应用程序界面元素/设置工具栏窗口的标题m_wndMyBar.SetWindowText(_T(我的工具栏我的工具栏);m_wndToolBar.EnableD
13、ocking(CBRS_ALIGN_ANY);m_wndMyBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);DockControlBar(&m_wndMyBar,AFX_IDW_DOCKBAR_TOP);return 0;编译连接,运行程序界面如图所示。编译连接,运行程序界面如图所示。设置框架窗口的允许停靠性质 设置工具栏的停靠性质。其中参数指定了工具栏将停靠在应用程序框架窗口的哪个边上 确定工具栏如何被停靠在框架窗口上。通过确定工具栏如何被停靠在框架窗口
14、上。通过CFrameWnd:DockControlBar函函数完成。函数原型如下:数完成。函数原型如下:void DockControlBar(CControlBar*pBar,UINT nDockBarID=0,LPCRECT lpRect=NULL)其参数如下:其参数如下:pBar:要停靠的控件栏指针。:要停靠的控件栏指针。nDockBarID:确定停靠在框架窗口的哪条边上。可以取值参数如表:确定停靠在框架窗口的哪条边上。可以取值参数如表9-7。lpRect:以屏幕坐标表示目标框架窗口非用户区中可被控件条停靠的位置。默以屏幕坐标表示目标框架窗口非用户区中可被控件条停靠的位置。默认参数为认参
15、数为NULL。18设计应用程序界面元素2修改状态栏状态栏在应用程序中的主要作用是起到提示作用。下面需要在状态栏中增加一个新的窗格,用来显示鼠标当前的位置坐标。因为需要知道鼠标移动时的位置坐标,故需要在视图类的视图类的OnMouseMove函数函数中添加相关代码。19设计应用程序界面元素(1)在状态栏资源中添加一个窗格。实现的方法是打开MainFrm.cpp文件,找到静态数组indicators的定义,在第一个数组元素ID_SEPARATOR后面增加一个新的数组元素,即添加了一个新的窗格,为了表明这个窗格的用途,故命名为ID_INDICATOR_MOUSE_POS。修改后的代码如下。static
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 17 鼠标 消息 响应 界面设计
限制150内