如何使得渲染窗口不阻塞窗口事件

1、问题描述

    使用MFC开发场景编辑器,基于SDI进行窗口布局,渲染窗口就是其中的中心、核心窗口(SceneView)。在SceneView的OnPaint事件中,添加渲染内容的绘制、提交。导致编辑器的其他窗口操作都无法实时刷新、总是会延时刷新或者不刷新。

2、尝试方法

2.1、渲染线程方案

     将renderContext(渲染上下文)、renderEngine(渲染引擎)封装成一个RenderWindow类。SceneView中包含RenderWindow、RenderThread,单独起一个线程用于渲染。结果渲染窗口的内容无法看到,而且其他窗口的事件依然被阻塞。最后将OnPaint事件删除。

2.2、OnIdle

    MFC中已经封装了OnIdle接口,当应用无任何事件时,执行OnIdle函数,完全符合渲染窗口的需求。

    具体内容见:MFC OnIdle

3、解决方案

    最终采用OnIdle事件,主要代码:

   

 // MyWinApp OnIdle
 POSITION pos = NULL;
 if ( m_pDocManager != NULL )
  pos = m_pDocManager->GetFirstDocTemplatePosition();

 while ( pos != NULL )
 {
    CDocTemplate* pTemplate = m_pDocManager->GetNextDocTemplate(pos);
    ASSERT_KINDOF( CDocTemplate, pTemplate );
    pTemplate->OnIdle();
 }

// MyWinAppDoc OnIdle
void MyWinAppDoc::OnIdle()
{
	POSITION pos = GetFirstViewPosition();
	CView *view = 0;
	if (view = GetNextView(pos))
	{
		CTargetView *sceneView = (CTargetView*)view;
		VERIFY(0 != sceneView);
		sceneView->Invalidate(); // Invalidate可以是CTargetView中的任意函数,此函数中必须包含renderOneFrame()、swapBuffer()
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值