9

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

控件中不存在这样的栏TMemo

我的问题:

如何删除此选择栏,以使光标行为与中相同TMemo

我正在使用 Delphi 7,并且没有TRichEdit属性可以控制这种行为。

ECO_SELECTIONBAR您可以在消息中使用一个值EM_SETOPTIONS,但它只会添加或删除选择栏的一小部分(仅当您想要将选择栏添加到TRichEdit具有左对齐的 a 时才有用)。

4

3 回答 3

1

谢谢大家的回答。

由于似乎没有“正确”的方法来做到这一点,我设计了以下解决方案:

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.

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

请注意,此代码不允许双击整行选择,并且它不处理三次单击全文选择。为此,您可能必须使用拦截器类。

于 2013-06-12T15:19:39.313 回答
0

没有记录的方法可以为富编辑控件禁用此行为。没有样式、消息或功能可以提供任何方式来禁用此行为。

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

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

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

于 2013-06-10T08:05:27.327 回答
0

尝试使用从 RichEditSetWindowLong()中删除窗口样式,例如: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;
于 2013-06-10T01:07:18.987 回答