为Vega Prime 2.0窗口添加鼠标函数

2023-12-14 12:08
文章标签 函数 窗口 鼠标 prime 2.0 vega

本文主要是介绍为Vega Prime 2.0窗口添加鼠标函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//自定义一个类

 


#include <vpInputMouse.h>
class WxpMouseInputObserver: public vpInputSourceBoolean::Subscriber,
                                                           public vpInputSourceFloat::Subscriber,
                                                           public vpInputSourceInteger::Subscriber,
                                                           public vsChannel::Subscriber
{
public:


WxpMouseInputObserver::WxpMouseInputObserver(void)
{
  ValX=0;
  ValY=0;
  LeftButtonDown=false;
  RightButtonDown=false;
}

WxpMouseInputObserver::~WxpMouseInputObserver(void)
{
}

 private:
         int ValX;                                           //   X坐标
         int ValY;                                            //  Y坐标
         bool LeftButtonDown;                  //   左键按下
         bool RightButtonDown;              //   右键按下


 
 void notify(vsChannel::Event event, const vsChannel *channel, vrDrawContext *context)
 {}
 
 virtual void notify(vsChannel::Event, const vsChannel *,vsTraversalCull *)
  {
  }
  /**
     * notify method to catch boolean source subscriber events
     */
    void notify(vpInputSourceBoolean::Event event, vpInputSourceBoolean *source)
    {
   //PublicMember::TPS_pObject_observer->setTranslateZ(2,true);
  CString name=source->getName();
  int val=source->getValue();

  if(name=="vpInputMouse::SOURCE_BOOLEAN_BUTTON_LEFT")
  {
   if(val==1)   
   LeftButtonDown=true;
   
   if(val==0)
     LeftButtonDown=false;


  }

  //
  if(name=="vpInputMouse::SOURCE_BOOLEAN_BUTTON_RIGHT")
  {
   if(val==1)
       RightButtonDown=true; 
   if(val==0)
       RightButtonDown=false; 
     
  }

       
    }
   
    /**
     * notify method to catch float source subscriber events
     */
    void notify(vpInputSourceFloat::Event, vpInputSourceFloat *source)
    {
       

    }

    /**
     * notify method to catch integer source subscriber events
     */
    void notify(vpInputSourceInteger::Event, vpInputSourceInteger *source)
    {

   char tt[200];
   sprintf(tt,"name:%s \nvalue:%f\n", source->getName(), source->getValue());
  //AfxMessageBox(tt);


  CString name=source->getName();
  int val=source->getValue();

        if(val>1740)
    return ;
  //左键控制 y  z面的位置
  if ( (name=="vpInputMouse::SOURCE_INTEGER_POSITION_X") &&  LeftButtonDown )
  {
   if(val>ValX)
   {
   
               PublicMember::TPS_pObject_observer->setTranslateX(-1,true); 
   }

   if(val<ValX)
   {
   
               PublicMember::TPS_pObject_observer->setTranslateX(1,true); 
   }
   ValX=val;
   
  }

  if ( (name=="vpInputMouse::SOURCE_INTEGER_POSITION_Y") &&  LeftButtonDown )
  {
   if(val>ValY)
   {
   
               PublicMember::TPS_pObject_observer->setTranslateZ(-1,true); 
   }

   if(val<ValY)
   {
   
               PublicMember::TPS_pObject_observer->setTranslateZ(1,true); 
   }
   ValY=val;
   
  }

        //右键控制H  P  方向的转动
  if ( (name=="vpInputMouse::SOURCE_INTEGER_POSITION_X") &&  RightButtonDown )
  {
   if(val>ValX)
   {
      PublicMember::TPS_pObject_observer->setRotateR(-0.20,true); 
              
   }

   if(val<ValX)
   {
   
     PublicMember::TPS_pObject_observer->setRotateR(0.20,true); 
             
   }
   ValX=val;
   
  }

  if ( (name=="vpInputMouse::SOURCE_INTEGER_POSITION_Y") &&  RightButtonDown )
  {
   if(val>ValY)
   {
      PublicMember::TPS_pObject_observer->setRotateP(-0.20,true); 
              
   }

   if(val<ValY)
   {
   
     PublicMember::TPS_pObject_observer->setRotateP(0.20,true); 
             
   }
   ValY=val;
   
  }

       //中键滑动控制远近
   if  (name=="vpInputMouse::SOURCE_INTEGER_WHEEL_DIRECTION")
    if(val==1)
   {
    PublicMember::TPS_pObject_observer->setTranslateY(-10,true); 
   
             
   }

   if(val==-1)
   {
   
                PublicMember::TPS_pObject_observer->setTranslateY(10,true); 
   }
  
  
   
    }

 //end of class

};

 

//配置鼠标

 

 

//设置窗体
  vpWindow * vpWin= * vpWindow::begin();
  vpWin->setParent(TPS_RunningWindow);
  vpWin->setBorderEnable(false);
  vpWin->setFullScreenEnable(true);

  //设置键盘
  vpWin->setInputEnable(true);
  vpWin->setKeyboardFunc((vrWindow::KeyboardFunc)TPS_KeyboardMotor,NULL); 

  //设置鼠标函数
   WxpMouseInputObserver * wang=new WxpMouseInputObserver();

  vpChannel *chan = *vpChannel::begin();  
   chan->addSubscriber(vsChannel::EVENT_POST_DRAW,wang);
   // grab our mouse input from the first window
        vpWindow* window = vpWindow::empty() ? NULL : *vpWindow::begin();
        assert(window);

        vpChannel* channel = vpChannel::empty() ? NULL : *vpChannel::begin();
        assert(channel);

        // create a mouse
   vpInputMouse *m_mouse;
        m_mouse = new vpInputMouse();
        m_mouse->setWindow(window);
        m_mouse->setChannel(channel);
        m_mouse->ref();

        // add subscribers to the input sources so we know when a value
        // has changed
        vpInputMouse::const_iterator_source_boolean bit;
        for (bit=m_mouse->begin_source_boolean();
             bit!=m_mouse->end_source_boolean();++bit) {
            (*bit)->addSubscriber(
                vpInputSourceBoolean::EVENT_VALUE_CHANGED, wang);
        }

        vpInputMouse::const_iterator_source_float fit;
        for (fit=m_mouse->begin_source_float();
             fit!=m_mouse->end_source_float();++fit) {
            (*fit)->addSubscriber(
                vpInputSourceFloat::EVENT_VALUE_CHANGED, wang);
        }

        vpInputMouse::const_iterator_source_integer iit;
        for (iit=m_mouse->begin_source_integer();
             iit!=m_mouse->end_source_integer();++iit) {
            (*iit)->addSubscriber(
                vpInputSourceInteger::EVENT_VALUE_CHANGED, wang);
        }

 

 

这篇关于为Vega Prime 2.0窗口添加鼠标函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/492460

相关文章

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(