首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从TRichEdit控件中完全删除选择条?

如何从TRichEdit控件中完全删除选择条?
EN

Stack Overflow用户
提问于 2013-06-09 19:43:16
回答 3查看 902关注 0票数 9

TRichEdit控件中的每一行的左侧,都有一个不可见的空间,其中光标更改为右向上箭头,当您单击该箭头时,整个行将被选中。当TRichEdit的文本对齐是中间或右边时,很容易看到它。我相信这个空间被称为选择条

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

我的问题是:

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

我使用的是Delphi7,没有TRichEdit属性来控制这种行为。

有一个ECO_SELECTIONBAR值可以与EM_SETOPTIONS消息一起使用,但它只添加或删除选择栏的一小部分(只有当您想要向具有左对齐的TRichEdit添加选择条时才有用)。

EN

回答 3

Stack Overflow用户

发布于 2013-06-12 15:19:39

谢谢大家的回答。

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

代码语言:javascript
复制
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.

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

请注意,此代码不允许双击整行选择,也不处理三击全文选择。为此,您可能需要使用一个拦截器类。

票数 1
EN

Stack Overflow用户

发布于 2013-06-10 01:07:18

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

代码语言:javascript
复制
dwStyle := GetWindowLong(RichEdit1.Handle, GWL_STYLE);
SetWindowLong(RichEdit1.Handle, GWL_STYLE, dwStyle and not ES_SELECTIONBAR);

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

代码语言:javascript
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2013-06-10 08:05:27

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17013466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档