Scintilla水平滚动条

时间:2013-10-31 15:15:00

标签: scintilla

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

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

1 个答案:

答案 0 :(得分:0)

如果要显示/隐藏水平SB,则需要SCI_SETHSCROLLBAR(bool可见),但是您需要知道行的结尾。因此,您可以尝试下面的内容。由于您仅查看当前可见的行,因此影响很小。

请注意,我为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;