Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Подсветка строки в RichEdit


Автор: estra 6.8.2013, 09:04
Подскажите, как реализовать подсветку целой строки подобно тому, как это делает, например, редактор кода Delphi?

Автор: Poseidon 6.8.2013, 17:21
У Delphi там, судя по всему, не RichEdit, а TEditControl. Какой-то, видимо, внутренний класс.

Автор: estra 7.8.2013, 08:21
Цитата(Poseidon @  6.8.2013,  17:21 Найти цитируемый пост)
У Delphi там, судя по всему, не RichEdit, а TEditControl. Какой-то, видимо, внутренний класс. 

Это понятно, я просто в пример привел. Хотелось реализовать аналогичное в RichEdit

Автор: kroiksm 8.8.2013, 16:19
Может это решение подойдет: http://www.delphipages.com/forum/showthread.php?t=208579

Автор: Akella 9.8.2013, 11:02
estra, покажи, как делал, что именно не получается?

Автор: estra 15.8.2013, 17:32
kroiksm, 

не подойдет, этот пример меняет цвет фона текста, но не закрашивает всю строку...

Akella, 

вот тут все мои эксперименты...

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls, RichEdit;

type
  TRichEdit = class( ComCtrls.TRichEdit )
  private
    FirstLen: Integer;
    LastLen: Integer;
    CurrentLen, CurOld: Integer;

    NeedUpdate: Boolean;
    procedure WMPaint(var Message: TWMPaint); message WM_PAINT;

    procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
    procedure WMKeyUp(var Message: TWMKeyUp); message WM_KEYUP;
    procedure WMChar(var Message: TWMChar); message WM_CHAR;
    procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
    procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
    procedure WMVMouseWheel(var Message: TWMMouseWheel); message WM_MOUSEWHEEL;

    function GetFirstVisibleLine: integer;
    function GetLastVisibleLine: integer;
    function GetCurrentLine: integer;
    procedure GetLinesInfo;
  public
    Canvas: TCanvas;
    constructor Create( AOwner : TComponent ); override;
    destructor Destroy; override;
  end;

  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TRichEdit }

constructor TRichEdit.Create(AOwner: TComponent);
begin
   inherited;
   Canvas := TControlCanvas.Create;
   TControlCanvas( Canvas ).Control := Self;
   NeedUpdate := True;
end;

destructor TRichEdit.Destroy;
begin
   Canvas.Free;
   inherited;
end;

procedure TRichEdit.WMChar(var Message: TWMChar);
begin
   inherited;
   GetLinesInfo;
   NeedUpdate := True;
end;

procedure TRichEdit.WMHScroll(var Message: TWMHScroll);
begin
   inherited;
   GetLinesInfo;
   NeedUpdate := True;
end;

procedure TRichEdit.WMKeyDown(var Message: TWMKeyDown);
begin
   inherited;
   GetLinesInfo;
   NeedUpdate := True;
end;

procedure TRichEdit.WMKeyUp(var Message: TWMKeyUp);
begin
   inherited;
   GetLinesInfo;
   NeedUpdate := True;
end;

procedure TRichEdit.WMPaint(var Message: TWMPaint);
begin
   inherited;
   if NeedUpdate then
   begin
      Invalidate;
      NeedUpdate := False;
   end;
   //Canvas.MoveTo( 10, 10 );
   //Canvas.LineTo( 50, 50 );
   //if ( CurrentLen >= FirstLen ) and ( CurrentLen <= LastLen ) then
   begin
      if CurOld <> CurrentLen then
         Invalidate;
      Canvas.Brush.Color := clYellow;
      Canvas.FillRect( Rect( 0, CurrentLen * 13, Width-6, CurrentLen * 13 + 18 ) );
      Canvas.TextOut( 1, CurrentLen * 13+1, Lines[CurrentLen] );
   end;
   Form1.Caption := Format( '%d  %d  %d', [FirstLen, CurrentLen, LastLen] );
end;

procedure TRichEdit.WMVMouseWheel(var Message: TWMMouseWheel);
begin
   inherited;
   GetLinesInfo;
   NeedUpdate := True;
end;

procedure TRichEdit.WMVScroll(var Message: TWMVScroll);
begin
   inherited;
   GetLinesInfo;
   NeedUpdate := True;
end;

function TRichEdit.GetCurrentLine: integer;
begin
   Result := Perform( EM_EXLINEFROMCHAR, 0, SelStart + SelLength );
end;

function TRichEdit.GetFirstVisibleLine: integer;
begin
   Result := Perform( EM_GETFIRSTVISIBLELINE, 0, 0 );
end;

function TRichEdit.GetLastVisibleLine: integer;
const
  EM_EXLINEFROMCHAR = WM_USER + 54;
var
  r: TRect;
  i: integer;
begin
   Perform( EM_GETRECT, 0, Longint( @r ) );
   r.Left := r.Left + 1;
   r.Top  := r.Bottom - 2;
   i := Perform( EM_CHARFROMPOS, 0, Integer( @r.topleft ) );
   Result := Perform( EM_EXLINEFROMCHAR, 0, i );
end;

procedure TRichEdit.GetLinesInfo;
begin
   FirstLen := GetFirstVisibleLine;
   LastLen := GetLastVisibleLine;
   CurOld := CurrentLen;
   CurrentLen := GetCurrentLine;
end;

end.

Автор: Akella 15.8.2013, 22:24
А SelStart/SelLength не подходит?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)