在TRichEdit
控件的每一行的左侧,有一个不可见的空间,光标变为右上箭头,当您单击那里时,整个行被选中。当TRichEdit的文本对齐方式为中心或右侧时,很容易看到它。我相信这个空间被称为选择栏。
TMemo
控件中不存在此栏。
我的问题:
如何删除此选择栏,以便光标行为与TMemo
中的相同?
我正在使用Delphi 7,并且没有TRichEdit
属性来控制此行为。
您可以在ECO_SELECTIONBAR
消息中使用EM_SETOPTIONS
值,但它只会添加或删除选择栏的一小部分(仅当您要将选择栏添加到{时才有用) {1}}具有左对齐方式。)
答案 0 :(得分: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.
它根本不优雅,但它完成了工作。
请注意,此代码不允许双击完整行选择,并且不会处理三击全文选择。为此,您可能必须使用拦截器类。
答案 1 :(得分:0)
尝试使用SetWindowLong()
从RichEdit中删除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;
答案 2 :(得分:0)
没有记录的方法可以为富编辑控件禁用此行为。没有样式,消息或函数可以提供任何方法来禁用此行为。
您提到的ES_SELECTIONBAR
样式允许在文本左对齐时添加小边距。丰富的编辑控件的Delphi包装器不包含ES_SELECTIONBAR
样式,所以它不像你可以删除它,因为它从来没有在那里。
对于居中和右对齐的文本,无论ES_SELECTIONBAR
样式的存在与否,选择区域始终存在。事实上,ES_SELECTIONBAR
样式似乎对控件的居中和右对齐文本的行为没有任何影响。
我希望如果您反向设计此选择区域的实现,您可以通过修改富编辑控件的窗口过程来删除该行为。