SOUI官方论坛

 找回密码
 立即注册
查看: 876|回复: 6

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

[复制链接]

该用户从未签到

9

主题

27

帖子

188

积分

24:00金丹期

Rank: 2

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

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

该用户从未签到

9

主题

27

帖子

188

积分

24:00金丹期

Rank: 2

积分
188
 楼主| 发表于 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);

}

该用户从未签到

9

主题

27

帖子

188

积分

24:00金丹期

Rank: 2

积分
188
 楼主| 发表于 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:51
  • 签到天数: 946 天

    [LV.10]以坛为家III

    581

    主题

    1343

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

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

    该用户从未签到

    9

    主题

    27

    帖子

    188

    积分

    24:00金丹期

    Rank: 2

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

    感谢大佬。。。。。见笑
  • TA的每日心情
    奋斗
    2021-9-15 17:33
  • 签到天数: 24 天

    [LV.4]偶尔看看III

    15

    主题

    43

    帖子

    429

    积分

    02:00元婴期

    Rank: 3Rank: 3

    积分
    429
    发表于 2021-9-15 17:38:40 | 显示全部楼层
    谢谢楼主分享
  • TA的每日心情

    2023-10-8 09:30
  • 签到天数: 286 天

    [LV.8]以坛为家I

    7

    主题

    33

    帖子

    4011

    积分

    08:00大乘期

    Rank: 8Rank: 8

    积分
    4011
    发表于 2021-9-26 17:11:18 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-18 13:05

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

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