【问题标题】:Have trouble with setting a scroll bar设置滚动条时遇到问题
【发布时间】:2013-04-17 15:12:25
【问题描述】:

所以我有 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;
            }

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

【问题讨论】:

    标签: c++ api winapi user-interface


    【解决方案1】:

    你需要做的是告诉编辑控件滚动到底部,并让它更新滚动条。仅仅改变滚动条的外观不会让文本显示在视图中。

    查看EM_SCROLLEM_SCROLLCARET 之类的消息。或者也许只是向编辑控件发送带有SB_BOTTOMWM_VSCROLL 消息。编辑控件然后会计算出如何更新滚动条。

    【讨论】:

    • 那没用。第二个焦点是滚动条上升的另一个孩子。只有当焦点在带有滚动条的窗口上时它才会下降。这仅适用于滚动条本身。窗口内容不改变,不重绘。
    猜你喜欢
    • 1970-01-01
    • 2014-12-15
    • 2019-11-01
    • 2021-06-19
    • 1970-01-01
    • 2018-08-13
    • 2011-09-20
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多