我在MFC单文档的一个按钮函数里面这样写
void CMainFrame::OnD3dCd3d()
{
//这里创建了一个非模式对话框
MSG msg;
while( msg.message!=WM_QUIT )
{
if( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
else
{
m_wndD3D.Render();  // 渲染,在新建的窗口实现DirectX动画

}
}
}程序编译通过 运行时会弹出一个经过窗口 点忽略后运行正常
只是关闭程序后 再编译就不能通过了 说 无法打开 G:\c\tt\Debug\tt.exe 进行写入程序已确定关闭 dx部分也正常
就是加入这个循环后才出这问题的 
请问要怎么修改才能实现类似的功能?(不用定时器)

解决方案 »

  1.   

    你可以新建立一个线程进行渲染还有MFC不知道有没有空闲处理函数的,反正WTL是有的,你只要在空闲函数中进行渲染即可
      

  2.   

    创建线程应该可以解决 
    但我的渲染封装到CWnd的派生类里了
    不知要怎样把创建新线程也封装进去难道MFC的消息循环就不能修改了吗?
      

  3.   

    MFC的消息循环不是像SDK那样简单明了的,他的消息基本要历遍所有CTarxxx派生的类看看 CWinThread::OnIdle  
      

  4.   

    出现G:\c\tt\Debug\tt.exe 错误的原因应该是你的程序的窗口结束了,但实际的程序并没有结束,你可以打开任务管理器察看一下你的程序是否结束了。
    再说MFC程序框架有自己的消息循环,他在接受到WM_QUIT后就会作相应的处理,因此,你不一定就能够收的到对应消息,因此不建议你在MFC中在自建消息循环。
      

  5.   

    使用多线程应该是最好的方法了!
    类封装线程的一种技巧CMainFrame::CMainFrame()
    {
        CreateThread(NULL, 0, ThreadFunc, this, 0, NULL);
    }static DWORD WINAPI CMainFrame::ThreadFunc(LPVOID lparam)
    {
        return ((CMainFrame*)lparam)->ThreadRun();
    }CMainFrame::ThreadRun(void)
    {
      // 在线程里做想做的事
        return 0;
    }
      

  6.   

    可以的,重载消息循环.例子如下:
    void CDoeventsDlg::DoEvents()
    {
    MSG msg;
    if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) { //从Windows消息队列中取出消息
    if (msg.message== WM_QUIT)//如果消息为退出,发送退出消息

    ::PostQuitMessage(-1);

    if(!AfxGetApp()->PreTranslateMessage(&msg))//如果无法预处理消息
    {
    ::TranslateMessage(&msg);//转换消息
    ::DispatchMessage(&msg);//发送消息
    }
    }
    AfxGetApp()->OnIdle(0);AfxGetApp()->OnIdle(1);//消息队列为空时闲置一段时间
    }
      

  7.   

    谢谢各位的帮忙  
    我按楼上的方法运行时不会弹出警告窗口了
    不过程序推出后任务管理器里还是有进程存在怎么都不能完全退出呢?
    代码是这样的void CMainFrame::OnD3dCd3d()
    {
    // m_wndD3D.CreateEx
    MSG msg;
    while(1)
    {
    if (::PeekMessage(&msg,NULL,0,0,PM_REMOVE)) 
    { //从Windows消息队列中取出消息
    if (msg.message== WM_QUIT)//如果消息为退出,发送退出消息

    ::PostQuitMessage(-1);

    if(!AfxGetApp()->PreTranslateMessage(&msg))//如果无法预处理消息
    {
    ::TranslateMessage(&msg);//转换消息
    ::DispatchMessage(&msg);//发送消息
    }
    }
    else
    m_wndD3D.Render();
    }}
      

  8.   

    渲染函数要一直调用 才能产生动态效果 所以加了个while循环
      

  9.   

    重载你的 CWinApp::OnIdle 即可
      

  10.   

    在::PostQuitMessage(-1); 后加个 break  ;  搞定