设置滚动条有问题

时间:2013-04-17 15:12:26

标签: 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;
            }

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

1 个答案:

答案 0 :(得分:0)

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

查看EM_SCROLLEM_SCROLLCARET等消息。或者只是向编辑控件发送SB_BOTTOM消息{{1}}。然后编辑控件将找出如何更新滚动条。