⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 9.7 在状态栏上显示鼠标当前位置.txt

📁 网上第一本以TXT格式的VC++深入详解孙鑫的书.全文全以TXT格式,并每一章节都分了目录,清晰易读
💻 TXT
字号:
9.7  在状态栏上显示鼠标当前位置

下面,我们要实现这样的功能:当在 Style程序窗口中移动鼠标时,把鼠标当前的坐标显示在状态栏
的第一个窗格上。
为了完成这个功能,首先就要捕获鼠标移动消息。前面已经介绍过,视类窗口始终覆' 盖在框架窗
口之上,所以如果想要捕获与鼠标相关的消息,应该在视类中完成。因此,需要为 CStyleView类添
加 WM_MOUSEMOVE消息的响应函数,并在此函数中添加在程序状态栏的第一个窗格上显示鼠标当前位
置的代码,结果如例 9-32所示。
例 9-32 
1. void CStyleView: :OnMouseMove(UINT nFlags , CPoint po工 nt) 
2. { 

3. // TODO: Add your message handler code here and/or call defau工 t 

4. cString str; 

5. str.Format("x=%d, y=%d", point.x,point .y) ; 

6. ((CMainFrame* GetParent())->m_wndStatusBar.SetWindowText (str) ; 


7. CView::OnMouseMove(nFlags , point); 

8. } 


上述例 9-32所示代码巾,首先格式化鼠标当前位置的信息。然后为了把该信息显示在状态栏的第一
个窗格上,需要获取状态栏对象。而后者是在框架类窗口中定义的,同时,框架类窗口是视类窗口
的父窗口,因此在视类对象中通过调用 GetParent函数就可以得到视类的父窗口,即框架窗口。因
为该函数返回的是一个 CWnd类型的指针,而这里需要的是 CMainFrame类型的指针,所以需要进行
一个转换。然后利用框架窗口对象去调用该对象内部的状态栏成员变量: m_wndStatusBar,以得到
状态栏对象,但是我们注意到该变量被声明为保护( protected)类型,对于保护类型的类成员变量
来说,只能在该类及其子类 
中访问,在其他类中是不能直接访问的。为了能够访问这个变量,我们修改这个变量的定义,将其
访问权限修改为public类型,即在CMainFrame类的头文件中,把这个变量的定义修改为: 
public : 
CStatusBar m_wndStatusBar; 

目提示:对于 MFC自动创建的代码,在编程过程中,只要知道程序编写的原理,就可以根据自己的需
要进行修改。
得到状态栏对象后,就可以把鼠标当前位置信息显示在第一个窗格上了。这里有多种
实现方法,分别如下所述。 
1.第一种方法
调用 SetWindowText函数设置状态栏窗口文本,就可以把鼠标当前位置信息设置到状态栏的第一个
窗格上。因为上述代码中用到了框架类的类型,所以在视类的源文件中应该将框架类的头文件包含
进来,即在CStyleView.cpp文件的前部添加下面这条代码: 
#include "MainFrm.h" 
Build井运行Style程序,当在程序窗口中移动鼠标时,在程序状态栏的第一个窗格上就显示了当前
鼠标的坐标信息,程序运行界面如图9.46所示。 
图 9.46在状态栏第一个窗格上显示鼠标当前位置 

2.第二种方法
利用CFrameWnd类的成员函数: SetMessageText来实现,该函数的作用是在B为O值的状态栏窗格上
(通常就是指状态栏上最左边的那个最长的窗格)设置一个字符串。该函数的一种原型声明如下所示: 
void SetMessageText( LPCTSTR lpszText ) ; 
其中,参数lpszText就是用来设置的字符串。
读者应注意, SetMessageText函数是CFrameWnd类的成员函数,井且该函数直接在状态栏的第一个
窗格上放置文本,这样在程序中不需要先获得状态栏对象,然后再进行设置文本的处理。我们知道 
CMainFrame类派生于 CFrameWnd类,因此它继承了
SetMessageText函数。于是,这里首先需要调用 GetParent函数得到视类的父对象,即 CMainFrame
对象,然后调用该对象的 SetMessageText函数设置状态栏文本。也就是说,上述例 9-32所示
CStyleView类的OnMouseMove函数的第6行代码可以用下面这行代码来替换: 
((CMainFrarne*)GetParent())->SetMessageText(str)i 
读者可以测试一下这种实现方法,将会发现 Style程序的运行结果与上述第一种方法的结果是一样
的。 
3.第三种方法 
CFrameWnd类的成员函数: GetMessageBar可以返回状态栏对象的指针,这样就不需要再访问
CMainFrame类的保护成员变量:In-WIldStatusBar了,因此也就不需要像上述第一种方法那样将该变
量的访问权限修改为public类型了。有了状态栏对象的指针,然后就可以像上述第一种方法那样,
调用SetWindowText函数设置状态栏第一个窗格的文本。因此,第三种实现方法的代码如下所示: 
((CMainFrarne*)GetParent())->GetMessageBar()->SetWindowText(str)i 
读者可以测试一下这种实现方法,将会发现 Style程序的运行结果与上述两种方法的结果是一样的。 
4.第四种方法' 利用CWnd类的成员函数: GetDescendantWindow获得程序状态栏对象的指针。这个
函数的功能是通过指定的E来获得子孙窗口。这个函数将搜索当前窗口的整个子窗口树,不仅仅搜索
当前窗口的直接子窗口。该函数的原型声明如下所示: 
CWnd* GetDescendantWindow( int nID , BOOL bOnlyperm = FALSE ) const; 
因此,只要给定状态栏窗口的ID, GetDescendantWindow函数就可以找到指向状态栏窗口的指针。
读者应注意,这里不应该在视类中直接调用这个函数,因为状态栏不属于视类窗口,它属于框架类
窗口。所以,在调用时应该首先得到框架窗口的指针,然后调用框架窗口的GetDescendantWindow
函数,以搜寻框架窗口的子孙窗口,从而得到状态栏窗口的指针。另外,根据前面的知识,我们知
道状态栏子窗口的ID是AFX-BWJTA四S BAR, 因此,利用这个E调用 GetDescendantWindow函数就可以
找到指向主框架窗口所拥有的状态栏子窗口的指针。因此,第四种实现方法的代码如下所示: 
GetParent()->GetDescendantWindow(AFX一工DW二STATUS_BAR)->SetWindowText(str
回注意:这里调用 Ge阳nt函数后不需要再进行转换,因为 GetDescendant 
Window函数本身就是CWnd类的成员函数。
读者可以测试一下这种实现方法,将会发现Style程序的运行结果与上述方法实现的结果是一样的。 
对于一些常用的控制条(例如状态栏、工具栏等),MFC都已经预先为它们定义了 ID
号。可以在Style程序中,在上述代码中的AFX-IDW-STATUS-BAR这个ID上单击鼠标右键,然后从弹出
的快捷某单中选择 [ 00 To Definition Of AFX_IDW_ STATUS_BAR ]某单项,并单击系统显示的提
示是否创建浏览信息文件(.bsc)的对话框上的 [Yes ]按钮,这时, VC++会重新编译 Style程序,
并为这个程序产生浏览信息文件。之后,光标就将定位于MFC的源文件AFXRES.H中 
AFX-IDW-STATUS-BAR这个ID的定义处,代码如下所示: 
#define AFX IDW TOOLBAR OxE800 // main Toolbar for window 
#define AFX IDW STATUS BAR OxE801 // Status bar window 

#define AFX_IDW_PREVIEW_BAR OxE802 // Printpreview Dialog Bar 
#define AFX IDW RESIZE BAR OxE803 // OLE in-place resize bar 
#define AFX IDW REBAR OxE804 // COMCTL32 "rebar" Bar 
#define AFX工DW DIALOGBAR OxE805 // CDialogBar 
从中可以看到. MFC为我们预定义了工具栏(AFX_IDW_TOOLBAR)、状态栏、对话条(AFX_IDW_DIALOOBAR)
等子窗口的B。因此,在编写程序时,如果需要查找一个标准控制条的10,我们只要知道其中某个 ID,
就可以通过上述方法,找到其他控制条的D。
另外, OetDescendantWindow函数的调用还有一点需要注意:它的第二个参数用来指定该函数返回的
窗口能否是一个临时窗口。如果为TR阻,则只有持久的窗口可以被返回:如果为FALSE,则该函数可
以返回一个临时的窗口。关于临时窗口和持久窗口的概念,读者可以自行查看MSDN中的相关信息。 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -