MFC创建一个窗口,debug assertion failed

huangweibuct 2009-12-09 11:05:37
没接触过MFC,但是要用MFC创建个窗口,就在网上找了段代码

class CFirstApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
class CFirstWindow : public CFrameWnd
{
CStatic* cs;
public:
CFirstWindow();
};

// 每当应用程序首次执行时都要调用的初始化函数
BOOL CFirstApp::InitInstance()
{
m_pMainWnd = new CFirstWindow();
m_pMainWnd->ShowWindow(m_nCmdShow);
m_pMainWnd->UpdateWindow();
return TRUE;
}

// 窗口类的构造函数
CFirstWindow::CFirstWindow()
{
// 建立窗口本身
Create(NULL,
_T("My first application"),
WS_OVERLAPPEDWINDOW,
CRect(0,0,200,200));



}
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
CFirstApp FirstApp;
}


运行时提示:debug assertion failed
请问是怎么回事?谢谢.
...全文
233 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangweibuct 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qiaozhiyuan 的回复:]
你的编译环境设置的不对,你这个程序是在Windows环境下运行的,结果你现在的编译环境是console,所以第一。你把这个函数int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
  CFirstApp  FirstApp; 
}
去了,然后把CFirstApp  FirstApp;  拿出来,不能有int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])这个函数,这个函数是console的环境才有的。

第二,你要设置为Windows的编译环境。你打开菜单:Project=>settings=>link项,你会看到project options里面有一项subsystem:console,要改为subsystem:windows。

第三。instance 是虚函数,CWinApp 类会自己调用他的。不用你调用。
FirstApp.InitInstance(); 要去掉
[/Quote]
先谢了。但是如果改为:改为subsystem:windows。就不支持MFC了吧
red-fly 2009-12-10
  • 打赏
  • 举报
回复
1.创建窗口,一般用CDialog,而不是CFrameWnd,CFrameWnd是用于文档/视图类的程序中的,而CDialog可以用到任何程序中。所以,需要把
class CFirstWindow : public CFrameWnd
改成
class CFirstWindow : public CDialog

2. 创建窗口一般不要放到构造函数中,而是另外加一个函数专门来创建窗口,类似的代码如下:
m_pMainWnd = new CFirstWindow();
m_pMainWnd->CreateWindow(); // 在实现函数时,一般还会增加一个参数,用于指明要创建的窗口的父窗口,当然,这个父窗口也是可以为空的
m_pMainWnd->ShowWindow(m_nCmdShow);

3. 如果用CDialog,代码大约如下:
CMyDialog myDlg; // CMyDialog从CDialog派生
myDlg.Create(CMyDialog::IDD);
myDlg.ShowWindow( SW_SHOW );
qiaozhiyuan 2009-12-10
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 huangweibuct 的回复:]
引用 12 楼 qiaozhiyuan 的回复:
你的编译环境设置的不对,你这个程序是在Windows环境下运行的,结果你现在的编译环境是console,所以第一。你把这个函数int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
  CFirstApp  FirstApp; 
}
去了,然后把CFirstApp  FirstApp;  拿出来,不能有int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])这个函数,这个函数是console的环境才有的。

第二,你要设置为Windows的编译环境。你打开菜单:Project=>settings=>link项,你会看到project options里面有一项subsystem:console,要改为subsystem:windows。

第三。instance 是虚函数,CWinApp 类会自己调用他的。不用你调用。
FirstApp.InitInstance(); 要去掉

先谢了。但是如果改为:改为subsystem:windows。就不支持MFC了吧
[/Quote]

改为subsystem:windows,一样支持MFC的。
qiaozhiyuan 2009-12-09
  • 打赏
  • 举报
回复
是CWinThread
qiaozhiyuan 2009-12-09
  • 打赏
  • 举报
回复
你让CFirstApp 直接继承自CWndThread
class CFirstApp : public CWinApp
{
public:
virtual BOOL InitInstance();
};
修改为
class CFirstApp : public CWndThread
{
public:
virtual BOOL InitInstance();
};
huangweibuct 2009-12-09
  • 打赏
  • 举报
回复
如果不创建MFC的工程,用“WIN32 应用程序”怎么创建窗口?
huangweibuct 2009-12-09
  • 打赏
  • 举报
回复
我创建的是win应用程序,支持MFC
togoblime 2009-12-09
  • 打赏
  • 举报
回复
你用VC新建一个“MFC 应用程序”的工程,编译运行,不就能看到窗口和代码了
如果是创建普通窗口,直接CreateWindow就可以,新建一个“WIN32 应用程序”的工程,里面能看到详细的过程
huangweibuct 2009-12-09
  • 打赏
  • 举报
回复
中断到: ASSERT(AfxGetThread() == NULL);
lwd4210 2009-12-09
  • 打赏
  • 举报
回复
抛出异常了,调试一下看哪里抛出的.
qiaozhiyuan 2009-12-09
  • 打赏
  • 举报
回复
补充一下,原来的代码中的CWinApp 你先不要动,你先按我说的去试一下。
qiaozhiyuan 2009-12-09
  • 打赏
  • 举报
回复
你的编译环境设置的不对,你这个程序是在Windows环境下运行的,结果你现在的编译环境是console,所以第一。你把这个函数int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
CFirstApp FirstApp;
}
去了,然后把CFirstApp FirstApp; 拿出来,不能有int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])这个函数,这个函数是console的环境才有的。

第二,你要设置为Windows的编译环境。你打开菜单:Project=>settings=>link项,你会看到project options里面有一项subsystem:console,要改为subsystem:windows。

第三。instance 是虚函数,CWinApp 类会自己调用他的。不用你调用。
FirstApp.InitInstance(); 要去掉
huangweibuct 2009-12-09
  • 打赏
  • 举报
回复
等候
huangweibuct 2009-12-09
  • 打赏
  • 举报
回复
这里断了:{ ASSERT(afxCurrentInstanceHandle != NULL);
我的主函数是:
CFirstApp FirstApp;
FirstApp.InitInstance();

郁闷啊。我只是想写个窗口,咋就这么麻烦。。原来使用SDK写的,写在需要用MFC写个窗口而已。
[Quote=引用 9 楼 qiaozhiyuan 的回复:]
你把m_nCmdShow改为SW_SHOW
[/Quote]
qiaozhiyuan 2009-12-09
  • 打赏
  • 举报
回复
你把m_nCmdShow改为SW_SHOW
huangweibuct 2009-12-09
  • 打赏
  • 举报
回复
error C2065: 'm_nCmdShow' : undeclared identifier
[Quote=引用 6 楼 qiaozhiyuan 的回复:]
你让CFirstApp  直接继承自CWndThread
class  CFirstApp  :  public  CWinApp 
  { 
        public: 
              virtual  BOOL  InitInstance(); 
  }; 
修改为
class  CFirstApp  :  public  CWndThread
  { 
        public: 
              virtual  BOOL  InitInstance(); 
  }; 

[/Quote]

15,979

社区成员

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

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