📄 unit1.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "RichView"
#pragma link "RVScroll"
#pragma link "RVStyle"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-----------------------------------------------------------------------------
// Drawing left to right arrow
//-----------------------------------------------------------------------------
void DrawArrow(TCanvas* Canvas, int Left, int Top, int Width, int Height)
{
int midx = Left+Width / 2;
int midy = Top+Height / 2;
int one, two;
if (Width>0)
{
one = 1;
two = -2;
}
else
{
one = -1;
two = 2;
}
TPoint points[8];
points[0].x = Left+one;
points[0].y = Top+3;
points[1].x = midx;
points[1].y = Top+3;
points[2].x = midx;
points[2].y = Top+1;
points[3].x = Left+Width+two;
points[3].y = midy;
points[4].x = midx;
points[4].y = Top+Height-2;
points[5].x = midx;
points[5].y = Top+Height-4;
points[6].x = Left+one;
points[6].y = Top+Height-4;
points[7].x = Left+one;
points[7].y = Top+3;
Canvas->Polyline(points, 7);
}
//-----------------------------------------------------------------------------
// Drawing an icon for page breaks
//-----------------------------------------------------------------------------
void DrawPageIcon(TCanvas* Canvas, int Left, int Top, int Width, int Height)
{
int LeftS = Left+2;
int RightS = Left+Width-4;
TPoint points[8];
points[0].x = RightS-3;
points[0].y = Top;
points[1].x = LeftS;
points[1].y = Top;
points[2].x = LeftS;
points[2].y = Top+Height;
points[3].x = RightS;
points[3].y = Top+Height;
points[4].x = RightS;
points[4].y = Top+3;
points[5].x = RightS-3;
points[5].y = Top;
points[6].x = RightS-3;
points[6].y = Top+3;
points[7].x = RightS;
points[7].y = Top+3;
Canvas->Polyline(points, 7);
Canvas->Pen->Style = psDot;
Canvas->Pen->Color = clRed;
Canvas->MoveTo(Left, Top+Height/2);
Canvas->LineTo(Left+Width, Top+Height/2);
}
//------------------------------------------------------------------------------
// Drawing a colored rectangle with specified degree of opacity (0..255)
// (quite slow...)
//------------------------------------------------------------------------------
void DrawTrRect(TCanvas* Canvas, const TRect ARect,
TColor Color, int Opacity)
{
RGBQUAD rgb;
long int Clr = ColorToRGB(Color);
rgb.rgbRed = (unsigned char)(Clr & 0x000000FF);
rgb.rgbGreen = (unsigned char)((Clr & 0x0000FF00) >> 8);
rgb.rgbBlue = (unsigned char)((Clr & 0x00FFFFFF) >> 16);
rgb.rgbReserved = 0;
Graphics::TBitmap* bmp = new Graphics::TBitmap;
bmp->PixelFormat = pf32bit;
bmp->Width = ARect.Right-ARect.Left;
bmp->Height = ARect.Bottom-ARect.Top;
bmp->Canvas->CopyRect(Rect(0,0,bmp->Width,bmp->Height), Canvas, ARect);
int tr = 255 - Opacity;
for (int i=0; i<bmp->Height; i++)
{
RGBQUAD* prgb = (RGBQUAD*)(bmp->ScanLine[i]);
for (int j=0; j<bmp->Width; j++)
{
prgb[j].rgbBlue = (unsigned char)((prgb[j].rgbBlue*tr + rgb.rgbBlue*Opacity) / 255);
prgb[j].rgbGreen = (unsigned char)((prgb[j].rgbGreen*tr + rgb.rgbGreen*Opacity) / 255);
prgb[j].rgbRed = (unsigned char)((prgb[j].rgbRed*tr + rgb.rgbRed*Opacity) / 255);
}
}
Canvas->Draw(ARect.Left, ARect.Top, bmp);
delete bmp;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
RichView1->AddNL("Example",1,1);
RichView1->AddNL("This is an example of the new feature - ",0,0);
RichView1->AddNL("custom drawn text",3,-1);
RichView1->AddNL(".",0,-1);
RichView1->AddNL(" Hot link 1 ",4,1);
RichView1->AddNL(" Hot link 2 ",5,1);
RichView1->AddBreakEx(1, rvbsLine, clBtnShadow);
RichView1->AddCheckpoint();
RichView1->AddNL("Another example - a custom drawing of checkpoints.",0,0);
RichView1->AddCheckpoint();
RichView1->AddNL("For example, you can draw a little nice arrow instead of default dotted line.",0,0);
RichView1->AddBreakEx(1, rvbsLine, clBtnShadow);
RichView1->AddNL("One more example - a custom displaying of page break",0,0);
RichView1->PageBreaksBeforeItems[RichView1->ItemCount-1] = true;
RichView1->Format();
RichView2->AddNL("Cool Effect - ",2,2);
RichView2->SetAddParagraphMode(False);
RichView2->AddNL("Transparent paragraph background.",2,2);
RichView2->AddNL("example of custom painting of paragraph background",0,2);
RichView2->SetAddParagraphMode(True);
for (int i=0; i<=20; i++)
RichView2->AddNL("This is the example of using of OnDrawParaBack event.",0,0);
RichView2->Format();
}
//-----------------------------------------------------------------------------
// Should RichView repaint itself if mouse is over text of specified style?
//-----------------------------------------------------------------------------
void __fastcall TForm1::RVStyle1StyleHoverSensitive(TRVStyle *Sender,
int StyleNo, bool &Sensitive)
{
if (StyleNo==4 || StyleNo==5)
Sensitive = true; // (default for other styles)
}
//-----------------------------------------------------------------------------
// Drawing a background of text
//-----------------------------------------------------------------------------
void __fastcall TForm1::RVStyle1DrawTextBack(TRVStyle *Sender,
TCanvas *Canvas, int StyleNo, int Left, int Top, int Width,
int Height, TRVTextDrawStates DrawState, bool &DoDefault)
{
switch (StyleNo)
{
case 5:
{
// drawing a sunken edge for the 5th style
RECT r = Bounds(Left,Top,Width,Height);
if (DrawState.Contains(rvtsHover))
DrawEdge(Canvas->Handle, &r, BDR_SUNKENOUTER | BF_ADJUST, BF_RECT);
break;
}
}
}
//-----------------------------------------------------------------------------
// Drawing a text
//-----------------------------------------------------------------------------
void __fastcall TForm1::RVStyle1DrawStyleText(TRVStyle *Sender,
const AnsiString s, TCanvas *Canvas, int StyleNo, int SpaceBefore,
int Left, int Top, int Width, int Height,
TRVTextDrawStates DrawState, bool &DoDefault)
{
if (DrawState.Contains(rvtsSelected))
return; // default drawing for selected text
Left += SpaceBefore;
switch (StyleNo)
{
case 0:
{
// sunken effect
Canvas->Font->Color = clBtnHighlight;
Canvas->TextOut(Left+1,Top+1, s);
Canvas->Font->Color = clBtnShadow;
Canvas->TextOut(Left,Top, s);
DoDefault = false;
break;
}
case 3:
{
// raised effect
Canvas->Font->Color = clBtnHighlight;
Canvas->TextOut(Left-1,Top-1, s);
Canvas->Font->Color = clBtnShadow;
Canvas->TextOut(Left+1,Top+1, s);
DoDefault = false;
break;
}
case 4:
{
if (DrawState.Contains(rvtsHover))
{
// hot glow effect
Canvas->Font->Color = Sender->TextStyles->Items[StyleNo]->HoverColor;
Canvas->TextOut(Left+1,Top+1, s);
Canvas->TextOut(Left-1,Top-1, s);
Canvas->Font->Color = Sender->TextStyles->Items[StyleNo]->Color;
Canvas->TextOut(Left,Top, s);
DoDefault = false;
}
}
}
}
//-----------------------------------------------------------------------------
// Drawing checkpoint as arrow icon
//-----------------------------------------------------------------------------
void __fastcall TForm1::RVStyle1DrawCheckpoint(TRVStyle *Sender,
TCanvas *Canvas, int X, int Y, int ItemNo, int XShift,
bool RaiseEvent, TControl *Control, bool &DoDefault)
{
if (RaiseEvent)
Canvas->Pen->Color = Sender->CheckpointEvColor;
else
Canvas->Pen->Color = Sender->CheckpointColor;
DrawArrow(Canvas, -XShift+2, Y-5, RichView1->LeftMargin-4, 10);
DoDefault = false;
}
//-----------------------------------------------------------------------------
// Drawing page break as icon
//-----------------------------------------------------------------------------
void __fastcall TForm1::RVStyle1DrawPageBreak(TRVStyle *Sender,
TCanvas *Canvas, int Y, int XShift, TRVPageBreakType PageBreakType,
TControl *Control,
bool &DoDefault)
{
Canvas->Pen->Color = Sender->PageBreakColor;
DrawPageIcon(Canvas, -XShift+2, Y-8, 16, 16);
DoDefault = false;
}
//-----------------------------------------------------------------------------
// Drawing a background of paragraphs
//-----------------------------------------------------------------------------
void __fastcall TForm1::RVStyle1DrawParaBack(TRVStyle *Sender,
TCanvas *Canvas, int ParaNo, TRect &ARect, bool &DoDefault)
{
if (ParaNo==2)
{
// semi-transparent background for second paragraph style
DrawTrRect(Canvas, ARect, Sender->ParaStyles->Items[ParaNo]->Background->Color, 150);
DoDefault = False;
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichView2Paint(TCustomRichView *Sender,
TCanvas *Canvas, bool Prepaint)
{
Canvas->Pen->Color = clRed;
Canvas->Pen->Width = 3;
Canvas->Brush->Color = clBlack;
int x = Sender->ClientWidth-10;
int y = Sender->ClientHeight-10;
Canvas->Ellipse(x-10, y-10, x+10, y+10);
tagRECT r = Bounds(x-10, y-10, 20, 20);
Canvas->Brush->Style = bsClear;
Canvas->Font->Color = clRed;
Canvas->Font->Name = "Arial";
Canvas->Font->Style = TFontStyles();
Canvas->Font->Style << fsBold;
Canvas->Font->Size = 12;
DrawText(Canvas->Handle, "!", 1, &r, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RichView2RVMouseUp(TCustomRichView *Sender,
TMouseButton Button, TShiftState Shift, int ItemNo, int X, int Y)
{
if (X>Sender->ClientWidth-20 && Y>Sender->ClientHeight-20)
Application->MessageBox("!","!", MB_OK | MB_ICONINFORMATION);
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -