Win32静态文本控件添加滚动条失效求助(无需WM_SCROLL)
为Win32静态文本(STATIC)控件添加滚动条(无需处理WM_SCROLL)
STATIC控件本身不支持自动滚动逻辑——它的WS_VSCROLL风格只会显示滚动条,但不会把滚动条和文本内容关联起来,所以滚动条只是个摆设,没法正常工作。而EDIT控件自带ES_AUTOVSCROLL这类属性,能自动把滚动条和内容绑定,所以你之前的代码能正常运行。
最省事的解决办法是用只读的EDIT控件模拟静态文本,既保留静态文本的不可编辑特性,又能复用EDIT自带的滚动功能,完全不用处理WM_SCROLL消息:
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, L"EDIT", text, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | ES_READONLY | ES_MULTILINE, posX, posY, width, height, parWindow, HMENU(ID), hinstance, NULL); // 可选:去掉控件获得焦点时的选中框,让它更贴近STATIC的外观 SetWindowLongPtr(hwnd, GWL_STYLE, GetWindowLongPtr(hwnd, GWL_STYLE) & ~ES_NOHIDESEL);
参数说明:
ES_READONLY:将EDIT控件设为只读,用户无法编辑内容,和STATIC的行为一致ES_MULTILINE:支持多行文本(如果你的静态文本是单行的,可以去掉这个参数)- 保留
WS_VSCROLL和ES_AUTOVSCROLL:让控件自动处理垂直滚动,无需手动响应滚动消息
如果需要更贴近STATIC的无框外观,可以去掉WS_EX_CLIENTEDGE扩展风格,或者调整边框属性:
// 无边框的只读EDIT,外观更接近STATIC hwnd = CreateWindowEx(0, L"EDIT", text, WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_AUTOVSCROLL | ES_READONLY | ES_MULTILINE, posX, posY, width, height, parWindow, HMENU(ID), hinstance, NULL);
内容的提问来源于stack exchange,提问作者Haumikj Haumer
相关产品推荐
相关产品推荐

