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

RichEdit

开发平台:

Delphi

  1. /*=============================================================================}
  2. { RichView Printing Demo.                                                      }
  3. {------------------------------------------------------------------------------}
  4. { Note:                                                                        }
  5. { This demo does not show how to create user interface to setup margins.       }
  6. {------------------------------------------------------------------------------}
  7. { Note:                                                                        }
  8. { This demo does not show how to implement custom scaling of print preview.    }
  9. { Look at example of  RichViewEdit based editor.                               }
  10. {=============================================================================*/
  11. #include <vclvcl.h>
  12. #pragma hdrstop
  13. #include "Unit1.h"
  14. //---------------------------------------------------------------------------
  15. #pragma link "RichView"
  16. #pragma link "RVScroll"
  17. #pragma link "RVPP"
  18. #pragma link "CRVPP"
  19. #pragma link "RVStyle"
  20. #pragma link "PtblRV"
  21. #pragma link "CtrlImg"
  22. #pragma resource "*.dfm"
  23. TForm1 *Form1;
  24. //---------------------------------------------------------------------------
  25. __fastcall TForm1::TForm1(TComponent* Owner)
  26.     : TForm(Owner)
  27. {
  28. const char* longtext = "A simple way of describing Delphi is a sophisticated Pascal compiler."
  29.                " Delphi抯 roots lie in Borland抯 Turbo Pascal, introduced in the mid-1980s."
  30.                " This view of Delphi, however, doesn抰 capture the real power of Delphi."
  31.                " Object Pascal, the object-oriented extensions to Pascal, is the underlying"
  32.                " language of Delphi. The Visual Component Library, or VCL, is a hierarchy of "
  33.                "Object Pascal objects that allow you to design programs. A better way of describing "
  34.                "Delphi is an Object Pascal-based visual development environment.n"
  35.                "The VCL is intimately tied to the Delphi IDE, and is what gives you the ability "
  36.                "to quickly develop applications. The Component palette and Object Inspector allow "
  37.                "you to drop VCL components on forms and then manipulate the properties and events of "
  38.                "those controls without having to write a single line of code.n"
  39.                "Despite its name, the VCL is not entirely made up of visual components. "
  40.                "In fact, of the over 600 objects in the VCL, most are not visual. "
  41.                "The Delphi IDE allows you to visually add some nonvisual components to "
  42.                "your programs. For example, if you wanted to write a database application "
  43.                "that connected to a table, you would drop a TDataSource component on your "
  44.                "form. TDataSource is a nonvisual component, but is represented on the form by "
  45.                "an icon (which doesn抰 show up at runtime), and you can manipulate the properties "
  46.                "and events of TDataSource in the Object Inspector just as you would a visual control.n"
  47.                "All VCL objects, and in fact all objects in Object Pascal, are derived from TObject. "
  48.                "TObject is unique in that it is an abstract object that has no properties or events, "
  49.                "only methods that allow you to derive objects from this base class. Use TObject as the "
  50.                "immediate base class when writing simple objects that are not components. Components are "
  51.                "objects that you can manipulate at design time. All components in the VCL are derived "
  52.                "from the abstract component type TComponent. The VCL components you will likely use the "
  53.                "most are the VCL抯 controls, such as TForm or TSpeedButton. Controls are visual components"
  54.                " derived from the abstract component type TControl.n"
  55.                "You can use Delphi to create Object Pascal objects without using the VCL, "
  56.                "although by creating any objects in Object Pascal, both your objects and VCL "
  57.                "objects will share a common ancestor in TObject. However, by deriving new objects "
  58.                "from VCL object, much of the work in designing applications is done for you by Delphi. "
  59.                "For example, if you wanted to use a progress bar in your application but didn抰 like "
  60.                "TProgressBar, Delphi抯 control that creates a progress bar, you could create a new "
  61.                "object based on TProgressBar and override its properties, events, or methods.";
  62.   // Creating sample document
  63.   RichView1->AddNL("Printing Demo",1,2);
  64.   RichView1->AddTextNL(longtext,0,0,0);
  65.   RichView1->AddBreak();
  66.   RichView1->AddTextNL(longtext,0,1,1);
  67.   RichView1->AddBreak();
  68.   RichView1->AddTextNL(longtext,0,2,2);
  69.   RichView1->AddBreak();
  70.   RichView1->AddTextNL(longtext,0,3,3);
  71.   RichView1->AddBreak();
  72.   RichView1->AddTextNL(longtext,0,4,4);
  73.   RichView1->AddBreak();
  74.   RichView1->AddTextNL(longtext,0,5,5);
  75.   RichView1->AddBreak();
  76.   RichView1->AddTextNL(longtext,0,7,7);
  77.   RichView1->AddControlEx("", Panel2, 2, rvvaBaseline);
  78.   TGraphic * gr = new TIcon;
  79.   gr->Assign(Image1->Picture);
  80.   RichView1->AddPictureEx("", gr, -1,  rvvaBaseline);
  81.   gr = new TMetafile;
  82.   gr->Assign(Image2->Picture);
  83.   RichView1->AddPictureEx("", gr, -1,  rvvaBaseline);
  84.   // Created...
  85.   RichView1->Format();
  86.   // Assigning margins: 20 mm.
  87.   RVPrint1->LeftMarginMM   = 20;
  88.   RVPrint1->RightMarginMM  = 20;
  89.   RVPrint1->BottomMarginMM = 20;
  90.   // Top margin: 25 mm.
  91.   RVPrint1->TopMarginMM    = 25;
  92.   // Making printable area on preview visible...
  93.   RVPrintPreview1->MarginsPen->Style = psDot;
  94.   // Assigning OnPrintComponent at run time - there is a problem specifying Graphics::TBitmap
  95.   // in event handlers
  96.   RVPrint1->OnPrintComponent = RVPrint1PrintComponent;
  97. }
  98. //---------------------------------------------------------------------------
  99. // Switching page to "Preview"
  100. //---------------------------------------------------------------------------
  101. void __fastcall TForm1::PageControl1Change(TObject *Sender)
  102. {
  103.   if (PageControl1->ActivePage->PageIndex==1 && !PreviewCreated)
  104.   {
  105.     PreviewCreated = true;
  106.     UpdatePreview();
  107.   }
  108.   RVPrintPreview1->ZoomMode = rvzmFullPage;
  109. }
  110. //---------------------------------------------------------------------------
  111. void TForm1::UpdatePreview()
  112. {
  113.   Screen->Cursor = crHourGlass;
  114.   // Assigning document for printing:
  115.   RVPrint1->AssignSource(RichView1);
  116.   // Formatting pages:
  117.   RVPrint1->FormatPages(TRVDisplayOptions());
  118.   // Updating user interface for preview:
  119.   ScrollBar1->Min = 1;
  120.   ScrollBar1->Position = 1;
  121. #ifdef RICHVIEWDEF4
  122.   Scrollbar1.PageSize = 1;
  123. #endif
  124.   ScrollBar1->Max = RVPrint1->PagesCount;
  125.   // Preview will show full page:
  126.   RVPrintPreview1->ZoomMode = rvzmFullPage;
  127.   // Preview will show 1st page:
  128.   RVPrintPreview1->First();
  129.   Screen->Cursor = crDefault;
  130. }
  131. //---------------------------------------------------------------------------
  132. // Page turning:
  133. //---------------------------------------------------------------------------
  134. void __fastcall TForm1::ScrollBar1Change(TObject *Sender)
  135. {
  136.   if (ScrollBar1->Position>0)
  137.   {
  138.     RVPrintPreview1->PageNo = ScrollBar1->Position;
  139.     StatusBar1->SimpleText = Format("Page %d of %d",
  140.       ARRAYOFCONST((RVPrintPreview1->PageNo, RVPrint1->PagesCount)));
  141.   }
  142. }
  143. //---------------------------------------------------------------------------
  144. // Event: printing inserted components.
  145. // We need to create bitmap, draw component onto it,
  146. // and assign this bitmap to ComponentImage parameter.
  147. // Bitmap should have the same size as component. (if not, it will be scaled)
  148. // CtrlImg.pas from RichView package has useful function DrawControl.
  149. //---------------------------------------------------------------------------
  150. void __fastcall TForm1::RVPrint1PrintComponent(TCustomRVPrint *Sender,
  151.     TControl *PrintMe, Graphics::TBitmap *&ComponentImage)
  152. {
  153.   ComponentImage = DrawControl(PrintMe);
  154.   // actually, DrawControl is used by default. You need to process this
  155.   // event only if you are not satisfied with its results.
  156. }
  157. //---------------------------------------------------------------------------
  158. // Printing...
  159. //---------------------------------------------------------------------------
  160. void __fastcall TForm1::btnPrintClick(TObject *Sender)
  161. {
  162.   if (!PreviewCreated)
  163.   {
  164.     PreviewCreated = true;
  165.     UpdatePreview();
  166.   }
  167.   // do not print empty document!
  168.   if (RichView1->ItemCount==0)
  169.     return;
  170.   PrintDialog1->MinPage = 1;
  171.   PrintDialog1->MaxPage = RVPrint1->PagesCount;
  172.   PrintDialog1->FromPage = 1;
  173.   PrintDialog1->ToPage = RVPrint1->PagesCount;
  174.   // we can print a whole document or specified pages:
  175.   if (PrintDialog1->Execute())
  176.   {
  177.     // it's possible that current printer was changed.
  178.     // so we need to reformat document and update preview:
  179.     UpdatePreview();
  180.     switch (PrintDialog1->PrintRange)
  181.     {
  182.       case prAllPages:
  183.         RVPrint1->Print( "Test", PrintDialog1->Copies, PrintDialog1->Collate);
  184.         break;
  185.       case prPageNums:
  186.         RVPrint1->PrintPages(PrintDialog1->FromPage, PrintDialog1->ToPage,
  187.               "Test", PrintDialog1->Copies, PrintDialog1->Collate);
  188.     }
  189.   }
  190. }
  191. //---------------------------------------------------------------------------
  192. // Event: displaying formatting progress...
  193. //---------------------------------------------------------------------------
  194. void __fastcall TForm1::RVPrint1Formatting(TCustomRichView *Sender,
  195.     int PageCompleted, TRVPrintingStep Step)
  196. {
  197.   switch (Step)
  198.   {
  199.     case rvpsStarting:
  200.       StatusBar1->SimpleText = "Repaginating...";
  201.       break;
  202.     case rvpsProceeding:
  203.       StatusBar1->SimpleText = Format("Repaginating (%d)", ARRAYOFCONST((PageCompleted)));
  204.       break;
  205.     case rvpsFinished:
  206.       StatusBar1->SimpleText = "";
  207.   }
  208. }
  209. //---------------------------------------------------------------------------
  210. // Event: displaying printing (spooling) progress...
  211. //---------------------------------------------------------------------------
  212. void __fastcall TForm1::RVPrint1SendingToPrinter(TCustomRichView *Sender,
  213.     int PageCompleted, TRVPrintingStep Step)
  214. {
  215.   switch (Step)
  216.   {
  217.     case rvpsStarting:
  218.       StatusBar1->SimpleText = "Starting...";
  219.       break;
  220.     case rvpsProceeding:
  221.       StatusBar1->SimpleText = Format("Printing (%d)", ARRAYOFCONST((PageCompleted)));
  222.       break;
  223.     case rvpsFinished:
  224.       StatusBar1->SimpleText = "";
  225.   }
  226. }
  227. //---------------------------------------------------------------------------
  228. // Event: prepaint on page
  229. //---------------------------------------------------------------------------
  230. void __fastcall TForm1::RVPrint1PagePrepaint(TRVPrint *Sender, int PageNo,
  231.     TCanvas *Canvas, bool Preview, TRect &PageRect, TRect &PrintAreaRect)
  232. {
  233.   // This is a temporary solution for drawing page numbers and similalar stuff
  234.   // This example outputs string just above RichView contents
  235.   AnsiString s = Format ("-- Page %d of %d --", ARRAYOFCONST((PageNo, Sender->PagesCount)));
  236.   Canvas->Brush->Style = bsClear;
  237.   Canvas->Font->Assign(RVStyle1->TextStyles->Items[0]);
  238.   int w = Canvas->TextWidth(s);
  239.   int h = Canvas->TextHeight(s);
  240.   TextOut(Canvas->Handle, (PrintAreaRect.Right+PrintAreaRect.Left-w) / 2,
  241.           PrintAreaRect.Top - h - 10, s.c_str(), s.Length());
  242. }
  243. //---------------------------------------------------------------------------
  244. void __fastcall TForm1::Panel3Resize(TObject *Sender)
  245. {
  246.   // In earlier versions of C++Builder scrollbars do not have Align property...
  247.   // Aligning to the right side of panel
  248.   ScrollBar1->SetBounds(Panel3->ClientWidth-ScrollBar1->Width, 0,
  249.                        ScrollBar1->Width, Panel3->ClientHeight);
  250. }
  251. //---------------------------------------------------------------------------