RVWordPaint.pas
上传用户:daoqigc
上传日期:2021-04-20
资源大小:2795k
文件大小:4k
源码类别:

RichEdit

开发平台:

Delphi

  1. {*******************************************************}
  2. {                                                       }
  3. {       RichView                                        }
  4. {       Classes for extra painting over items.          }
  5. {       Used for live spelling check.                   }
  6. {                                                       }
  7. {       Copyright (c) Sergey Tkachenko                  }
  8. {       svt@trichview.com                               }
  9. {       http://www.trichview.com                        }
  10. {                                                       }
  11. {*******************************************************}
  12. unit RVWordPaint;
  13. {$I RV_Defs.inc}
  14. interface
  15. uses Windows, Graphics, Classes, SysUtils,
  16.      RVClasses, DLines;
  17. type
  18.   { ---------------------------------------------------------------------------
  19.     TRVWordPainter: abstract ancestor class for painting over part of text items.
  20.     Fields:
  21.     - StartOff - start of text fragment (from 1)
  22.     - Length - length of text fragment.
  23.     Text fragment is usually a word.
  24.   }
  25.   TRVWordPainter = class
  26.     public
  27.       StartOffs, Length: Integer;
  28.       procedure Draw(Canvas: TCanvas; ditem: TRVDrawLineInfo;
  29.         RVData: TPersistent; const r: TRect; Index: Integer); virtual; abstract;
  30.       constructor Create(AStartOffs, ALength: Integer);
  31.   end;
  32.   { ---------------------------------------------------------------------------
  33.     TRVWordPainterList: list of TRVWordPainter.
  34.     Each text item contains such list.
  35.   }
  36.   TRVWordPainterList = class (TRVList)
  37.   private
  38.     function Get(Index: Integer): TRVWordPainter;
  39.     procedure Put(Index: Integer; const Value: TRVWordPainter);
  40.   public
  41.     property Items[Index: Integer]: TRVWordPainter read Get write Put; default;
  42.   end;
  43.   { ---------------------------------------------------------------------------
  44.     TRVWordMisspellPainter: class for drawing red curved underlines
  45.     for misspelled words.
  46.   }
  47.   TRVWordMisspellPainter = class (TRVWordPainter)
  48.   public
  49.     procedure Draw(Canvas: TCanvas; ditem: TRVDrawLineInfo;
  50.       RVData: TPersistent; const r: TRect; Index: Integer); override;
  51.   end;
  52. implementation
  53. uses CRVData;
  54. {================================= TRVWordPainter =============================}
  55. constructor TRVWordPainter.Create(AStartOffs, ALength: Integer);
  56. begin
  57.   inherited Create;
  58.   StartOffs := AStartOffs;
  59.   Length    := ALength;
  60. end;
  61. {============================= TRVWordMisspellPainter =========================}
  62. procedure TRVWordMisspellPainter.Draw(Canvas: TCanvas;
  63.   ditem: TRVDrawLineInfo; RVData: TPersistent; const r: TRect; Index: Integer);
  64. var OldColor: TColor;
  65.     OldWidth: Integer;
  66.     Points: array[0..1023] of TPoint;
  67.     PointCount: Integer;
  68.     Up: Boolean;
  69.     StartX, EndX, Y: Integer;
  70.     {
  71.     FN: String;
  72.     FS: Integer;
  73.     }
  74. begin
  75.   PointCount  := 0;
  76.   Up          := True;
  77.   StartX := r.Left;
  78.   EndX   := r.Right;
  79.   Y      := r.Bottom+2{+Random(5)};
  80.   while (PointCount < 1024) and (StartX < EndX) do begin
  81.     Points[PointCount].X := StartX;
  82.     inc(StartX, 2);
  83.     if Up then
  84.       Points[PointCount].Y := Y-4
  85.     else
  86.       Points[PointCount].Y := Y-2;
  87.     inc(PointCount);
  88.     Up := not Up;
  89.   end;
  90.   if (PointCount > 1) then begin
  91.     OldColor := Canvas.Pen.Color;
  92.     OldWidth := Canvas.Pen.Width;
  93.     Canvas.Pen.Color := TCustomRVData(RVData).GetRVStyle.LiveSpellingColor;
  94.     Canvas.Pen.Width := 1;
  95.     Points[PointCount-1].X := EndX;
  96.     Polyline(Canvas.Handle, Points, PointCount);
  97.     Canvas.Pen.Width := OldWidth;
  98.     Canvas.Pen.Color := OldColor;
  99.   end;
  100.   {
  101.   FS := Canvas.Font.Size;
  102.   FN := Canvas.Font.Name;
  103.   Canvas.Font.Color := clRed;
  104.   Canvas.Font.Name := 'Small Fonts';
  105.   Canvas.Font.Size := 6;
  106.   Canvas.Brush.Style := bsClear;
  107.   Canvas.TextOut(r.Right,r.Bottom, IntToStr(Index));
  108.   Canvas.Font.Size := FS;
  109.   Canvas.Font.Name := FN;
  110.   }
  111. end;
  112. { TRVWordPainterList }
  113. function TRVWordPainterList.Get(Index: Integer): TRVWordPainter;
  114. begin
  115.   Result := TRVWordPainter(inherited Get(Index));
  116. end;
  117. procedure TRVWordPainterList.Put(Index: Integer; const Value: TRVWordPainter);
  118. begin
  119.   inherited Put(Index, Value);
  120. end;
  121. end.