关于自定义类中访问CPCBView或CFrameWnd或CPCBDoc类的公有变量的 问题再来100分,对之前的提问帖进行补充提问?

kgduwu 2009-05-31 12:46:04
我在从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类的公有变量,能不能做到?不能做到是为什么?有啥变通的好的做法?
请大虾们谈谈,指导指导!!!
...全文
70 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyljerry 2009-06-01
  • 打赏
  • 举报
回复
你可以增加一个CBtmpbutton的成员函数,构造 的时候传递CPCBView等指针进去,然后保存到CBtmpbutton 的成员变量中,以后就可以通过这个成员变量使用这个指针了
kgduwu 2009-06-01
  • 打赏
  • 举报
回复
怎么会是实例化太早,我在视类窗口的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
bragi523 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zjmmlab 的回复:]
应该是在程序调用CBtmpbutton类的构造函数时,主窗口(AfxGetApp()->GetMainWnd())还没有被创建.调整一下构造CBtmpbutton类实例的位置,在确认主窗口创建后再生成CBtmpbutton类实例.
[/Quote]
正解
实例化太早估计是
梧桐168 2009-05-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zjmmlab 的回复:]
应该是在程序调用CBtmpbutton类的构造函数时,主窗口(AfxGetApp()->GetMainWnd())还没有被创建.调整一下构造CBtmpbutton类实例的位置,在确认主窗口创建后再生成CBtmpbutton类实例.
[/Quote]
嗯,可能是这个原因,你在CBtmpbutton::OnCreate里调用这些代码看看。
ONE_Ship 2009-05-31
  • 打赏
  • 举报
回复
应该是在程序调用CBtmpbutton类的构造函数时,主窗口(AfxGetApp()->GetMainWnd())还没有被创建.调整一下构造CBtmpbutton类实例的位置,在确认主窗口创建后再生成CBtmpbutton类实例.
jian_tian_yang 2009-05-31
  • 打赏
  • 举报
回复
帮楼主顶一下
hurryboylqs 2009-05-31
  • 打赏
  • 举报
回复
能的,现在关键是看不出你错那
工程不大传给我帮你看看:liqisong611@hotmail.com

15,978

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧