关于自定义类中访问CPCBView或CFrameWnd或CPCBDoc类的公有变量的 问题再来100分,对之前的提问帖进行补充提问?
我在从CButton类派生的自绘按钮类CBtmpbutton头文件中的CBtmpbutton类定义前加上class CPCBView;这个前向声明,再在CBtmpbutton类的实现文件中的开始位置添加了以下头文件包含
#include "stdafx.h"
#include "键盘PCB测试程序.h"
#include "MainFrame.h"
#include "键盘PCB测试程序Doc.h"
#include "键盘PCB测试程序View.h"
......
然后编译连接都通过了,但是运行时出错,于是跟踪一下发现:程序运行到CBtmpbutton类的构造函数中的
m_pview = (CPCBView*)(((CFrameWnd*)(AfxGetApp()->GetMainWnd()))->GetActiveView()); 出错。
于是将这条长语句拆分成以下语句后查看相关指针值:
CPCBApp * papp = (CPCBApp *)AfxGetApp();
CFrameWnd* pmfr = (CFrameWnd*)(papp->GetMainWnd());
m_pview = (CPCBView*)(pmfr->GetActiveView());
发现papp里有值, pmfr里是0X00000000h,也就是pmfr值为空,即找不到主窗口对象指针,再继续跟踪运行即报运行时错误了。
而同样是这条语句m_pview = (CPCBView*)(((CFrameWnd*)(AfxGetApp()->GetMainWnd()))->GetActiveView());
我在这个程式没有添加CBtmpbutton类这部分功能的时候在CAboutDlg类中也添加了一个成员变量CPCBView* m_pview,也用这条语句在CAboutDlg类的构造函数进行初始化赋值,没有问题,我还在CAboutDlg类的其它函数中用这个m_pview访问了CPCBView类的公有变量,并显示在了关于对话框的EDIT控件中了的,为什么在自定义的类中就无法取得CFrameWnd* pmfr呢???
我注意到了,CAboutDlg类是定义在 “键盘PCB测试程序.h”中的,而程序全局变量CPCBApp TheApp;和CAboutDlg()构造函数也是在“键盘PCB测试程序.cpp”中的,那么在自定义的CBtmpbutton类中使用AfxGetApp();能正确地得到TheApp对象的地址指针吗?如果正确地得到TheApp对象的地址指针,为什么得不到正确CFrameWnd* pmfr???,也注意到了:“Btmpbutton.cpp”中所包含的头文件几乎和“键盘PCB测试程序.cpp”中所包含的头文件一模一样,那编译器编译连接通过,编译器能区分一个工程中那一个.cpp文件是程序的入口文件吗(如果能区分是靠检测程序中的WinMain()函数区分吗?),会不会是不能区分程序的入口.cpp这个原因造成运行时错误的?
本来在自定义的类中定义CPCBView* m_pview然后在类中利用m_pview访问CPCBView类的公有变量,不利于自定义类(Button控件)的封装,网上也基本搜不到这种使用例子,但是如果一定想要在自定义类中象在关于对话框类CAboutDlg中这样访问CPCBView或CFrameWnd或CPCBDoc类的公有变量,能不能做到?不能做到是为什么?有啥变通的好的做法?
请大虾们谈谈,指导指导!!!