在MFC单文档的View类中,如何获得指向状态栏的指针
展开全部
众所周知,View窗口覆盖在主窗口MainFrame之上。在CView类的WN_MOUSEMOVE消息响应函数中操作状态栏,可以显示鼠标的位置坐标。这需要在CView类中获得CMainFrame类的指针,然后才能借用CMainFrame类定义的CStatusBar m_wndStatusBar(改为public)去操作状态栏。
操作方法如下:
(1)使用AfxGetApp()函数
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;//要求包含MainFrm.h头文件
CStatusBar *pStatus=&pFrame-m_wndStatusBar;//需要将m_wndStatusBar属性修改为公有
解释:AfxGetApp()是全局函数返回指向CWinApp类的指针
CWinApp* AfxGetApp( );
m_pMainWnd是CWinThread类的指针类成员,CWinApp是CWinApp的父类。
CWinThread和CWnd是兄弟类。CWnd的子类是CFrameWnd,CMainFrame继承于CFrameWnd。这时出现困惑,我们从CView类中获得其父类CMainFrame的指针,为什么要通过CWinApp类呢?MSDN这样解释m_pMainWnd:Use this data member to store a pointer to your thread’s main window object。既然m_pMainWnd是主窗口对象,当然可以通过强制类型转换为指向主窗口的指针,于是有(CMainFrame*)AfxGetApp()-m_pMainWnd。
事实是这样的,pFrame-m_wndStatusBar可以理解为一体,-的优先级为2,pFrame-m_wndStatusBar可以看作是m_wndStatusBar,对象取地址变为指针。
(2)使用GetParent()函数
以上的获取指向状态栏的指针的方法是最常用的方法,但存在难以理解,只会生搬硬套的问题。
在CView类内,人们最直接的想法是使用GetParent()函数直接获得父窗口CMainFrame类的指针。
CMainFrame *pFrame=(CMainFrame*)GetParent();
CStatusBar *pStatus=&pFrame-m_wndStatusBar;
其中,GetParent()返回的是CWnd类的指针。
CWnd* GetParent( ) const;
需要将其强制转换为指向CMainFrame类的指针。
(3)结论第二种方法容易理解,建议使用。
操作方法如下:
(1)使用AfxGetApp()函数
CMainFrame *pFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;//要求包含MainFrm.h头文件
CStatusBar *pStatus=&pFrame-m_wndStatusBar;//需要将m_wndStatusBar属性修改为公有
解释:AfxGetApp()是全局函数返回指向CWinApp类的指针
CWinApp* AfxGetApp( );
m_pMainWnd是CWinThread类的指针类成员,CWinApp是CWinApp的父类。
CWinThread和CWnd是兄弟类。CWnd的子类是CFrameWnd,CMainFrame继承于CFrameWnd。这时出现困惑,我们从CView类中获得其父类CMainFrame的指针,为什么要通过CWinApp类呢?MSDN这样解释m_pMainWnd:Use this data member to store a pointer to your thread’s main window object。既然m_pMainWnd是主窗口对象,当然可以通过强制类型转换为指向主窗口的指针,于是有(CMainFrame*)AfxGetApp()-m_pMainWnd。
事实是这样的,pFrame-m_wndStatusBar可以理解为一体,-的优先级为2,pFrame-m_wndStatusBar可以看作是m_wndStatusBar,对象取地址变为指针。
(2)使用GetParent()函数
以上的获取指向状态栏的指针的方法是最常用的方法,但存在难以理解,只会生搬硬套的问题。
在CView类内,人们最直接的想法是使用GetParent()函数直接获得父窗口CMainFrame类的指针。
CMainFrame *pFrame=(CMainFrame*)GetParent();
CStatusBar *pStatus=&pFrame-m_wndStatusBar;
其中,GetParent()返回的是CWnd类的指针。
CWnd* GetParent( ) const;
需要将其强制转换为指向CMainFrame类的指针。
(3)结论第二种方法容易理解,建议使用。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询