• cegui 的tree支持 stringparse的link 处理


    总体流程 就是照着 falstatictext 来把treeitem和tree 结合起来加上 link处理的功能 因为之前 只有statictext支持link的

    其实link是所有tag处理的一部分

    void Tree::onMouseMove(MouseEventArgs& e)
    {
    static TreeItem* lastItem = 0;

    Point posi(CoordConverter::screenToWindow(*this, e.position));
    // Point posi = relativeToAbsolute(CoordConverter::screenToWindow(*this, e.position));
    TreeItem* item = getItemAtPoint(posi);

    bool bPointIn = e.window->isHit(e.position);
    RenderedStringComponent* pRSComponent = NULL;


    if (item != lastItem)
    {
    if (item != 0)
    {
    setTooltipText(item->getTooltipText());
    RenderedString itemRenderStr=item->getRenderedString();
    if (bPointIn)
    {
    pRSComponent=(RenderedStringComponent*)itemRenderStr.getRenderedStringComponentAtPoint(0,item->getItemPos(),posi);
    }
    if (pRSComponent == d_rSCWithMouse)
    {
    return ;
    }

    RenderedStringComponent* pOldRSComponent = d_rSCWithMouse;
    if (pOldRSComponent)
    {
    // mouse leaves
    size_t iLinkID = pOldRSComponent->getLinkID();
    if (iLinkID)
    {
    itemRenderStr.setRSCLinkState(0,iLinkID, RenderedStringComponent::LS_MOUSE_LEAVE);
    this->onLinkEvent(iLinkID, LinkTextEventArgs::LNKETP_MOUSE_LEAVE);
    this->invalidate();
    }
    }

    if (pRSComponent)
    {
    // mouse enter
    size_t iLinkID = pRSComponent->getLinkID();
    if (iLinkID)
    {
    itemRenderStr.setRSCLinkState(0,iLinkID, RenderedStringComponent::LS_MOUSE_HOVER);
    this->onLinkEvent(iLinkID, LinkTextEventArgs::LNKETP_MOUSE_ENTER);
    this->invalidate();
    }
    }

    d_rSCWithMouse = pRSComponent;
    }
    else
    {
    setTooltipText("");
    }
    lastItem = item;
    }

    // must check the result from getTooltip(), as the tooltip object could
    // be 0 at any time for various reasons.
    Tooltip* tooltip = getTooltip();

    if (tooltip)
    {
    if (tooltip->getTargetWindow() != this)
    tooltip->setTargetWindow(this);
    else
    tooltip->positionSelf();
    }

    Window::onMouseMove(e);
    }


    最关键是上面这段 mousemove的代码

    有了 d_rSCWithMouse这个 在别的地方就可以用了

    总体流程是 用treeitem的 renderstring 获取鼠标点击位置的renderstringcomponet 这个东西里面 有linkId

    上述过程是在tree里处理的

    treeitem里添加一个获取每个item的pos的函数 也在tree是set

    我现在遇到的问题是

    tree 没有onclick事件 当然我可以在tree的onmouseDown里添加处理

    但是我不明白 为什么 onclick不好使 

    别的控件加了什么 onclick是要加d_window->subscribeEvent(Window::EventMouseClick,
                Event::Subscriber(&FalagardStaticText::onMouseClick, this))

    subscribeEvent这个 有了这个 相应的 onclick就好使了

    我不明白的是 tree并没有subscribeEvent 但是 onMouseDown为什么就好使了

    我要想让onclick好使应该怎么做呢

    之前那段代码错误太多 有逻辑上得 有指针值传不过去的 下面这段就都改好了

     
    void Tree::onMouseMove(MouseEventArgs& e)
    {
    static TreeItem* lastItem = 0;

    Point posi(CoordConverter::screenToWindow(*this, e.position));
    // Point posi = relativeToAbsolute(CoordConverter::screenToWindow(*this, e.position));
    TreeItem* item = getItemAtPoint(posi);
    bool bPointIn = e.window->isHit(e.position);
    RenderedStringComponent* pRSComponent = NULL;
    size_t iNewLinkID = 0;
    if (item != 0)
    {
    d_itemRenderStr=item->getRenderedString();
    if (bPointIn)
    {
    pRSComponent=(RenderedStringComponent*)d_itemRenderStr->getRenderedStringComponentAtPoint(0,item->
    getItemArea().getPosition(),posi);    
    }
    if (pRSComponent)
    {
    iNewLinkID = pRSComponent->getLinkID();
    }
    }
    if (iNewLinkID == d_linkID)
    {
    return ;
    }

    size_t iOldLinkID = d_linkID;
    if (iOldLinkID)
    {
    // mouse leaves
    d_itemRenderStr->setRSCLinkState(0,iOldLinkID, RenderedStringComponent::LS_MOUSE_LEAVE);
    this->onLinkEvent(iOldLinkID, LinkTextEventArgs::LNKETP_MOUSE_LEAVE);
    this->invalidate();
    }

    if (pRSComponent)
    {
    // mouse enter
    size_t iLinkID = pRSComponent->getLinkID();
    if (iLinkID)
    {
    d_itemRenderStr->setRSCLinkState(0,iLinkID, RenderedStringComponent::LS_MOUSE_HOVER);
    this->onLinkEvent(iLinkID, LinkTextEventArgs::LNKETP_MOUSE_ENTER);
    this->invalidate();
    }
    }
    d_linkID=iNewLinkID;
    if (item != lastItem)
    {
    if (item != 0)
    {
    setTooltipText(item->getTooltipText());
    }
    else
    {
    setTooltipText("");
    }
    lastItem = item;
    }

    // must check the result from getTooltip(), as the tooltip object could
    // be 0 at any time for various reasons.
    Tooltip* tooltip = getTooltip();

    if (tooltip)
    {
    if (tooltip->getTargetWindow() != this)
    tooltip->setTargetWindow(this);
    else
    tooltip->positionSelf();
    }

    Window::onMouseMove(e);
    }

    我还发现cegui一个更严重的问题:

      就是鼠标hover了 某window之后 如果以飞快之速度离开了 到了别的程序窗口啊 或者走了很远  原window的onMouseMove就不被调用了

    这样里面处理 mouseleave的时间也不被执行了 ,不光是我写的这个link是这样的 在普通button上hover也有这个问题

  • 相关阅读:
    36_Cache Aside Pattern缓存+数据库读写模式的分析
    35_亿级流量商品详情页的多级缓存架构以及架构中每一层的意义
    34_redis阶段性总结:1T以上海量数据+10万以上QPS高并发+99.99%高可用
    33_redis在实践中的一些常见问题以及优化思路(包含linux内核参数优化)
    正则表达式全部符号解释
    如何正确学习JavaScript
    2015阿里校招前端笔试题
    前端面试总结2
    前端面试总结
    通俗易懂的来讲讲DOM
  • 原文地址:https://www.cnblogs.com/minggoddess/p/2288683.html
Copyright © 2020-2023  润新知