在DirectX9中使用DXUT定制按钮来控制模型旋转的问题

使用DXUT中的按钮控件类实现 控制模型旋转的过程如下:

 

1.创建一个CDXUTDialog对话框,并绑定至CDXUTDialogResourceManager对话框资源管理器。

2.绑定回调函数GUIEvent(GUIEvent函数的函数名可自定义,DXUT框架没有强行规定对话框的回调函数名)

3.为对话框AddButton添加按钮控件。

4.设置对话框的位置和大小,在OnFrameRender中添加对话框的OnRender函数,在窗口的MsgProc中添加对话框的  子(相对于窗口的MsgProc) MsgProc以便截取消息。

5.在按钮控件的HandleMouse函数中设置 控制模型旋转的相关代码。

 

完成之后,当用户按下改按钮时MouseButtonDown消息被子MsgProc截获,并发送到按钮控件的HandleMouse函数中处理。

在HandleMouse中对消息进行switch(message)                    

而按DXUT中源代码的写法是跳过ButtonDown,处理ButtonUp,也就是说用户把按钮按下去不动的话,程序不会作出响应,在鼠标按键弹起来后才有。

如果想实现按下去不动,模型开始朝一个方向旋转知道放开按键旋转停止  这样的效果,

必须在

DXUTgui.cpp文件的

  CDXUTButton::HandleMouse 

    switch( uMsg )

      case WM_LBUTTONDOWN:

中添加代码。

 

 

这样就会改变所有使用DXUTgui.cpp中CDXUTButton对话框的功能。就是说如果有其他的按钮,那他们也能让模型旋转。因为大家都是CDXUTButton。..

并不是!

case WM_LBUTTONUP:
        {
            if( m_bPressed )
            {
                m_bPressed = false;
                ReleaseCapture();

                if( !m_pDialog->m_bKeyboardInput )
                    m_pDialog->ClearFocus();

                // Button click
                if( ContainsPoint( pt ) )
                    m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );

                return true;
            }

            break;
        }

  m_pDialog->SendEvent( EVENT_BUTTON_CLICKED, true, this );

  注意最后一个参数this,这个参数告诉对话框的回调函数OnGUIEvent消息来自哪一个控件。

  就算所有按钮都是CDXUTButton,  OnGUIEvent页能够区分各个按钮。只对特定的按钮作出模型旋转的回应。

 

最后,,不管怎样还是会改变DXUTgui.cpp文件。。。

 

posted @ 2016-01-13 23:01  Agravity  阅读(471)  评论(0编辑  收藏  举报