Delphi - RichEdit formázott szöveg másolása egy Canvas-ra

forráskód letöltése
Formázott szöveg megjelenítésére a Delphi-ben csak a RichEdit komponens alkalmas. Ez megoldható persze úgy is, hogy egy Canvas-ra írunk ki formázott szöveget, de ez sokkal bonyolultabb megoldás, ráadásul egy esetleges módosítás is nagy munkával járhat. Ebben a példában azt vizsgáljuk meg, hogy egy RichEdit komponensben tárolt szöveget hogyan tudunk megjeleníteni egy TCanvas objektumban, ráadásul úgy, hogy megadjuk azt a területet, ahol a szövegnek meg kell jelennie, és a szöveg ennek a területnek megfelelően lesz tördelve.
Mivel a TPrinter objektumnál is egy TCanvas objektumban kell a nyomtatandó képet előállítanunk, így ez a megoldás nem csak a képernyőn történő megjelenítésre, hanem akár a szöveg nyomtatására is alkalmas.
A megoldáshoz egy új eljárást hozunk létre, amit egy külön unit-ban tárolunk el a könnyebb felhasználhatóság érdekében. Az eljárás a következőképpen néz ki:
RichEditToCanvas
Osztály:
procedure RichEditToCanvas(
ARichEdit: TRichEdit;
ACanvas: TCanvas;
ARect: TRect;
PixelsPerInch: integer
);
Ez az eljárás a paraméterként megadott RichEdit komponensben tárolt formázott szöveget átmásolja a szintén paraméterként megadott Canvas-ra.
Paraméterek
ARichEdit: TRichEdit
Ebben a paraméterben adhatjuk meg a szöveget tartalmazó RichEdit komponens objektumát.
ACanvas: TCanvas
Ebben a paraméterben kell megadni azt a Canvas objektumot, amire a szöveget rá kell rajzolni.
ARect: TRect
Ebben a TRect típusú paraméterben adhatjuk meg a Canvas azon területét, amelyen belül a szöveget meg szeretnénk jeleníteni. A szöveg a terület méretének megfelelően lesz tördelve attól függetlenül, hogy a RichEdit komponensben hogyan jelenik meg.
PixelsPerInch: integer
Ez a paraméter az egy inch-en belüli pontok számát adja meg (felbontás) az adott megjelenítési eszköznek megfelelően.
Most nézzük meg, hogy hogyan is működik a RichEditToCanvas eljárás. Először is létrehozunk egy olyan bitképet, amelynek mérete megegyezik az ARect paraméterben megadott terület méretével.
Szükség lesz egy TFormatRange típusú struktúrára is, amely a RichEdit unit-ban van deklarálva.
  _formatrange = record
    hdc: HDC;
    hdcTarget: HDC;
    rc: TRect;
    rcPage: TRect;
    chrg: TCharRange;
  end;
  TFormatRange = _formatrange;
A hdc mezőben a rendereléshez, a hdcTarget mezőben pedig a formázáshoz használt eszköz azonosítóját kell megadni. Ez a kettő általában megegyezik, annak a Canvas-nak a Handle azonosítóját adjuk meg, amelyen a szöveget meg szeretnénk jeleníteni.
Az rc mező TRect típusú, ebben adhatjuk meg twips mértékegységben (1/1440 inch vagy 1/20 nyomtató pont) a renderelt terület koordinátáit.
Az rcPage a rendereléshez használt terület. A koordinátákat szintén twips-ben kell megadni.
A chrg mezőben kell megadnunk a szövegnek azt a részét, amelyet meg szeretnénk jeleníteni. A chrg mező cpMin mezőjében az első, a cpMax mezőben pedig az utolsó karakter sorszámát kell megadni.
Ha feltöltöttük a struktúrát, akkor egy EM_FORMATRANGE üzenetet kell küldenünk a RichEdit-nek. Ezt a Perform függvénnyel tehetjük meg a legegyszerűbben:
ARichEdit.Perform(EM_FORMATRANGE, 1, integer(@fr));
Az első paraméter maga az üzenet. A második paraméter határozza meg, hogy a szöveg renderelésre kerül-e (<>0), vagy csak a méretek megállapítására használjuk (=0). Az utolsó paraméterben a struktúrára mutató pointert kell megadnunk.
Miután elküldtük az üzenetet, el kell küldenünk még egyszer, hogy a lefoglalt területeket (cache) felszabadítsuk. Ekkor a második és harmadik paraméterben adjunk meg 0-t.
ARichEdit.Perform(EM_FORMATRANGE, 0, 0);
Az üzenetek elküldése után a bitképünk Canvas-án megjelent a formázott szöveg, így most már csak át kell azt másolni a paraméterként megadott Canvas-ra az ARect paraméter által meghatározott pozícióba.