对于windows编程不是很熟悉,说错了大家帮忙纠正,呵呵。
DX9的例子中创建了一个Window,然后进入以下的一个循环。
这些代码来自DX9的sdk,我稍微改动了一下,让大家看起来简单些:
    bool bGotMsg;
    MSG  msg;
    msg.message = WM_NULL;
    PeekMessage( &msg, NULL, 0U, 0U, PM_NOREMOVE );    while( WM_QUIT != msg.message  )
    {
        bGotMsg = ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) != 0 );        if( bGotMsg )
        {
            if( m_hWnd == NULL )
            {
                TranslateMessage( &msg );
                DispatchMessage( &msg );
            }
        }
        else
        {
            Render3DEnvironment();
        }
    }一般说来,Render3DEnvironment();总是能够循环执行的,但是在程序窗口处理一些响应的时候就被block了,比如:右键按住caption,弹出sysmenu,按下alt,按下f10等等。我估计,在peekmessage调用defwndproc后就在停在里面了该死的windows机制,
现在我的解决方法很丑陋:把各种相关的消息拦截,自己做处理,太丑陋了
想用多线程吧,还是很害怕的,没有做过。
也别告诉我自己去画caption什么的提议,烦。有没有高手能够帮忙说个漂亮的解决方法?

解决方案 »

  1.   

    // else
    //{
    Render3DEnvironment();
    //}不管有没有消息都……
      

  2.   

    你试试在窗口中把几个会引起阻塞的消息屏蔽掉, 看有什么效果
    另外你那个 m_hWnd == NULL 是什么意思? 是写错了吧
      

  3.   

    大哥,看仔细了,我现在的做法就是这样的,拦截消息,但是搞得我浑身难受,而且我不敢肯定是不是完全控制住这个疯狂的window了另外那个m_hWnd == NULL,的确是我简化的时候简化出问题的,原来的条件是:
    if( hAccel == NULL || m_hWnd == NULL ||
        0 == TranslateAccelerator( m_hWnd, hAccel, &msg ) )
                {
                    TranslateMessage( &msg );
                    DispatchMessage( &msg );
                }
    让大家误会了,不好意思 
    说真的,我对于这个写法也不是很理解,谁能帮忙解释一下?我先去查查msdn
      

  4.   

    为什么你的 Render3DEnvironment()不在onpaint里面调用呢?
    一般在erasebkground之后会调用paint的。