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

RichEdit

开发平台:

Delphi

  1. /*=============================================================================}
  2. { Demo:                                                                        }
  3. { 1. how to load RVF file saved in demo editor.                                }
  4. { 2. HTML export with custom saving of images                                  }
  5. {    (uses free Anders Melander's TGifImage:                                   }
  6. {     http://www.torry.net/vcl/graphics/gif/gifimage.exe                       }
  7. {     http://www.trichview.com/resources/thirdparty/gifimage.zip (update)      }
  8. {     but can be modified to work with other GIF implementations               }
  9. {     supporting assignment from other graphic formats)                        }
  10. { Sergey Tkachenko                                                             }
  11. {------------------------------------------------------------------------------}
  12. { Providing pictures and controls on request from RichView is not supported in }
  13. { this demo.                                                                   }
  14. {=============================================================================*/
  15. #include <vclvcl.h>
  16. #pragma hdrstop
  17. #include "Unit1.h"
  18. #include "RVTable.hpp"
  19. #include "WMFCanvasWorkAround.hpp"
  20. //---------------------------------------------------------------------------
  21. #pragma link "RichView"
  22. #pragma link "RVScroll"
  23. #pragma link "RVStyle"
  24. #pragma link "RVTable"
  25. #pragma link "RVTInplace"
  26. #pragma link "GifImage"
  27. #pragma resource "*.dfm"
  28. TForm1 *Form1;
  29. /*=================== Notes about loading from RVF files:=======================
  30. 1. In simplest cases you can just write: RichView1->LoadRVF(<file name>);
  31. 2. If file contains inserted Delphi Controls, these controls must be registered
  32.    with RegisterClasses functions before loading (see FormCreate below)
  33. 3. If file contains images from image lists, you need to process
  34.    OnRVFImageListNeeded event (see RichView1RVFImageListNeeded below)
  35.    If you have several image lists, you can distinguish them using
  36.    ImageListTag parameter of this event.
  37. 4. You must have the same (or compatible) TRVStyle object assigned to
  38.    RichView1->Style as in the editor.
  39.    Otherwise, you need to set option "Allow adding styles dynamically"
  40.    both in richview which saves and in richview which loads RVF
  41.    (right-click RichView in C++Builder, choose "Settings" in the context menu)
  42.    (not supported in C++Builder 1).
  43. 5. If some items in RVF file have character strings associated as items' tags
  44.    (rvoTagsArePChars was in editor's Options), you need also set rvoTagsArePChars
  45.    in RichView1->Options.
  46. ==============================================================================*/
  47. /*==================== Notes about HTML export =================================
  48. 1. There are 2 methods for saving HTML files:
  49.    a) SaveHTML - saving HTML file, where formatting is made by <FONT>,<B>,
  50.      <I> tags, etc.
  51.    b) SaveHTMLEx - saving HTML file, where formatting is made by Cascading
  52.      Style Sheet
  53. 2. Images are saved in separate files in JPG-files (or in BMP-files for C++Builder 1,
  54.    or if RVDONOTUSEJPEGIMAGE directive is defined)
  55. 3. By default, images are saved in the same directory as HTML file, and have
  56.    names built as Prefix + Number + .JPG.
  57.    You can specify your own prefix as parameter of SaveHTML[Ex].
  58.    You can include subdirectory in prefix (such as "imagesimg"), but this
  59.    subdirectory will NOT be created automatically.
  60. 4. JPEG/BMP do not support transparency. Transparent color (of metafiles,
  61.    icons, imagelist images) is replaced with current background color
  62.    (of RichView or table cell or paragraph background)
  63. 5. By default, images from imagelists (bullets and hotspot) are saved like
  64.    other images, but the same image saved only one time (next occurrences
  65.    point to the same image file, if they have the same background color)
  66. 6. You can save images yourself using OnHTMLSaveImage event (new in v1.4).
  67.    You need to store image to file and return its location in 'Location'
  68.    parameter.
  69.    This demo shows
  70.    a) how to save images in GIF-files
  71.    b) how to save bullets in a way allowing to use the same image files for
  72.       all HTML document generated by your application.
  73. 7. By default hypertext is not saved.
  74.    You can specify destinations of [some/all] hypertext jumps
  75.    using OnWriteHyperlink event.
  76. 8. By default inserted controls are not saved.
  77.    You can save them using OnSaveComponentToFile event.
  78. 9. You can save additional information in OnSaveHTMLExtra.
  79. ==============================================================================*/
  80. //---------------------------------------------------------------------------
  81. __fastcall TForm1::TForm1(TComponent* Owner)
  82.     : TForm(Owner)
  83. {
  84. }
  85. //---------------------------------------------------------------------------
  86. void __fastcall TForm1::FormCreate(TObject *Sender)
  87. {
  88.   TComponentClass Classes[3] = { __classid(TButton), __classid(TEdit), __classid(TOleContainer) };
  89.   RegisterClasses(Classes,2);
  90. }
  91. //============================== RVF loading ==================================
  92. void __fastcall TForm1::Button1Click(TObject *Sender)
  93. {
  94.   if (OpenDialog1->Execute())
  95.   {
  96.     if (!RichView1->LoadRVF(OpenDialog1->FileName))
  97.       Application->MessageBox("Error Loading File", NULL, MB_OK);
  98.     RichView1->Format();
  99.   }
  100. }
  101. //---------------------------------------------------------------------------
  102. void __fastcall TForm1::RichView1RVFImageListNeeded(TCustomRichView *Sender,
  103.     int ImageListTag, TCustomImageList *&il)
  104. {
  105.   il = ImageList1;
  106. }
  107. //============================ Hypertext testing ==============================
  108. void __fastcall TForm1::RichView1RVMouseMove(TObject *Sender, int id)
  109. {
  110.   if (id==-1)
  111.     StatusBar1->SimpleText = "";
  112.   else
  113.   {
  114.     TCustomRVFormattedData* RVData;
  115.     int ItemNo;
  116.     RichView1->GetJumpPointLocation(id, RVData, ItemNo);
  117.     StatusBar1->SimpleText = (char*)RVData->GetItemTag(ItemNo);
  118.   }
  119. }
  120. //---------------------------------------------------------------------------
  121. void __fastcall TForm1::RichView1Jump(TObject *Sender, int id)
  122. {
  123.   TCustomRVFormattedData* RVData;
  124.   int ItemNo;
  125.   RichView1->GetJumpPointLocation(id, RVData, ItemNo);
  126.   StatusBar1->SimpleText = (char*)RVData->GetItemTag(ItemNo);
  127.   Application->MessageBox(StatusBar1->SimpleText.c_str(),"Click", 0);
  128. }
  129. //=========================== SAVING TO HTML ==================================
  130. void __fastcall TForm1::Button2Click(TObject *Sender)
  131. {
  132.   TRVSaveOptions SaveOptions = TRVSaveOptions();
  133.   bool r;
  134.   if (SaveDialog1->Execute())
  135.   {
  136.     Screen->Cursor = crHourGlass;
  137.     if (CheckBox1->Checked)
  138.       SaveOptions << rvsoOverrideImages;
  139.     else
  140.       SaveOptions >> rvsoOverrideImages;
  141.     switch (SaveDialog1->FilterIndex)
  142.     {
  143.       case 1:
  144.         r = RichView1->SaveHTML(SaveDialog1->FileName,"Demo File",Edit2->Text, SaveOptions);
  145.         break;
  146.       case 2:
  147.         r = RichView1->SaveHTMLEx(SaveDialog1->FileName,"Demo File",Edit1->Text,
  148.                                       "","","",SaveOptions);
  149.         break;
  150.       default:
  151.         r = false;
  152.     }
  153.     Screen->Cursor = crDefault;
  154.     if (!r)
  155.       Application->MessageBox("Error during saving", "Error", MB_OK);
  156.   }
  157. }
  158. //---------------------------------------------------------------------------
  159. // Event: overriding default saving of images - saving as Gifs
  160. void __fastcall TForm1::RichView1HTMLSaveImage(TCustomRichView *Sender,
  161.     TCustomRVData *RVData, int ItemNo, const AnsiString Path,
  162.     TColor BackgroundColor, AnsiString &Location, bool &DoDefault)
  163. {
  164.   TRVVAlign AVAlign;
  165.   int ATag;
  166.   TCustomImageList* ImageList;
  167.   int ImageIndex;
  168.   AnsiString s;
  169.   TGraphic* gr;
  170.   // Parameters:
  171.   // Saving item is defined by pair (RVData, ItemNo).
  172.   // It is the ItemNo-th item in RVData object.
  173.   // RVData may be RichView.RVData, or cell, or RVData of cell inplace editor.
  174.   // Path - destination directory of HTML file.
  175.   // BackgroundColor - color of background under this item. Not used here
  176.   // because GIFs support true transparency.
  177.   // Location - output parameter to specify filename of image file
  178.   // DoDefault - set to false if you save this item as image yourself.
  179.   if (ItemNo<0)
  180.   {
  181.     // saving background
  182.      TGIFImage* gif = new TGIFImage;
  183.      try
  184.      {
  185.        gif->ColorReduction = rmQuantize;
  186.        if (RVData->InheritsFrom(__classid(TRVTableCellData)))
  187.          gif->Assign(((TRVTableCellData*)RVData)->BackgroundImage);
  188.        else
  189.          gif->Assign(Sender->BackgroundBitmap);
  190.        Location = RVData->GetNextFileName(Edit2->Text, Path, ".gif",
  191.          RichView1->imgSaveNo, CheckBox1->Checked);
  192.        gif->SaveToFile(Location);
  193.        Location = ExtractRelativePath(Path, Location);
  194.        DoDefault = false;
  195.      }
  196.      catch(...)
  197.      {
  198.      }
  199.      delete gif;
  200.      return;
  201.   }
  202.   TGIFImage* gif = NULL;
  203.   switch (RVData->GetItemStyle(ItemNo))
  204.   {
  205.     case rvsPicture:
  206.     case rvsHotPicture:
  207.     {
  208.       // Assigning image to GIF and saving
  209.       // (metafiles and icons will be saved with transparency)
  210.       gif = new TGIFImage;
  211.       gif->ColorReduction = rmQuantize;
  212.       RVData->GetPictureInfo(ItemNo, s, gr, AVAlign, ATag);
  213.       gif->Assign(gr);
  214.       Location = RVData->GetNextFileName(Edit2->Text, Path, ".gif", RichView1->imgSaveNo, CheckBox1->Checked);
  215.       break;
  216.     }
  217.     case rvsTable:
  218.     {
  219.       gif = new TGIFImage;
  220.       gif->ColorReduction = rmQuantize;
  221.       TRVTableItemInfo * table = (TRVTableItemInfo*)(RVData->GetItem(ItemNo));
  222.       gif->Assign(table->BackgroundImage);
  223.       Location = RVData->GetNextFileName(Edit2->Text, Path, ".gif", RichView1->imgSaveNo, CheckBox1->Checked);
  224.       break;
  225.     }
  226.     case rvsBullet:
  227.     case rvsHotspot:
  228.     {
  229.       // This is not an efficient way, because the same image will be
  230.       // saved many times. In your application you can save bullets
  231.       // before saving HTMLs, and here only return file name.
  232.       RVData->GetBulletInfo(ItemNo, s, ImageIndex, ImageList, ATag);
  233.       TMetafile* wmf = new TMetafile;
  234.       try
  235.       {
  236.         gif = new TGIFImage;
  237.         gif->ColorReduction = rmQuantize;
  238.         // Drawing image from imagelist to metafile
  239.         // This method allows to save transparency
  240.         wmf->Width  = ((TImageList*)ImageList)->Width;
  241.         wmf->Height = ((TImageList*)ImageList)->Height;
  242.         TCanvas * Canvas = CreateMetafileCanvas(wmf); // workaround for C++Builder 5 problem
  243.         ImageList->Draw(Canvas,0,0, ImageIndex
  244. #if __BORLANDC__>0x0530
  245.         , true // if not C++Builder 3 (this demo does not support C++Builder 1)
  246. #endif
  247.         );
  248.         delete Canvas;
  249.         // Assigning metafile to GIF and saving
  250.         gif->Assign(wmf);
  251.         // Saving to Path + Bullets Prefix + ImageIndex + .gif
  252.         Location = Format("%s%s%d.gif", ARRAYOFCONST((Path, Edit1->Text, ImageIndex)));
  253.       }
  254.       catch(...)
  255.       {
  256.       }
  257.       delete wmf;
  258.       break;
  259.     }
  260.   }
  261.   if (gif)
  262.   {
  263.     gif->SaveToFile(Location);
  264.     Location = ExtractRelativePath(Path, Location);
  265.     DoDefault = false;
  266.     delete gif;
  267.   }
  268. }
  269. //---------------------------------------------------------------------------
  270. // Event: saving hyperlinks
  271. void __fastcall TForm1::RichView1WriteHyperlink(TCustomRichView *Sender,
  272.       int id, TCustomRVData *RVData, int ItemNo, TRVSaveFormat SaveFormat,
  273.       AnsiString &Target, AnsiString &Extras)
  274. {
  275.   Target = (char*)(RVData->GetItemTag(ItemNo));
  276. }
  277. //---------------------------------------------------------------------------
  278. // Event: saving components
  279. void __fastcall TForm1::RichView1SaveComponentToFile(
  280.       TCustomRichView *Sender, AnsiString Path, TPersistent *SaveMe,
  281.       TRVSaveFormat SaveFormat, AnsiString &OutStr)
  282. {
  283.   switch (SaveFormat)
  284.   {
  285.     case rvsfHTML:
  286.     {
  287.       if (SaveMe->InheritsFrom(__classid(TButton)))
  288.       {
  289.         OutStr = "<INPUT type="button" value=""+((TButton*)SaveMe)->Caption+"" "+
  290.           "onClick="alert('Just a demo')">";
  291.         return;
  292.       }
  293.       if (SaveMe->InheritsFrom(__classid(TEdit)))
  294.       {
  295.         OutStr = "<INPUT type="text" value=""+((TEdit*)SaveMe)->Text+"">";
  296.         return;
  297.       }
  298.       break;
  299.     }
  300.   }
  301. }
  302. //---------------------------------------------------------------------------
  303. // Event: saving additional information
  304. void __fastcall TForm1::RichView1SaveHTMLExtra(TCustomRichView *Sender,
  305.       TRVHTMLSaveArea Area, bool CSSVersion, AnsiString &HTMLCode)
  306. {
  307.   switch (Area)
  308.   {
  309.     case rv_thms_Head:       HTMLCode = "<script></script>";       break;     case rv_thms_BodyAttribute:       HTMLCode = "alink=#ff0000";       break;     case rv_thms_Body:       HTMLCode = "This document was generated by "         "<A href="http://www.trichview.com">RichView</A><BR>";       break;   }
  310. }
  311. //---------------------------------------------------------------------------