hur.cn - 华软网

 热门搜索

各位牛人帮我看看这个程序,我是菜鸟啊!

  作者:未知    来源:网络    更新时间:2010/12/7
C++">
#include <stdio.h>
#include  <afxwin.h>
class CMyApp:public CWinApp
{
      public:
          virtual BOOL InitInstance();
};

class CMainWindow:public CFrameWnd
{
      public:
             CMainWindow();
      
      protected:
             afx_msg void OnPaint();
             DECLARE_MESSAGE_MAP();
};


BOOL CMyApp::InitInstance()
{
m_pMainWnd = new CMainWindow;
m_pMainWnd ->  ShowWindow(m_nCmdShow);
m_pMainWnd ->  UpdateWindow();

return TRUE;
}

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()

CMainWindow::CMainWindow()
{
  Create(NULL,_T("The Hello"));
}

void CMainWindow::OnPaint()
{
CPaintDC dc(this);

CRect rect;

GetClientRect(&rect);

dc.DrawText(_T("Hello,MFC"),-1,&rect,
DT_SINGLELINE  &#166; DT_CENTER  &#166; DT_VCENTER);
}

出现了这个毛病:
Hello.exe 中的 0x78374588 (mfc80ud.dll) 处未措置惩罚的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突


哪位大侠帮我看看啊!
---华软 网友回答---
C++">
#include "stdafx.h"
#include <afxwin.h>
class CMyApp:public CWinApp
{
      public:
          virtual bool initInstance();
};

class CMainWindow:public CFrameWnd
{
      public:
             CMainWindow();
      
      protected:
             afx_msg void OnPaint();
             DECLARE_MESSAGE_MAP();
}

CMyApp myApp;

bool CMyApp::InitInstance()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd -> ShowWindow(m_nCmdShow);
    m_pMainWnd -> UpdateWindow();

    return true;
}

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
    ON-WM_PAINT()
END_MESSAGE_MAP()

CMainWindow::CMainWindow()
{
      Create(NULL,_T("The Hello"));
}

void CMainWindow::OnPaint()
{
    CPaintDC dc(this);

    Crect rect;

    GetClientRect(&rect);

    dc.DrawText(_T("Hello,MFC"),-1,&rect,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}



这个才对!帮我看看吧!
---华软网友回复---
Create(NULL,_T("The Hello"));

Create是干嘛的?在构造函数里调用?
其实构造函数时,窗口还没出来,只适合做一些初始化的东西
---华软网友回复---
C++">
#include "stdafx.h"

#include <afxwin.h>
class CMyApp:public CWinApp
{
public:
virtual BOOL InitInstance();
};

class CMainWindow:public CFrameWnd
{
public:
CMainWindow();

protected:
afx_msg void OnPaint();
DECLARE_MESSAGE_MAP();
};

CMyApp myApp;

BOOL CMyApp::InitInstance()
{
    m_pMainWnd = new CMainWindow;
    m_pMainWnd -> ShowWindow(m_nCmdShow);
    m_pMainWnd -> UpdateWindow();

    return true;
}

BEGIN_MESSAGE_MAP(CMainWindow,CFrameWnd)
ON_WM_PAINT()
END_MESSAGE_MAP()

CMainWindow::CMainWindow()
{
Create(NULL,_T("The Hello"));
}

void CMainWindow::OnPaint()
{
    CPaintDC dc(this);

    CRect rect;

    GetClientRect(&rect);

    dc.DrawText(_T("Hello,MFC"),-1,&rect,
        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}


---华软网友回复---
看到你坚毅的眼神,相信有朝一日你也会成为大牛
---华软网友回复---
创建窗口应该在初始化中举行吧
我的理解是在构造函数中设置一些窗口的特征,然后在初始化函数中举行窗口的创建
---华软网友回复---
或直接在InitInstance中举行初始化完后,调用Create?
---华软网友回复---
你的意思是在InitInstance里Create吗?
引用 6 楼 likezhaobin 的回复:
或直接在InitInstance中举行初始化完后,调用Create?

---华软网友回复---
主要问题呢是由于在构造函数中由于对象还没有完全创建成功,其虚函数 表还没有形成。
而你在构造函数中调用Create函数,而Create函数调用了虚函数比如PreCreateWindow.致使了毛病。
应该是这个原因。

参见Effective C++

条款9:Never call virtual functions during construction or destruction

Scott Meyers已经解释得很详细了...

http://zhidao.百度.com/question/22051815.html
---华软网友回复---
有啥措置惩罚方法吗?我是新手。
引用 8 楼 zzw820626 的回复:
主要问题呢是由于在构造函数中由于对象还没有完全创建成功,其虚函数 表还没有形成。
而你在构造函数中调用Create函数,而Create函数调用了虚函数比如PreCreateWindow.致使了毛病。
应该是这个原因。

参见Effective C++

条款9:Never call virtual functions during construction or destruction……

---华软网友回复---
谢谢啦,呵呵!
引用 4 楼 reggiekiller 的回复:
看到你坚毅的眼神,相信有朝一日你也会成为大牛
     
华软声明:本内容来自网络,如有侵犯您版权请来信指出,本站立即删除。