我在从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类的公有变量,能不能做到?不能做到是为什么?有啥变通的好的做法? 
请大虾们谈谈,指导指导!!! 

解决方案 »

  1.   

    能的,现在关键是看不出你错那
    工程不大传给我帮你看看:[email protected]
      

  2.   

    应该是在程序调用CBtmpbutton类的构造函数时,主窗口(AfxGetApp()->GetMainWnd())还没有被创建.调整一下构造CBtmpbutton类实例的位置,在确认主窗口创建后再生成CBtmpbutton类实例.
      

  3.   

    嗯,可能是这个原因,你在CBtmpbutton::OnCreate里调用这些代码看看。
      

  4.   

    怎么会是实例化太早,我在视类窗口的OnCreate()里实例化CBtmpbutton类对象,然后创建按钮,此时视类窗口已经创建,只是没有show出来而已.在点击文件打开菜单项响应函数OnFileOpen()中读取了数据库的数据然后,然后用pbtn = new CBtmpbutton();new一个CBtmpbutton类对象出来,然后利用数据库数据中给出按钮坐标数据和宽高数据来pbtn->Create(....)来创建按钮时,程序语句在这里才实例化,如果CBtmpbutton类能用程序能运行,此时视类窗口都已经显示了可以看到了。没有说到点子上,我可能没有表述清楚,另外又开了一帖,盼请指导。http://topic.csdn.net/u/20090601/15/d595d6fd-4918-464d-9075-3badac8b82f3.html
      

  5.   

    你可以增加一个CBtmpbutton的成员函数,构造 的时候传递CPCBView等指针进去,然后保存到CBtmpbutton 的成员变量中,以后就可以通过这个成员变量使用这个指针了