游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7437|回复: 11

Ogre与MFC结合时的 键鼠监听问题

[复制链接]

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
发表于 2010-1-27 22:13:00 | 显示全部楼层 |阅读模式
我依照网上材料所说把顶层窗口传进去了,但是发现还是不能监听,代码如下, 其中注释掉的不知道是否有影响,鼠标的mousePressed 事件响应有问题,相应一次后就一直都响应,不听控制了

//键鼠事件
        // 获得输入系统
        size_t windowHnd = 0;
        std:stringstream windowHndStr;
        OIS:aramList pl;

        //获得渲染窗口数据
        //this->m_pMainWindow->getCustomAttribute("WINDOW", &windowHnd);
        windowHnd = (size_t )AfxGetMainWnd()->GetActiveWindow()->GetSafeHwnd(); // 这里这个窗口句柄就是我们传入的MFC主窗口
        //windowHnd = (size_t )(((CFrameWnd*)(AfxGetApp()->m_pMainWnd))->GetActiveView()->m_hWnd); // 这里这个窗口句柄就是我们传入的MFC主窗口
        //windowHnd = (size_t) this->m_pParent->m_hWnd; //父窗口句柄
        windowHndStr << windowHnd;

        // OIS的窗口必须要顶层窗口,所以只有传MFC的主窗口给他,传view就不行
        pl.insert(std::make_pair(std::string("WINDOW"), windowHndStr.str()));

        // 设置鼠标显示和非游戏独占,这样鼠标可以显示在屏幕上并可以移动到窗口外
        pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_FOREGROUND" )));
        pl.insert(std::make_pair(std::string("w32_mouse"), std::string("DISCL_NONEXCLUSIVE")));

        // 键盘非游戏独占,这里我设置成为OGRE独占键盘事件
        //pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_FOREGROUND")));
        //pl.insert(std::make_pair(std::string("w32_keyboard"), std::string("DISCL_NONEXCLUSIVE")));

        this->m_pInputManager = InputManager::createInputSystem(pl);
        // 这样InputManager就建好了,但为了从键盘、鼠标、或是手柄中获得输入,你还必须创建这些对象:
        try
        {
                this->m_pKeyboard = static_cast<Keyboard*>(this->m_pInputManager->createInputObject(OISKeyboard, true)); //有缓冲的键盘输入
                this->m_pMouse = static_cast<Mouse*>(this->m_pInputManager->createInputObject(OISMouse, true));          //有缓冲的鼠标输入
                //mJoy = static_cast<OIS::JoyStick*>(mInputManager->createInputObject(OIS::OISJoyStick, false)); //手柄

                //this->m_pKeyboard->setEventCallback(this); //键盘回调
                this->m_pMouse->setEventCallback(this);


//**************************************************************//
if (!this->m_bRead)
                goto exit ;


        if (arg.state.buttonDown(MB_Right))
        {
                MessageBox(0,"鼠标事件","",0); //
        }

exit:
        return true;

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-1-27 22:17:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

补充一下,我用的是 分割窗口,因为 左边要用mfc的控件 控制右边的 mfc视图

继承了一个CSplitterWnd 类,用来响应 拖动分隔栏的消息

两个view类, CEditerView 为左边 CDialog + CPropertySheet的视图,
             COgreView  为右边的 Ogre窗口

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-1-27 22:19:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

我总觉得 是 否Ogre内部的问题, 因为 响应的是鼠标右键的 事件, 但是当按了一次右键后, 再按左键也会相应这个事件

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-1-27 22:20:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

大神们,帮帮忙呀,卡在这个事件上好几天了

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-1-27 22:33:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

貌似应该把注释的东西去掉是把? 呵呵, 这个太乱了

24

主题

256

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2010-2-5 22:50:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

既然是 MFC + OGRE 为什么还要用鼠标监听呢。直接用MFC的鼠标事件响应就可以了。

我的开源项目有之方面的使用,有兴趣你可以下载下来看一下。

www.fiist.com

1

主题

7

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2010-2-13 02:15:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

在frameStarted事件里加入
m_pMouse->capture();
这样每一帧就可以响应事件。
其实你已经发现问题了,但是没想到怎么解决。

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-2-14 15:25:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

6楼 的意见 可以采取

7楼 说的对,我一开始也是这样弄得。 我描述一下问题所在:

鼠标 事件中 if (arg.state.buttonDown(OIS::MB_Right)){MessageBox();} 判断 是否按下鼠标右键

结果 是 按下右键后 响应 对话框, 但是 后面 无论右键还是左键 都响应 这个右键对应的对话框。

这时 我认为有两种可能, 第一, 我的代码错了; 第二 Ogre代码有问题。

显然 我没有自大到 认为 Ogre出现问题, 于是 就不断修改自己代码,(各种全排列组合) 最终甚至不能用了……

返回来 分析一下 Ogre的代码
inline bool buttonDown( MouseButtonID button ) const
{
     return ((buttons & ( 1L << button )) == 0) ? false : true;
}

enum MouseButtonID
{
   MB_Left = 0, MB_Right, MB_Middle,  //源代码
   //MB_Left = 1, MB_Right, MB_Middle,//这里是我和庄巍巍修改的
   MB_Button3, MB_Button4,        MB_Button5, MB_Button6,        MB_Button7
};

这个是 state.buttonDown的 判断代码,很简单 就是移位运算

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-2-14 15:37:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

接楼上

枚举 MouseButtonID 中
右键 的值 为 1, 换成 long类型就是 0x0000 0000 0000 0001 (32位 带符号)
左键 的值 为 0, 换成 long类型就是 0x0000 0000 0000 0000 (32位 带符号)

判断时 会出现这种情况:((buttons & ( 1L << button )) == 0) ? false : true

如果按下了左键, 就会 buttons & 左移一位的 buttons ==0, 进而返回false

但是 如果按下了右键  buttons & 左移一位的 buttons == 0, 也会返回 false.

这样岂不是 所有鼠标事件都返回 false  无法判断了?

但是 事实上 是都有判断

虽然我不懂这里面的缘由, 但是 自己设立一个标志位来控制鼠标事件 是必须的的了

5

主题

27

帖子

27

积分

注册会员

Rank: 2

积分
27
 楼主| 发表于 2010-2-14 15:39:00 | 显示全部楼层

Re:Ogre与MFC结合时的 键鼠监听问题

因此 我最后的解决方案是 声明一个 鼠标事件的结构体, 左键按下后 解放右键的控制, 反过来依然。

因为 mfc的多窗口 影响, 还需要 进行窗口焦点控制 , 防止 在 COgreView窗口外面 点击右键时 响应相应消息,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-12 18:07

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表