禁用所有者绘制的列表框上的滚动条

时间:2012-03-18 12:50:48

标签: c++ winapi

我有一个所有者绘制的列表框,我添加了很多项目(这需要时间), 添加项目时,垂直滚动条不断变小, 我想在开始添加时禁用滚动条,然后重新启用它。

我试过了 -

LONG old_style=GetWindowLong(hPlayList,GWL_STYLE);
LONG new_style= old_style&~WS_VSCROLL; 
SetWindowLong(hPlayList,GWL_STYLE,new_style);
SetWindowPos(hPlayList,HWND_TOP,lstRc.left,lstRc.right,lstRc.right-lstRc.top,lstRc.bottom-lstRc.top,
        SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
UpdateWindow(hPlayList);

ShowScrollBar(hPlayList,SB_VERT,FALSE);

但是当我添加项目时仍会显示滚动条, 列表框创建如,

hPlayList = CreateWindowEx(WS_EX_CLIENTEDGE, WC_LISTBOX, NULL,
               LBS_OWNERDRAWFIXED |WS_VSCROLL | WS_HSCROLL |WS_CHILD | WS_TABSTOP | WS_VISIBLE|LBS_NOTIFY|LBS_HASSTRINGS,
                lbsPos.x, lbsPos.y,350, 400, hWnd, (HMENU) LIST_ID, GetModuleHandle(NULL), NULL);

我使用SendMessage()添加项目。

我也试过了,

ShowWindow(hPlayList,SW_HIDE);

SendMessage(hPlayList,WM_SETREDRAW,(WPARAM)FALSE,0);

1 个答案:

答案 0 :(得分:3)

在添加字符串之前,您可以使用wParam (fRedraw)设置为FALSE的{​​{3}}消息。完成后,请将其设置为TRUEUpdateWindowRedrawWindow

  

如果应用程序必须将多个项目添加到列表框,则此消息非常有用。应用程序可以在wParam设置为FALSE的情况下调用此消息,添加项目,然后在wParam设置为TRUE的情况下再次调用该消息。最后,应用程序可以调用RedrawWindow(hWnd,NULL,NULL,RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN)以使列表框重新绘制。