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

RichEdit

开发平台:

Delphi

  1. //---------------------------------------------------------------------------
  2. #include <vcl.h>
  3. #pragma hdrstop
  4. #include "Unit1.h"
  5. //---------------------------------------------------------------------------
  6. #pragma package(smart_init)
  7. #pragma link "RichView"
  8. #pragma link "RVScroll"
  9. #pragma link "RVStyle"
  10. #pragma resource "*.dfm"
  11. TForm1 *Form1;
  12. //---------------------------------------------------------------------------
  13. __fastcall TForm1::TForm1(TComponent* Owner)
  14.     : TForm(Owner)
  15. {
  16. }
  17. //-----------------------------------------------------------------------------
  18. // Drawing left to right arrow
  19. //-----------------------------------------------------------------------------
  20. void DrawArrow(TCanvas* Canvas, int Left, int Top, int Width, int Height)
  21. {
  22.    int midx = Left+Width / 2;
  23.    int midy = Top+Height / 2;
  24.    int one, two;
  25.    if (Width>0)
  26.    {
  27.      one = 1;
  28.      two = -2;
  29.    }
  30.    else
  31.    {
  32.      one = -1;
  33.      two = 2;
  34.    }
  35.    TPoint points[8];
  36.    points[0].x = Left+one;
  37.    points[0].y = Top+3;
  38.    points[1].x = midx;
  39.    points[1].y = Top+3;
  40.    points[2].x = midx;
  41.    points[2].y = Top+1;
  42.    points[3].x = Left+Width+two;
  43.    points[3].y = midy;
  44.    points[4].x = midx;
  45.    points[4].y = Top+Height-2;
  46.    points[5].x = midx;
  47.    points[5].y = Top+Height-4;
  48.    points[6].x = Left+one;
  49.    points[6].y = Top+Height-4;
  50.    points[7].x = Left+one;
  51.    points[7].y = Top+3;
  52.    Canvas->Polyline(points, 7);
  53. }
  54. //-----------------------------------------------------------------------------
  55. // Drawing an icon for page breaks
  56. //-----------------------------------------------------------------------------
  57. void DrawPageIcon(TCanvas* Canvas, int Left, int Top, int Width, int Height)
  58. {
  59.    int LeftS  = Left+2;
  60.    int RightS = Left+Width-4;
  61.    TPoint points[8];
  62.    points[0].x = RightS-3;
  63.    points[0].y = Top;
  64.    points[1].x = LeftS;
  65.    points[1].y = Top;
  66.    points[2].x = LeftS;
  67.    points[2].y = Top+Height;
  68.    points[3].x = RightS;
  69.    points[3].y = Top+Height;
  70.    points[4].x = RightS;
  71.    points[4].y = Top+3;
  72.    points[5].x = RightS-3;
  73.    points[5].y = Top;
  74.    points[6].x = RightS-3;
  75.    points[6].y = Top+3;
  76.    points[7].x = RightS;
  77.    points[7].y = Top+3;
  78.    Canvas->Polyline(points, 7);
  79.    Canvas->Pen->Style = psDot;
  80.    Canvas->Pen->Color = clRed;
  81.    Canvas->MoveTo(Left, Top+Height/2);
  82.    Canvas->LineTo(Left+Width, Top+Height/2);
  83. }
  84. //------------------------------------------------------------------------------
  85. // Drawing a colored rectangle with specified degree of opacity (0..255)
  86. // (quite slow...)
  87. //------------------------------------------------------------------------------
  88. void DrawTrRect(TCanvas* Canvas, const TRect ARect,
  89.                      TColor Color, int Opacity)
  90. {
  91.   RGBQUAD rgb;
  92.   long int Clr = ColorToRGB(Color);
  93.   rgb.rgbRed      = (unsigned char)(Clr & 0x000000FF);
  94.   rgb.rgbGreen    = (unsigned char)((Clr & 0x0000FF00) >> 8);
  95.   rgb.rgbBlue     = (unsigned char)((Clr & 0x00FFFFFF) >> 16);
  96.   rgb.rgbReserved = 0;
  97.   Graphics::TBitmap* bmp = new Graphics::TBitmap;
  98.   bmp->PixelFormat = pf32bit;
  99.   bmp->Width       = ARect.Right-ARect.Left;
  100.   bmp->Height      = ARect.Bottom-ARect.Top;
  101.   bmp->Canvas->CopyRect(Rect(0,0,bmp->Width,bmp->Height), Canvas, ARect);
  102.   int tr = 255 - Opacity;
  103.   for (int i=0; i<bmp->Height; i++)
  104.   {
  105.     RGBQUAD* prgb = (RGBQUAD*)(bmp->ScanLine[i]);
  106.     for (int j=0; j<bmp->Width; j++)
  107.     {
  108.       prgb[j].rgbBlue  = (unsigned char)((prgb[j].rgbBlue*tr  + rgb.rgbBlue*Opacity) / 255);
  109.       prgb[j].rgbGreen = (unsigned char)((prgb[j].rgbGreen*tr + rgb.rgbGreen*Opacity) / 255);
  110.       prgb[j].rgbRed   = (unsigned char)((prgb[j].rgbRed*tr   + rgb.rgbRed*Opacity) / 255);
  111.     }
  112.   }
  113.   Canvas->Draw(ARect.Left, ARect.Top, bmp);
  114.   delete bmp;
  115. }
  116. //---------------------------------------------------------------------------
  117. void __fastcall TForm1::FormCreate(TObject *Sender)
  118. {
  119.   RichView1->AddNL("Example",1,1);
  120.   RichView1->AddNL("This is an example of the new feature - ",0,0);
  121.   RichView1->AddNL("custom drawn text",3,-1);
  122.   RichView1->AddNL(".",0,-1);
  123.   RichView1->AddNL(" Hot link 1 ",4,1);
  124.   RichView1->AddNL(" Hot link 2 ",5,1);
  125.   RichView1->AddBreakEx(1, rvbsLine, clBtnShadow);
  126.   RichView1->AddCheckpoint();
  127.   RichView1->AddNL("Another example - a custom drawing of checkpoints.",0,0);
  128.   RichView1->AddCheckpoint();
  129.   RichView1->AddNL("For example, you can draw a little nice arrow instead of default dotted line.",0,0);
  130.   RichView1->AddBreakEx(1, rvbsLine, clBtnShadow);
  131.   RichView1->AddNL("One more example - a custom displaying of page break",0,0);
  132.   RichView1->PageBreaksBeforeItems[RichView1->ItemCount-1] = true;
  133.   RichView1->Format();
  134.   RichView2->AddNL("Cool Effect - ",2,2);
  135.   RichView2->SetAddParagraphMode(False);
  136.   RichView2->AddNL("Transparent paragraph background.",2,2);
  137.   RichView2->AddNL("example of custom painting of paragraph background",0,2);
  138.   RichView2->SetAddParagraphMode(True);
  139.   for (int i=0; i<=20; i++)
  140.     RichView2->AddNL("This is the example of using of OnDrawParaBack event.",0,0);
  141.   RichView2->Format();
  142. }
  143. //-----------------------------------------------------------------------------
  144. // Should RichView repaint itself if mouse is over text of specified style?
  145. //-----------------------------------------------------------------------------
  146. void __fastcall TForm1::RVStyle1StyleHoverSensitive(TRVStyle *Sender,
  147.       int StyleNo, bool &Sensitive)
  148. {
  149.   if (StyleNo==4 || StyleNo==5)
  150.     Sensitive = true; // (default for other styles)
  151. }
  152. //-----------------------------------------------------------------------------
  153. // Drawing a background of text
  154. //-----------------------------------------------------------------------------
  155. void __fastcall TForm1::RVStyle1DrawTextBack(TRVStyle *Sender,
  156.       TCanvas *Canvas, int StyleNo, int Left, int Top, int Width,
  157.       int Height, TRVTextDrawStates DrawState, bool &DoDefault)
  158. {
  159.   switch (StyleNo)
  160.   {
  161.     case 5:
  162.     {
  163.       // drawing a sunken edge for the 5th style
  164.       RECT r = Bounds(Left,Top,Width,Height);
  165.       if (DrawState.Contains(rvtsHover))
  166.         DrawEdge(Canvas->Handle, &r, BDR_SUNKENOUTER | BF_ADJUST, BF_RECT);
  167.       break;
  168.     }
  169.   }
  170. }
  171. //-----------------------------------------------------------------------------
  172. // Drawing a text
  173. //-----------------------------------------------------------------------------
  174. void __fastcall TForm1::RVStyle1DrawStyleText(TRVStyle *Sender,
  175.       const AnsiString s, TCanvas *Canvas, int StyleNo, int SpaceBefore,
  176.       int Left, int Top, int Width, int Height,
  177.       TRVTextDrawStates DrawState, bool &DoDefault)
  178. {
  179.   if (DrawState.Contains(rvtsSelected))
  180.     return; // default drawing for selected text
  181.   Left += SpaceBefore;
  182.   switch (StyleNo)
  183.   {
  184.     case 0:
  185.     {
  186.       // sunken effect
  187.       Canvas->Font->Color = clBtnHighlight;
  188.       Canvas->TextOut(Left+1,Top+1, s);
  189.       Canvas->Font->Color = clBtnShadow;
  190.       Canvas->TextOut(Left,Top, s);
  191.       DoDefault = false;
  192.       break;
  193.     }
  194.     case 3:
  195.     {
  196.       // raised effect
  197.       Canvas->Font->Color = clBtnHighlight;
  198.       Canvas->TextOut(Left-1,Top-1, s);
  199.       Canvas->Font->Color = clBtnShadow;
  200.       Canvas->TextOut(Left+1,Top+1, s);
  201.       DoDefault = false;
  202.       break;
  203.     }
  204.     case 4:
  205.     {
  206.       if (DrawState.Contains(rvtsHover))
  207.       {
  208.         // hot glow effect
  209.         Canvas->Font->Color = Sender->TextStyles->Items[StyleNo]->HoverColor;
  210.         Canvas->TextOut(Left+1,Top+1, s);
  211.         Canvas->TextOut(Left-1,Top-1, s);
  212.         Canvas->Font->Color = Sender->TextStyles->Items[StyleNo]->Color;
  213.         Canvas->TextOut(Left,Top, s);
  214.         DoDefault = false;
  215.       }
  216.     }
  217.   }
  218. }
  219. //-----------------------------------------------------------------------------
  220. // Drawing checkpoint as arrow icon
  221. //-----------------------------------------------------------------------------
  222. void __fastcall TForm1::RVStyle1DrawCheckpoint(TRVStyle *Sender,
  223.       TCanvas *Canvas, int X, int Y, int ItemNo, int XShift,
  224.       bool RaiseEvent, TControl *Control, bool &DoDefault)
  225. {
  226.   if (RaiseEvent)
  227.     Canvas->Pen->Color = Sender->CheckpointEvColor;
  228.   else
  229.     Canvas->Pen->Color = Sender->CheckpointColor;
  230.   DrawArrow(Canvas, -XShift+2, Y-5, RichView1->LeftMargin-4, 10);
  231.   DoDefault = false;
  232. }
  233. //-----------------------------------------------------------------------------
  234. // Drawing page break as icon
  235. //-----------------------------------------------------------------------------
  236. void __fastcall TForm1::RVStyle1DrawPageBreak(TRVStyle *Sender,
  237.       TCanvas *Canvas, int Y, int XShift, TRVPageBreakType PageBreakType,
  238.       TControl *Control,
  239.       bool &DoDefault)
  240. {
  241.   Canvas->Pen->Color = Sender->PageBreakColor;
  242.   DrawPageIcon(Canvas, -XShift+2, Y-8, 16, 16);
  243.   DoDefault = false;
  244. }
  245. //-----------------------------------------------------------------------------
  246. // Drawing a background of paragraphs
  247. //-----------------------------------------------------------------------------
  248. void __fastcall TForm1::RVStyle1DrawParaBack(TRVStyle *Sender,
  249.       TCanvas *Canvas, int ParaNo, TRect &ARect, bool &DoDefault)
  250. {
  251.   if (ParaNo==2)
  252.   {
  253.     // semi-transparent background for second paragraph style
  254.     DrawTrRect(Canvas, ARect, Sender->ParaStyles->Items[ParaNo]->Background->Color, 150);
  255.     DoDefault = False;
  256.   }
  257. }
  258. //---------------------------------------------------------------------------
  259. void __fastcall TForm1::RichView2Paint(TCustomRichView *Sender,
  260.       TCanvas *Canvas, bool Prepaint)
  261. {
  262.   Canvas->Pen->Color = clRed;
  263.   Canvas->Pen->Width = 3;
  264.   Canvas->Brush->Color = clBlack;
  265.   int x = Sender->ClientWidth-10;
  266.   int y = Sender->ClientHeight-10;
  267.   Canvas->Ellipse(x-10, y-10, x+10, y+10);
  268.   tagRECT r = Bounds(x-10, y-10, 20, 20);
  269.   Canvas->Brush->Style = bsClear;
  270.   Canvas->Font->Color = clRed;
  271.   Canvas->Font->Name  = "Arial";
  272.   Canvas->Font->Style = TFontStyles();
  273.   Canvas->Font->Style << fsBold;
  274.   Canvas->Font->Size = 12;
  275.   DrawText(Canvas->Handle, "!", 1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  276. }
  277. //---------------------------------------------------------------------------
  278. void __fastcall TForm1::RichView2RVMouseUp(TCustomRichView *Sender,
  279.       TMouseButton Button, TShiftState Shift, int ItemNo, int X, int Y)
  280. {
  281.   if (X>Sender->ClientWidth-20 && Y>Sender->ClientHeight-20)
  282.     Application->MessageBox("!","!", MB_OK | MB_ICONINFORMATION);
  283. }
  284. //---------------------------------------------------------------------------