很不解的问题

ojc520520 2015-02-28 11:56:41
为什么在CMainFrame::OnCreate()函数中调用CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();或CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); 都是返回NULL?我想在一个自建类(没有继承)中调用这些函数来获得CMainFrame对象,但都是返回NULL;调用这些函数是在OnCreate中触发的;

这个OnCreate函数可以相当于对话框程序中的OnInitDialog()吗?
...全文
248 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
rxguoblp 2015-03-12
  • 打赏
  • 举报
回复
返回空就对了,很明显嘛: 1.OnCreate函数不等于对话框程序中的OnInitDialog()!(进入OnInitDialog()函数时,对话框对象已经存在了,所以可以获取其指针;进入OnCreate函数时,Frame框架对象还不存在呢(尚未完成创建),哪来的指针?) 2.你要使用CMainFrame_1* pFrame这个指针对吗?那你干嘛要去碰OnCreate函数?先等到Frame框架对象完成创建(OnCreate函数执行完之后),然后在随便一个地方都可以获取到他的指针。 3.CMainFrame_1* pFrame = (CMainFrame_1*)AfxGetMainWnd(); CMainFrame_1* pFrame1 = (CMainFrame_1*)AfxGetApp()->GetMainWnd(); 这两句对SDI程序药效相同。
SiGoYi 2015-03-05
  • 打赏
  • 举报
回复
OnCreate比OnInitDialog被调用的时机要早。
ojc520520 2015-03-05
  • 打赏
  • 举报
回复
自顶
ojc520520 2015-03-01
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
既然是CMainFrame::OnCreate()函数中要获取主窗口对象,那么,意思就是对象本身,逻辑上,该对象就是this CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();或CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); 这些在OnCreate的时候,还没有加入系统对象中,获取不到
还没加入系统对象中,什么意思?
worldy 2015-03-01
  • 打赏
  • 举报
回复
既然是CMainFrame::OnCreate()函数中要获取主窗口对象,那么,意思就是对象本身,逻辑上,该对象就是this CMainFrame* pFrame = (CMainFrame*)AfxGetApp()->GetMainWnd();或CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); 这些在OnCreate的时候,还没有加入系统对象中,获取不到
likfeng 2015-03-01
  • 打赏
  • 举报
回复
this->MessageBox(_T("!")); CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); CString str; str.Format(_T("%d"), (long)pFrame); MessageBox(str); 加上第一句pFrame有值 注释第一句pFrame为NULL //////////////////////////////////////////// CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd(); CString str; str.Format(_T("%d"), (long)pFrame); MessageBox(str); CMainFrame* pFrame1 = (CMainFrame*)AfxGetMainWnd(); CString str1; str1.Format(_T("%d"), (long)pFrame1); MessageBox(str1); 第一次返回NULL 第二次有值 /////////////////////////// 把上面的MessageBox(str);注释 两次均返回NULL ////////////////////////// MessageBox("!"); CMainFrame* pFrame1 = (CMainFrame*)AfxGetMainWnd(); CString str1; str1.Format(_T("%d"), (long)pFrame1); MessageBox(str1); 返回有值 //////////////////////////// 以上是实验结果 望高手解惑
likfeng 2015-03-01
  • 打赏
  • 举报
回复
OnCreate还没完成,CMainFrame不可用!
likfeng 2015-03-01
  • 打赏
  • 举报
回复
在家刚试了下返回的也是NULL 公司电脑上返回的不是NULL
ojc520520 2015-03-01
  • 打赏
  • 举报
回复
引用 6 楼 likfeng 的回复:
单文档VC6 VC2010都可以 上你的代码吧
就是在int CMainFrame_1::OnCreate(LPCREATESTRUCT lpCreateStruct)函数中直接调用下面的代码都是放回NULL; CMainFrame_1就是向导的CMainFrame改名来的 CMainFrame_1* pFrame = (CMainFrame_1*)AfxGetMainWnd(); CMainFrame_1* pFrame1 = (CMainFrame_1*)AfxGetApp()->GetMainWnd();
likfeng 2015-03-01
  • 打赏
  • 举报
回复
单文档VC6 VC2010都可以 上你的代码吧
ojc520520 2015-03-01
  • 打赏
  • 举报
回复
引用 4 楼 likfeng 的回复:
OnCreat时 this已有值,只不过是否赋值给m_pMainWnd不确定。 单文档和多文档是不同的(看CWinApp中的InitInstance函数可以明显看出来) 单文档OnCreat时GetMainWnd()可以得到正确的值 多文档OnCreat时GetMainWnd()值为NULL OnCreat中可以用this取代(CMainFrame*)AfxGetApp()->GetMainWnd();
我就是个单文档程序返回的就是NULL,奇怪了;
likfeng 2015-03-01
  • 打赏
  • 举报
回复
OnCreat时 this已有值,只不过是否赋值给m_pMainWnd不确定。 单文档和多文档是不同的(看CWinApp中的InitInstance函数可以明显看出来) 单文档OnCreat时GetMainWnd()可以得到正确的值 多文档OnCreat时GetMainWnd()值为NULL OnCreat中可以用this取代(CMainFrame*)AfxGetApp()->GetMainWnd();

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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