为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

相关文章

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(

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程