如何让它看起来像垂直的一样是自动的?
窗口是 300 宽,所以我尝试将 SCI_SETSCROLLWIDTH 设置为 300,然后在 SCI_SETSCROLLWIDTHTRACKING 开启的情况下小于 300,但滚动条仍将始终显示或根本不显示。
如何让它看起来像垂直的一样是自动的?
窗口是 300 宽,所以我尝试将 SCI_SETSCROLLWIDTH 设置为 300,然后在 SCI_SETSCROLLWIDTHTRACKING 开启的情况下小于 300,但滚动条仍将始终显示或根本不显示。
如果要显示/隐藏水平 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;