我在从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类的公有变量,能不能做到?不能做到是为什么?有啥变通的好的做法?
请大虾们谈谈,指导指导!!!
#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类的公有变量,能不能做到?不能做到是为什么?有啥变通的好的做法?
请大虾们谈谈,指导指导!!!
解决方案 »
- 请教如何用CFileDialog打开并读一个文件(txt)
- 哪位能给个穷举的算法?比如我有(a,b,c,d)几个数.现在要组成3位的或2位的?
- 我用VC编写了一个串口通信助手,可是还没有保存数据的功能,我看别人编写的助手有这个功能,请大家指点!该怎样做才能加上保存功能呢?
- CSocket发送消息写在线程里为什么收不到数据?(help me )
- 我继承了一个CSocket的类,但是我在北的地方调用时,提示我出错,大家来帮忙!!!
- 如何使用vc把已经打开的网页中的文字保存起来,不要图片和别的?
- 串口通信的困惑
- VC&&COM新手问题之二:如何在组件创建时初始化变量的值?
- 请问 MFC 自己生成的toolbar上可以加上由Button 控制读输入的 input box 吗?
- 有关 响应 的 事
- 请教一个图像处理的算法:边界点到区域点的转换
- 急!!怎样修改goupbox的背景色?谢谢回答,在线等
工程不大传给我帮你看看:[email protected]