今天遇到一个需求,需要动态修改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的向导机制又在默默发挥作用(作怪);接下来还需要用代码设置滚动条的相关属性(滚动范围,每次滚动的步长),但是出于篇幅就不再细说了(因为我懒)