SOUI官方论坛

 找回密码
 立即注册
查看: 93|回复: 4

ListCtrl等控件的滚动条,不能直接响应鼠标(WM_MOUSEWHEEL)的滚轮消息

[复制链接]

该用户从未签到

7

主题

17

帖子

126

积分

24:00金丹期

Rank: 2

积分
126
发表于 2020-5-20 23:57:50 | 显示全部楼层 |阅读模式
本帖最后由 ibuilder 于 2020-5-21 00:02 编辑

发现ListCtrl等控件的滚动条,只有点击的ListCtrl后,才能响应鼠标(WM_MOUSEWHEEL)的滚轮消息。看了网上的一些方法,对SOUI却不行。不知道大佬有什么好办法。

该用户从未签到

7

主题

17

帖子

126

积分

24:00金丹期

Rank: 2

积分
126
 楼主| 发表于 2020-5-22 13:53:56 | 显示全部楼层
百度的方法,好像 在SOUI下不行,比如LISTCTRL控件不是窗口吧,没有HWND。
BOOL CXXXApp::PreTranslateMessage(MSG* pMsg)

{

if (pMsg->message == WM_MOUSEHWHEEL || pMsg->message == WM_MOUSEWHEEL)

{

POINT pos;

GetCursorPos (&pos);

pMsg->hwnd = WindowFromPoint (pos);

}


return CWinAppEx::PreTranslateMessage(pMsg);

}

该用户从未签到

7

主题

17

帖子

126

积分

24:00金丹期

Rank: 2

积分
126
 楼主| 发表于 2020-5-22 15:15:48 | 显示全部楼层
群友告诉我 只要一个属性
<SOUI name="mainWindow"   。。。  sendWheel2Hover="1"   。。。/>

这么简单阿,我还想着折腾SOUI源代码,想想也是这个普遍功能,大佬肯定早想好了。
刚刚也是闲着,就追踪一下这个属性吧。以下比较无聊。。。可以忽略


void SwndContainerImpl::OnFrameMouseWheel( UINT uMsg,WPARAM wParam,LPARAM lParam )//
{
    SWindow *pWndTarget =SWindowMgr::GetWindow(m_hCapture);
    if(!pWndTarget)
    {
        if(IsSendWheel2Hover())//返回 sendWheel2Hover的值 即子窗口是否接受滚轮消息 这个函数代码往下看
        {
            m_hHover=SwndFromPoint(CPoint(GET_X_LPARAM(lParam),GET_Y_LPARAM(lParam)),FALSE);
            pWndTarget=SWindowMgr::GetWindow(m_hHover); //  pWndTarget目标窗口设为Hover窗口     
        }else
        {
            pWndTarget = SWindowMgr::GetWindow(m_focusMgr.GetFocusedHwnd());//只返回有焦点的窗口,就是为什么有输入焦点的子窗口才会响应滚轮消息
        }
    }
   
    if(pWndTarget  && !pWndTarget->IsDisabled(TRUE))
    {
        BOOL bMsgHandled = FALSE;
        pWndTarget->SSendMessage(uMsg,wParam,lParam,&bMsgHandled);//把消息发送给 pWndTarget窗口即Hover窗口,这时候子窗口就会接收到滚轮消息
        SetMsgHandled(bMsgHandled);
    }else
    {
        SetMsgHandled(FALSE);
    }
}




class SHostWnd:
{
...
protected:
        SHostWndAttr  m_hostAttr;
...
  virtual BOOL IsSendWheel2Hover() const;

}

BOOL SHostWnd::IsSendWheel2Hover() const
{
    return m_hostAttr.m_bSendWheel2Hover;// sendWheel2Hover的值
}

class SHostWndAttr
{
.....
ATTR_INT(L"sendWheel2Hover",m_bSendWheel2Hover,FALSE)
.......
DWORD m_bSendWheel2Hover:1; //将滚轮消息发送到hover窗口(后面的1表示只采用一个进制位,因为实际上是一个布尔值)
.....
}
  • TA的每日心情
    开心
    昨天 22:44
  • 签到天数: 101 天

    [LV.6]常住居民II

    400

    主题

    967

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    10655
    发表于 2020-5-22 22:40:36 | 显示全部楼层
    谢谢楼主分享,我还没学习到这里

    该用户从未签到

    7

    主题

    17

    帖子

    126

    积分

    24:00金丹期

    Rank: 2

    积分
    126
     楼主| 发表于 2020-5-22 22:50:38 | 显示全部楼层
    admin 发表于 2020-5-22 22:40
    谢谢楼主分享,我还没学习到这里

    感谢大佬。。。。。见笑
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛 ( 粤ICP备18103663号-2 )

    GMT+8, 2020-6-4 00:58

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.

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