zoukankan      html  css  js  c++  java
  • 在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文件。。。

  • 相关阅读:
    Python 学习 —— 进阶篇(装饰器、类的特殊方法)
    Python 基础学习的几个小例子
    MyBatis——特殊传参问题小结
    为什么要有分布式事务 分布式事务解决的什么问题 一次解答
    2pc事务和3pc事务区别详解
    SPEL语法
    分布式事务框架 TX-LCN 使用
    分布式事务解决方案
    excel 使用总结
    nginx 常用配置
  • 原文地址:https://www.cnblogs.com/Agravity/p/5128822.html
Copyright © 2011-2022 走看看