MFC使用SetWindowLong修改CListBox样式不生效

今天遇到一个需求,需要动态修改CListBox的窗口样式,结果发现按MSDN的说明去修改,竟然没生效。

按理说这是不可能的,MSDN还是比较靠谱的,后来发现MSDN关于SetWindowLong函数的说明底下提了一下:

Certain window data is cached, so changes you make using SetWindowLong will not take effect until you call the SetWindowPos function. Specifically, if you change any of the frame styles, you must call SetWindowPos with the SWP_FRAMECHANGED flag for the cache to be updated properly.

大概意思就是如果要用SetWindowLong修改窗口样式,很有可能不会马上生效,因为有缓存(莫名其妙的机制),需要用SetWindowPos去刷新一下,下面是我的代码,只列出相关部分:

long dwStyle = ::GetWindowLong(m_list.GetSafeHwnd(),GWL_STYLE);
//修改样式,加个水平滚动条
::SetWindowLong(m_list.GetSafeHwnd(),GWL_STYLE,dwStyle | WS_HSCROLL);
//刷新一下
::SetWindowPos(m_list.GetSafeHwnd(),NULL,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOACTIVATE|SWP_FRAMECHANGED);

到了这一步,水平滚动条就出来了,但是实际使用过程中还是与直接勾选水平滚动条属性有区别,想了一下,应该是MFC的向导机制又在默默发挥作用(作怪);接下来还需要用代码设置滚动条的相关属性(滚动范围,每次滚动的步长),但是出于篇幅就不再细说了(因为我懒)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值