学习鼠标编程和wingdows消息机制

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2.3.1 鼠标消息处理
MFC把鼠标消息处理函数封装在CView类中,它们 分别是: OnMouseMove(UINT nFlags, CPoint point); OnLButtonDblclk(UINT nFlags, CPoint point); OnLButtonDown(UINT nFlags, CPoint point); OnLButtonUp(UINT nFlags, CPoint point); …… 分别对应表2.3中10个鼠标消息。在鼠标处理函数中, point参数代表鼠标热点处的坐标位置,point.x为横坐标, point.y为纵坐标。默认坐标原点(0,0)位于窗口的左上角。 由于应用程序要求自动捕获鼠标事件,因此应当采用 Windows事件处理函数,而不是成员函数,具体使用方法 参见2.3.3节示例程序。
void CMouseView::OnRButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,60,"RButton Down!"); CView::OnRButtonDown(nFlags, point); } void CMouseView::OnRButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,40,"RButton UP!"); CView::OnRButtonUp(nFlags, point); }
其中,阴影部分是用户输入的程序,其它内容都 是自动生成的内容。
第四步:重复第二步和第三步,分别添加
WM_LBUTTONUP,WM_MOUSEMOVE, WM_RBUTTONDOWN,WM_RBUTTONUP, WM_LBUTTONDBCLK, WM_RBUTTONDBCLK 鼠标事件,并输入以下程序: void CMouseView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,40,"LButton UP!"); CView::OnLButtonUp(nFlags, point); }
标左击点为圆心,m_ist=1,表示鼠标左击点为圆周上的点
操作方法如图2-13所示,分别添加上述三个成员变量。
图2-13 添加成员变量
第三步:向视图类中添加自定义的成员函数原型:
public: void DrawCircle(CDC* pDC, CPoint cenp, CPoint ardp); int ComputeRadius(CPoint cenp,CPoint ardp); 具体操作方法:用鼠标右键单击视图类,选择“Add Member Function…”,如图2-14所示。分别添加上述两个 成员函数,分别用于画圆和计算圆的半径。
2.3.3 鼠标编程综合示例
示例1:在窗口中以文本的形式给出鼠标 的状态,即当鼠标移动时,给出鼠标的位置; 当鼠标按下鼠标左、右键时显示出鼠标按键状 态。例如,当鼠标左键按下时,显示 “LBUTTON DOWN!”。 第一步:建立一个myMouse工程文件; 第二步:添加鼠标事件处理函数 鼠标右击视图类(如CmyMouseView), 选择“add windows message handler…”, 弹出事件处理函数列表窗口,如图2-11所示
and/or call default
CDC *pDC=GetDC(); pDC->SelectStockObject(NULL_BRUSH); if (!m_ist) //绘制圆 { m_bO=m_bR=point; //纪录第一次单击鼠标位置,定圆心 m_ist++; }
else { m_bR=point; //记录第二次单击鼠标的位置,定圆周上的点 m_ist--; // 为新绘图作准备 DrawCircle(pDC,m_bO,m_bR); //绘制新圆 } ReleaseDC(pDC); //释放设备环境 CView::OnLButtonDown(nFlags, point); } void CMouseSpringView::OnMouseMove(UINT nFlags, CPoint point) {
nFlags参数中包含了鼠标按钮和键盘组合使用标志, 用来描述鼠标按钮和键盘上的Shift键和Ctrl键的组合 状态。nFlag参数取值范围: MK_LBUTTON:鼠标左键被按下; MK_RBUTTON:鼠标右键被按下; MK_MBUTTON:鼠标中键被按下; MK_SHIFT:键盘上的Shift键被按下; MK_CONTROL:键盘上的Ctrl键被按下; 如果想知道某个键是否被按下,可用对应的位屏蔽 值与nFlags参数作按位逻辑“与”运算,所的结果若 为非零值,则表示该按钮被按下,例如:
void CMouseView::OnLButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,80,"LButton is double clicked!"); CView::OnLButtonDblClk(nFlags, point); } void CMouseView::OnRButtonDblClk(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); pDC->TextOut(20,80,"RButton is double clicked!"); CView::OnRButtonDblClk(nFlags, point); } 第五步:编译程序,并验证执行结果。
第五步:在视图类的OnDraw()函数中加入下列代 码,实现视图绘图。
void CMouseSpringView::OnDraw(CDC* pDC) { CMouseSpringDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // TODO: add draw code for native data here pDC->SelectStockObject(NULL_BRUSH); DrawCircle(pDC,m_bO,m_bR); // 调用自定义的 成员函数画圆 }
Visual C++图形程序设计基础
2.3 鼠标编程
在图形操作系统中,鼠标是最重要的输入设 备之一。Windows系统为用户提供了统一的鼠标 编程接口,而不必过多了解其底层的知识。 Windows是基于消息传递、事件驱动的操作系统, 当用户移动鼠标、按下或释放鼠标键时都会产生 鼠标消息。应用程序可以接收10种鼠标消息,表 2.3列出了这些鼠标消息和它们的描述。
示例2:采用鼠标橡皮筋技术画圆
鼠标橡皮筋技术画圆就是采用圆心和圆周上任一点画 圆技术(简称C+P方法),首先用鼠标左击选择圆心位置,然 后移动鼠标,圆随鼠标移动而扩大或缩小,当再次单击鼠 标左键时,确定圆周上的一点,从而画出相应的圆。直线、 矩形等基本图形都可以采用橡皮筋技术。 第一步:建立MouseSpring工程文件; 第二步:向视图类中添加自定义的成员变量 用鼠标右键单击视图类,选择“Add Member Variable…”,添加下面三个成员变量。 proctected : CPoint m_bO; // 圆心 CPoint m_bR; //圆上的点 int m_ist; //圆心与圆周上点的区别,m_ist=0,表示鼠
void CMouseView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CDC *pDC=GetDC(); char tbuf[80]; sprintf(tbuf,"Position:(%3d,%3d)",point.x,point.y); // 输出鼠标当前位置 pDC->TextOut(20,20,tbuf); CView::OnMouseMove(nFlags, point); }
2.3.2 捕捉鼠标
在交互式图形程序设计中,经常要使用鼠 标的位置拾取、拖动或拖放,这些动作必须进行 鼠标的捕捉。 鼠标捕捉只需要调用CWnd::SetCapture() 函数。用户完成鼠标捕捉工作后一般是响应一个 鼠标按下信息,要释放鼠标捕捉则是调用 CWnd::ReleaseCapture()函数。释放被捕捉鼠 标的最好时间是在响应鼠标弹起的时候 (WM_LBUTTON)。
图2-14
添加成员函数
第四步:在视图类CPP文件的构造函数中初始化成员变量
视图类的构造函数名与该视图类的名字相同。在视 图类中选择构造函数,如:CMouseSpringView(),用 鼠标左键双击,输入下面程序代码: CMouseSpringView:: CMouseSpringView() { //TODO: add construction code here m_bO.x=0; m_bO.y=0; //圆心 m_bR.x=0; m_bR.y=0; //圆上的点 m_ist=0; //圆心与圆上的点区别 }
图2-11
Windows事件处理函数列表窗口
从左边事件消息列表中选择 “WM_LBUTTONDOWN”,然后单击“Add and Edit” 按钮,即加入鼠标左键按下事件函数,并要求编辑事件处 理程序。
第三步:输入事件处理程序
void CMymouseView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default //获得pDC CDC* pDC=GetDC(); pDC->CView::TextOut(20,40,”LBUTTONDOWM!”); // 输出显示信息 OnLButtonDown(nFlags, point); }
if (nFlags & LBUTTON) AfxMessageBox(“LButton is pressed down!”) Else AfxMessageBox(“LButton is press源自文库d Up!”); 如何区分两次单击和一次双击,这取决于两次按下 按钮之间的时间间隔,只有当时间间隔小于一定值时 才被认为是Windows默认的时间为500ms。可以用 SetDoubleClickTime()函数来重新设置时间间隔值。 若要使窗口函数能接收到鼠标双击产生的消息,在 注册窗口类时,必须指明该窗口具有CS_DBLCLKS风 格,否则,即使进行了双击操作,该窗口也只能收到 两条“WM_LBUTTONDOWN”和 “WM_LBUTTONUP”消息,例如: wndclass.style=CS_HREDRAW|CS_VREDRAW|CS_D BLCLKS;
第六步:向视图类中添加两个鼠标消息响应函数, 并输入鼠标处理程序代码。
具体操作方法与鼠标示例1方法相同。一个是 OnLButtonDown()函数,另一个是OnMouseMove()函数。 程序如下: void CMouseSpringView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: Add your message handler code here
相关文档
最新文档