win sdk开发ListView 隐藏滚动条,用自定义的滚动条替换原来的滚动条,自定义滚动条控制ListView的时候,隐藏的滚动条会显示出来,这时候调用ShowScrollBar隐藏滚动条会一闪而过,麻烦你说一下详细的解决办法
时间: 2023-06-30 11:02:46 浏览: 47
在Win SDK开发的ListView中隐藏滚动条并用自定义的滚动条替换原来的滚动条,是可以通过修改ListView的样式来实现的。在创建ListView时,可以通过设置样式参数来隐藏滚动条:
```c++
DWORD dwStyle = WS_CHILDWINDOW | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | LVS_REPORT | LVS_OWNERDRAWFIXED | LVS_SINGLESEL;
DWORD dwExStyle = LVS_EX_FULLROWSELECT | LVS_EX_DOUBLEBUFFER | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP | LVS_EX_INFOTIP | LVS_EX_LABELTIP | LVS_EX_UNDERLINEHOT;
ListView_SetExtendedListViewStyle(hwndList, dwExStyle);
ListView_SetWindowTheme(hwndList, L"Explorer", NULL);
SetWindowLongPtr(hwndList, GWL_STYLE, dwStyle & ~WS_VSCROLL);
```
其中,通过`SetWindowLongPtr`函数将`WS_VSCROLL`样式从样式参数中去掉,就可以隐藏ListView的垂直滚动条。此时,如果自定义滚动条控制ListView滚动,原来隐藏的滚动条会显示出来,这时可以通过以下方式解决:
1. 在自定义滚动条控制ListView滚动时,使用`ShowScrollBar`函数隐藏原来的滚动条。
```c++
ShowScrollBar(hwndList, SB_VERT, FALSE);
```
但是,在某些情况下,调用`ShowScrollBar`函数会导致滚动条一闪而过,不起作用。这时可以尝试使用第2种方式。
2. 在自定义滚动条控制ListView滚动时,使用`SetWindowLongPtr`函数将ListView的风格样式中的`WS_VSCROLL`重新设置一遍,以确保滚动条被隐藏。
```c++
DWORD dwStyle = GetWindowLongPtr(hwndList, GWL_STYLE);
SetWindowLongPtr(hwndList, GWL_STYLE, dwStyle | WS_VSCROLL);
```
这样,当自定义滚动条控制ListView滚动时,原来隐藏的滚动条就不会再出现了。