闪烁水平滚动条

Posted

技术标签:

【中文标题】闪烁水平滚动条【英文标题】:Scintilla Horizontal Scrollbar 【发布时间】:2013-10-31 15:15:00 【问题描述】:

如何让它看起来像垂直的一样是自动的?

窗口是 300 宽,所以我尝试将 SCI_SETSCROLLWIDTH 设置为 300,然后在 SCI_SETSCROLLWIDTHTRACKING 开启的情况下小于 300,但滚动条要么始终显示,要么根本不显示。

【问题讨论】:

您使用的是哪个端口/绑定的闪烁体? SciLexer.DLL v:3.3.6 在 Windows 上。 Scintilla 不直接支持自动水平滚动条隐藏,因为它涉及可能非常昂贵的计算(即确定最长的行)。基本上,您必须自己做——这可能非常棘手,因为可能存在特定于平台的问题会增加更多的复杂性。我曾尝试使用 QScintilla,但根本无法获得任何工作。 【参考方案1】:

如果要显示/隐藏水平SB,则需要SCI_SETHSCROLLBAR(bool visible),但需要知道行尾在哪里。所以你可以试试我下面的内容。由于您只查看当前可见的线条,因此影响相当小。

请注意,我为 scintilla 控件/DLL 使用了 Delphi 包装器,但所有调用都可以使用常规的 scintilla 消息(相同的基本名称)进行,并且我还使用了一些下面的函数。您可以在收到 SCN_UPDATEUI 消息的地方调用它。

function GetFirstVisiblePos: Integer;
begin
    Result := PositionFromPoint(0,0);
end;

function GetLastVisiblePos: Integer;
begin
    Result := PositionFromPoint(clientwidth,clientheight);
end;

function GetFirstVisibleLine: Integer;
begin
    Result := LineFromPosition(GetFirstVisiblePos);
end;

function GetLastVisibleLine: Integer;
begin
    Result := LineFromPosition(GetLastVisiblePos);
end;

[...]

var
  i: integer;
  x, endPos: integer;
  needHSB: boolean;
begin  
    if not WordWrap then //Only need to do this if not wordwrapped
    begin

      x := ClientWidth ;
      needHSB := false;

      //Check currently visible lines only
      for i := GetFirstVisibleLine to GetLastVisibleLine do
      begin

        //GetXOffset adds left scroll spacing if we are already scrolled left some.
        endPos := PointXFromPosition(GetLineEndPosition(i) ) - x + GetXOffset ;

        needHSB := endPos > ClientWidth; 
        if needHSB then break; //once set, don't need to set again...

      end;

      SetHScrollBar( needHSB );

    end;
end;

尝试一下,那应该可以满足您的要求(如果我正确阅读了原始问题)。它对我有用,虽然我最初追求的东西有点不同。

我需要一种方法来尝试控制 sci 控件不会自动执行的水平滚动宽度(无论如何,对我来说;SCI_SETSCROLLWIDTHTRACKING 似乎是您要使用的,但我永远无法开始工作(在至少它暗示它应该在文档中工作)。我想出了下面的代码。在我的应用程序中,代码位于 SCN_UPDATEUI 消息区域。

    //Set new scroll width if there's a line longer than the current scroll
    //width can show:
    if not WordWrap then //Only need to do this if not wordwrapped
    begin

      //vars: i, x, endPos, LeftScrollPos : integer;

      x := ClientWidth ;

      //Check currently visible lines only
      for i := GetFirstVisibleLine to GetLastVisibleLine do
      begin

        //GetXOffset adds extra left scroll space if we are already scrolled left some.
        //24 is just a fudge factor to add a little visual space after a long line.
        endPos := PointXFromPosition(GetLineEndPosition(i) ) - x + GetXOffset + 24;

        if endPos > 2000 then //Greater than the control's default
        if endPos > ( GetScrollWidth ) then //Only need to proceed if we need more room
        begin
          LeftScrollPos := GetXOffset; //Store our current left scroll position
          SetScrollWidth( endPos ) ; //This sets left scroll to 0, so...
          SetXOffset( LeftScrollPos ); //Restore current left scroll position
        end;

      end;

    end;

【讨论】:

以上是关于闪烁水平滚动条的主要内容,如果未能解决你的问题,请参考以下文章

解决CListCtrl闪烁及水平滚动条不能跟踪拖动的问题(MFC)

打开一个网页,拉那个滚动条,页面就闪烁 为啥啊

如何永久显示 UIScrollView 滚动条而不仅仅是闪烁?

自动完成js - 列表的滚动条的列表向下箭头闪烁

CSS 如何添加水平滚动条

关于iframe的滚动条,如何去掉水平滚动条或垂直滚动条