c++ - 设置滚动条有问题

标签 c++ api winapi user-interface

所以我有 2 个子分类窗口,两个编辑控件都有自己的个人风格...我需要顶部窗口来保持滚动条,因为它是一个聊天程序,一旦有超过 37 行文本, 此窗口中没有更多空间。因此,通过添加滚动条,我可以留出额外的空间。现在我要做的是默认将其设置在窗口底部,这意味着显示最后一条书面消息。目前它“卡在”上侧。 我试图做的是:

RECT    rc,rc2;
GetClientRect(window, &rc);
info.cbSize = sizeof(SCROLLINFO);
info.fMask = SIF_ALL|SIF_DISABLENOSCROLL;
info.nMax = lines;
info.nMin = 0;
info.nPage = 37;

当焦点设置在该窗口 (WM_SETFOCUS) 上时,我这样做:

case WM_SETFOCUS:
{
     SetScrollInfo(window, SB_VERT, &info, TRUE);
            if( lines > 37 ){
                SetScrollPos(window,SB_VERT,400,TRUE);
            }
            else if( lines < 37){
                SetScrollPos(window,SB_VERT,0,TRUE);
            }
            ShowScrollBar(window,SB_VERT,1);
        return 0;
            }

因此,当我键入时,在下方窗口(另一个子窗口)中,滚动条位于顶部。当我点击我正在谈论的窗口时,他的滚动条下降但文本没有重绘。 当我单击滚动条开始滚动时,它会立即重绘文本。 为了解决我在下方窗口中键入时的问题,我从下方的 child 向上方的 child 发送一条消息。向 WM_SETFOCUS 发送的消息执行将滚动条置于底部的代码,但发生的情况是……下降一毫秒然后立即恢复。 我想知道为什么会这样。我的意思是什么消息或默认操作导致滚动条上升。 另外,我怎样才能在不需要单击滚动条的情况下重绘文本? 我尝试了类似 ScrollWindowEx(window,0,400,&rc,NULL,NULL,&rc2,SW_SCROLLCHILDREN); 但这失败了......它在旧文本上重新绘制文本并在一毫秒后消失...... 我唯一的想法是添加另一个 ScrollWindowEx 并将其设置为删除当前文本并重新绘制新文本,但我还是认为它会在一毫秒内消失,就像它已经存在的那样。 提前感谢您的帮助:)

最佳答案

您需要做的是告诉编辑控件滚动到底部,并让它更新滚动条。仅更改滚动条的外观不会使文本进入 View 。

查看类似 EM_SCROLL 的消息和 EM_SCROLLCARET .或者也许只是发送编辑控件 WM_VSCROLL带有 SB_BOTTOM 的消息。然后,编辑控件将确定如何更新滚动条。

关于c++ - 设置滚动条有问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16063791/

相关文章:

c++ - 在 C++11 中等待多个条件变量的最佳方法是什么?

c# - 我如何从 AtTask 下载文档?

javascript - 使用 Linkedin API 检索我的个人资料信息

javascript - 本地主机不存在 Access-Control-Allow-Origin

c++ - Win32 自定义文本框

c++ - C 和 C++ 标准的数学精度要求

c++ - 任何计算无限线和轴对齐弧之间距离的方法?

c++ - C++ 中的快速函数对象?

windows - Win32 ASM 程序不向命令行打印任何内容

c++ - 如何删除文件 MFC 的只读属性