在MFC单文档的View类中,如何获得指向状态栏的指针

在MFC单文档的View类中,如何获得指向状态栏的指针,第1张

众所周知,View窗口覆盖在主窗口MainFrame之上。在CView类的WN_MOUSEMOVE消息响应函数中 *** 作状态栏,可以显示鼠标的位置坐标。这需要在CView类中获得CMainFrame类的指针,然后才能借用CMainFrame类定义的CStatusBar m_wndStatusBar(改为public)去 *** 作状态栏。

*** 作方法如下:

(1)使用AfxGetApp()函数

CMainFrame pFrame=(CMainFrame)AfxGetApp()-m_pMainWnd;//要求包含MainFrmh头文件

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)结论第二种方法容易理解,建议使用。

POSITION t_Pos = t_pDoc->GetFirstViewPosition();

在这一行代码中,t_pDoc必须是已有示例的实际文档类指针,不能是一个新声明的变量。因此肯定是错误的。

如果是在文档类函数中,那么直接:

COpencv_PaintView pView = NULL;

POSITION t_Pos = GetFirstViewPosition();//在文档类中可以直接使用该函数。

pView = GetNextView(t_Pos);

如果你这个对话框是在view的成员函数中d出来的,也就是说在成员函数中声明并DoModal的,可以在DoModal之前直接把this指针传递到对话框对象中的成员函数中。这样在IDOK中进行赋值。假如view类是MyView,对话框类MyDlg,在MyView的成员函数fun()中d出对话框,一般的例子如下:

class CMyView;

class CMyDlg : public CDialog

{

//下面是增加的定义内容

private:

CMyView m_pView; //接收View类的指针

public:

SetMyView(CMyView pView) //提供接收view指针的 *** 作

{ m_pView = pView; }

};

void CMyView::fun()

{

MyDlg dlg;

dlgSetMyView(this); //将CMyView对象的this指针传递给对话框。

if(dlgDoModal()==IDOK)

{

//相应的处理过程

}

}

用static 窗口变量返回你的ViewTree指针就好了。

在你的ViewTree窗口中,设定一个static指针,并在窗口初始化时赋值。

static CViewTree m_pTreeView = this;

并定义一个static方法,返回这个static指针。

static CViewTree ReturnView()

{

return m_pTreeView;

}

在你的MainFrame中,直接获取就好了,但须用IsWindow函数来判定获取的是否是窗口。

CViewTree m_pView = CViewTree::ReturnView();

ASSERT(::IsWindow(m_pView->m_hWnd));

getparent得到的是cwnd,是父窗口的指针;

getparent()->getsafehwnd(),可以得到父窗口的句柄

如果只是调用窗口的类似函数,cwnd

ch

=

getparent()就可以了,如果是要调用chomeview里面的接口,chomeview

ch

=

(chomeview

)

getparent();

你创建子窗口不是要通过主窗口吗?创建的子窗口的时候,将子窗口的指针保存起来就是了

1、主窗口中在创建的时候直接保存子窗口对象指针

2、如果子窗口是以WS_CHILD创建的,除了保存指针以外,还可以通过FindWindowEx 、EnumChildWindows 来找子窗口

以上就是关于在MFC单文档的View类中,如何获得指向状态栏的指针全部的内容,包括:在MFC单文档的View类中,如何获得指向状态栏的指针、MFC中在DOC类获得VIEW的指针、我在MFC中一个d出对话框的IDOK函数中想把数据赋值到View类中的成员变量,如何获取视类窗口指针呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9748876.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存