我在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部分也正常
就是加入这个循环后才出这问题的
请问要怎么修改才能实现类似的功能?(不用定时器)
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部分也正常
就是加入这个循环后才出这问题的
请问要怎么修改才能实现类似的功能?(不用定时器)
解决方案 »
- 求助:windowSDK问题
- 想请教大家一个利用VLC接口写播放器的问题,谢谢!
- 网上下的只读的项目源码能改成可写么
- 如何销毁View窗口
- 哪个函数可以提取系统时间,要到秒级的!
- 在一个对话框里放了几个Edit box,我想在程序运行时将它情空,应该怎么写程序??
- 如果一张网卡绑定有多个IP,如何编程全部获取呢?
- 请问关于 互谱算法
- 求救达人--MFC到底TM能不能声明全局变量/函数,别再告诉我声明在CXXXAPP里面
- 99最新发布"网络神偷 2.5 版" - 可以穿过防火墙和入侵局域网的好工具!
- 98下用vc6.0写的程序,到xp下用vc6.0下调试系统时间变成1970-1-1 8:00(给50分)
- 在基于对话框工程中绘制的图形如何重画?(菜鸟问问题)
但我的渲染封装到CWnd的派生类里了
不知要怎样把创建新线程也封装进去难道MFC的消息循环就不能修改了吗?
再说MFC程序框架有自己的消息循环,他在接受到WM_QUIT后就会作相应的处理,因此,你不一定就能够收的到对应消息,因此不建议你在MFC中在自建消息循环。
类封装线程的一种技巧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;
}
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);//消息队列为空时闲置一段时间
}
我按楼上的方法运行时不会弹出警告窗口了
不过程序推出后任务管理器里还是有进程存在怎么都不能完全退出呢?
代码是这样的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();
}}