如何从TRichEdit控件中完全移除选择栏



TRichEdit控件的每一行的左侧都有一个不可见的空间,光标在那里变成一个向上的箭头,当你点击那里时,整个行被选中。当TRichEdit的文本对齐方式是居中或右时,很容易看到它。我相信这个空间被称为选择栏

TMemo控制中不存在这样的条。

我的问题:

如何删除这个选择条,使光标的行为将是相同的TMemo ?

我使用Delphi 7,没有TRichEdit属性来控制这种行为。

有一个ECO_SELECTIONBAR值,你可以使用EM_SETOPTIONS消息,但它只能添加或删除一小部分的选择栏(只有当你想要添加一个选择栏的TRichEdit,有左对齐)。

谢谢大家的回答。

由于似乎没有"适当"的方法来做到这一点,我设计了以下解决方案:

unit TRichEditRemoveSelectionBar;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    procedure RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure RichEdit1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form1: TForm1;
  B: Boolean = False;
implementation
{$R *.dfm}
// ------------------------------------------------------------------------- //
procedure TForm1.RichEdit1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if (GetCursor <> Screen.Cursors[crDefault]) and
     (GetCursor <> Screen.Cursors[crIBeam]) then
  begin
    SetCursor(Screen.Cursors[crIBeam]);
    B := True;
  end else
    B := False;
end;
procedure TForm1.RichEdit1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if B then
  begin
    SetCursor(Screen.Cursors[crIBeam]);
    RichEdit1.SelLength := 0;
  end;
end;
procedure TForm1.RichEdit1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if B then
    SetCursor(Screen.Cursors[crIBeam]);
end;
// ------------------------------------------------------------------------- //
end.

它一点也不优雅,但它完成了工作。

注意,这段代码不允许双击完整行选择,也不允许双击完整文本选择。为此,您可能需要使用拦截器类,例如:

尝试使用SetWindowLong()从richit中删除ES_SELECTIONBAR窗口样式,例如:

dwStyle := GetWindowLong(RichEdit1.Handle, GWL_STYLE);
SetWindowLong(RichEdit1.Handle, GWL_STYLE, dwStyle and not ES_SELECTIONBAR);

或者,从TRichEdit派生一个新组件,或者使用一个拦截器类,覆盖虚拟的CreateParams()方法来删除样式:

type
  TMyRichEdit = class(TRichEdit)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
  end;
Procedure TMyRichEdit.CreateParams(var Params: TCreateParams);
Begin
  inherited;
  Params.Style := Params.Style and not ES_SELECTIONBAR;
End;

没有文档说明如何禁用富编辑控件的此行为。没有样式、消息或函数提供任何方法来禁用此行为。

你提到的ES_SELECTIONBAR样式允许在文本左对齐时添加一个小的边距。富编辑控件的Delphi包装器不包括ES_SELECTIONBAR样式,因此您无法删除它,因为它从一开始就不存在。

对于居中和右对齐的文本,无论是否存在ES_SELECTIONBAR样式,选择区域始终存在。事实上,ES_SELECTIONBAR样式似乎对控件居中和右对齐文本的行为没有任何影响。

我希望如果您对这个选择区域的实现进行反向工程,您将能够通过修改富编辑控件的窗口过程来删除该行为。

相关内容

  • 没有找到相关文章

最新更新