Megosztás a következőn keresztül:


Többoldalos dokumentumok

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

Ez a cikk a Windows nyomtatási protokollt ismerteti, és ismerteti, hogyan nyomtathat egynél több oldalt tartalmazó dokumentumokat. A cikk a következő témaköröket ismerteti:

A nyomtatási protokoll

Többoldalos dokumentum nyomtatásához a keretrendszer és a nézet az alábbi módon kommunikál. Először a keretrendszer megjeleníti a Nyomtatás párbeszédpanelt, létrehoz egy eszközkörnyezetet a nyomtatóhoz, és meghívja a CDC-objektumStartDoc tagfüggvényét. Ezután a keretrendszer a dokumentum minden oldalához meghívja az objektum StartPage tagfüggvényét CDC , utasítja a nézetobjektumot a lap nyomtatására, és meghívja az EndPage tagfüggvényt. Ha egy adott oldal indítása előtt módosítani kell a nyomtató módot, a nézet a ResetDC-t hívja meg, amely frissíti az új nyomtatómód adatait tartalmazó DEVMODE-struktúrát . A teljes dokumentum kinyomtatásakor a keretrendszer meghívja az EndDoc tagfüggvényt.

Nézetosztály függvények felülírása

A CView osztály több tagfüggvényt határoz meg, amelyeket a keretrendszer a nyomtatás során hív meg. A nézetosztályában ezeknek a függvényeknek a felülbírálásával tudja megteremteni a kapcsolatot a keretrendszer és a saját nézetosztályának nyomtatási logikája között. Az alábbi táblázat felsorolja ezeket a tagfüggvényeket.

A CView felülírható függvényei nyomtatáshoz

Név A felülírás oka
OnPreparePrinting Értékek beszúrása a Nyomtatás párbeszédpanelre, különösen a dokumentum hossza
OnBeginPrinting Betűtípusok vagy más GDI-erőforrások kiosztása
OnPrepareDC Az eszközkörnyezet attribútumainak módosítása egy adott oldalhoz, vagy nyomtatási idő lapozása
OnPrint Adott oldal nyomtatása
Nyomtatás végén GDI-erőforrások felszabadítása

Más függvényekben is végezhet nyomtatással kapcsolatos feldolgozást, de ezek a függvények hajtják a nyomtatási folyamatot.

Az alábbi ábra a nyomtatási folyamat lépéseit mutatja be, és bemutatja, hogy a rendszer hol hívja meg az egyes CViewnyomtatási tagfüggvényeket. A cikk további része részletesebben ismerteti a lépések többségét. A nyomtatási folyamat további részeit a GDI-erőforrások kiosztásáról szóló cikk ismerteti.

Nyomtatási ciklus folyamata.
A nyomtatási ciklus

Oldalszámozás

A keretrendszer sok információt tárol egy nyomtatási feladatról egy CPrintInfo-struktúrában . A lapozással kapcsolatos értékek CPrintInfo közül több is elérhető. Ezek az értékek az alábbi táblázatban látható módon érhetők el.

A CPrintInfo-ban tárolt oldalszámadatok

Tagváltozó vagy

függvény neve(i)
Hivatkozott oldalszám
GetMinPage/SetMinPage A dokumentum első oldala
GetMaxPage/SetMaxPage Dokumentum utolsó oldala
GetFromPage Első nyomtatandó oldal
GetToPage Utolsó nyomtatandó oldal
m_nCurPage A lap nyomtatása folyamatban van

Az oldalszámok 1-nél kezdődnek, vagyis az első oldal számozása 1, nem pedig 0. Ezekről és a CPrintInfo más tagjairól további információt az MFC-referencia tartalmaz.

A nyomtatási folyamat elején a keretrendszer meghívja a nézet OnPreparePrinting tagfüggvényét, és egy mutatót ad át egy CPrintInfo struktúrának. Az Alkalmazásvarázsló megvalósítja a OnPreparePrinting-ot, amely meghívja a DoPreparePrinting-et, a(z) CView egy másik tagfüggvényét. DoPreparePrinting az a függvény, amely megjeleníti a Nyomtatás párbeszédpanelt, és létrehoz egy nyomtatóeszköz-környezetet.

Ezen a ponton az alkalmazás nem tudja, hány oldal van a dokumentumban. Az alapértelmezett 1 és 0xFFFF értékeket használja a dokumentum első és utolsó oldalának számához. Ha tudja, hogy hány oldala van a dokumentumnak, felülbírálja OnPreparePrinting, és hívja meg a [SetMaxPage]--brokenlink--(reference/cprintinfo-class.md#setmaxpage) parancsot a CPrintInfo struktúrára, mielőtt elküldené azt DoPreparePrinting. Ezzel megadhatja a dokumentum hosszát.

DoPreparePrinting ekkor megjelenik a Nyomtatás párbeszédpanel. Visszatéréskor a CPrintInfo struktúra a felhasználó által megadott értékeket tartalmazza. Ha a felhasználó csak egy kijelölt oldaltartományt szeretne kinyomtatni, a Nyomtatás párbeszédpanelen megadhatja a kezdő és a befejező oldal számát. A keretrendszer ezeket az értékeket a GetFromPage és GetToPage a függvények használatával kéri le. Ha a felhasználó nem ad meg oldaltartományt, a keretrendszer meghívja GetMinPage és GetMaxPage a visszaadott értékekkel kinyomtatja a teljes dokumentumot.

A nyomtatandó dokumentum minden oldalához a keretrendszer meghívja a nézetosztály két tagfüggvényét, az OnPrepareDC-t és az OnPrintet, és két paramétert ad át az egyes függvényeknek: egy CDC-objektumra mutató mutatót és egy CPrintInfo szerkezetre mutató mutatót. Minden alkalommal, amikor a keretrendszer meghívja OnPrepareDC, és OnPrint, egy másik értéket ad át a struktúra CPrintInfo tagjában. Így a keretrendszer értesíti a nézetet, hogy melyik oldalt kell kinyomtatni.

Az OnPrepareDC tagfüggvény képernyőmegjelenítésre is használható. A rajz végrehajtása előtt módosítja az eszközkörnyezetet. OnPrepareDC hasonló szerepet tölt be a nyomtatásban, de van néhány különbség: először az CDC objektum egy nyomtatóeszköz-környezetet jelöl képernyőeszköz-környezet helyett, másodszor pedig egy CPrintInfo objektumot ad át második paraméterként. Ez a paraméter null értéket kap, amikor a OnPrepareDC a képernyő megjelenítésére van hívva. A OnPrepareDC felülbírálása, hogy módosítsa az eszközkörnyezetet a nyomtatandó oldal alapján. Áthelyezheti például a nézetport forrását és a kivágási régiót, hogy a dokumentum megfelelő része nyomtatásban legyen.

Az OnPrint tagfüggvény elvégzi a lap tényleges nyomtatását. Az alapértelmezett nyomtatás végrehajtása című cikk bemutatja, hogy a keretrendszer hogyan hívja meg az OnDraw-t nyomtatóeszköz-környezettel a nyomtatás elvégzéséhez. A keretrendszer pontosabban OnPrint hív meg egy CPrintInfo struktúrával és egy eszközkörnyezettel, és OnPrint továbbadja az eszközkörnyezetet OnDraw-nek. Az OnPrint elemet felül kell bírálni minden olyan renderelés érdekében, amelyet csak nyomtatáskor, és nem a képernyőn történő megjelenítéshez kell végrehajtani. Például élőfejek vagy élőlábak nyomtatására (további információ a Élőfejek és élőlábak című cikkben található). Ezután a OnDraw felülbírálásából hívja meg a OnPrint-t, hogy végezze el a képernyő megjelenítés és a nyomtatás közös renderelését.

Az a tény, hogy OnDraw a képernyőn való megjelenítéshez és nyomtatáshoz is végez renderelést, azt jelenti, hogy az alkalmazás WYSIWYG: "Amit lát, azt kap." De tegyük fel, hogy nem WYSIWYG-alkalmazást ír. Vegyük például azt a szövegszerkesztőt, amely félkövér betűtípust használ a nyomtatáshoz, de vezérlőkódokat jelenít meg, amelyek félkövér szöveget jeleznek a képernyőn. Ilyen esetben szigorúan képernyőmegjelenítésre használja OnDraw . Amikor felülbírálja OnPrint, cserélje le a OnDraw hívást egy külön rajzoló függvény hívására. Ez a függvény a papíron megjelenő módon rajzolja meg a dokumentumot a képernyőn nem látható attribútumok használatával.

Nyomtatólapok és dokumentumlapok

Ha oldalszámokra hivatkozik, néha meg kell különböztetni a nyomtató oldalfogalmát és a dokumentum oldalfogalmát. A nyomtató szempontjából egy lap egy papírlap. Egy papírlap azonban nem feltétlenül egyenlő a dokumentum egy oldalával. Ha például hírlevelet nyomtat, ahol a lapokat össze kell hajtani, egy papírlap egymás mellett a dokumentum első és utolsó lapját is tartalmazhatja. Hasonlóképpen, ha számolótáblát nyomtat, a dokumentum egyáltalán nem lapokból áll. Ehelyett egy papírlap 1–20 sort, 6–10 oszlopot tartalmazhat.

A CPrintInfo struktúra minden oldalszáma a nyomtatóoldalakra hivatkozik. A keretrendszer meghívja OnPrepareDC és OnPrint egyszer minden papírlapra, amely áthalad a nyomtatón. Ha felülbírálja az OnPreparePrinting függvényt a dokumentum hosszának meghatározásához, a nyomtató oldalak használata szükséges. Ha van egy-az-egyhez levelezés (vagyis egy nyomtatólap egy dokumentumoldallal egyenlő), akkor ez egyszerű. Ha viszont a dokumentumoldalak és nyomtatólapok nem egyeznek meg közvetlenül, akkor fordítást kell végeznie közöttük. Fontolja meg például a számolótábla nyomtatását. Amikor felülbírálja OnPreparePrinting, ki kell számítania, hogy hány papírlapra lesz szükség a teljes számolótábla nyomtatásához, majd ezt az értéket kell használnia, amikor meghívja a SetMaxPage tagfüggvényét a CPrintInfo-nak/-nek. Hasonlóképpen, ha felülír OnPrepareDC, akkor a m_nCurPage-t az adott lapon megjelenő sorok és oszlopok tartományára kell átalakítania, majd ennek megfelelően kell módosítania a nézetablak kezdőpontját.

Print-Time lapozás

Bizonyos esetekben előfordulhat, hogy a nézetosztály nem tudja előre, milyen hosszú a dokumentum, amíg ténylegesen ki nem nyomtatják. Tegyük fel például, hogy az alkalmazás nem WYSIWYG, így a dokumentum hossza a képernyőn nem felel meg a nyomtatáskor használt hosszának.

Ez problémát okoz, ha felülbírálja a nézetosztály OnPreparePrinting funkcióját: nem adhat át értéket a SetMaxPageCPrintInfo-struktúra függvényének, mert nem tudja a dokumentum hosszát. Ha a felhasználó nem ad meg oldalszámot a Nyomtatás párbeszédpanelen, a keretrendszer nem tudja, mikor állítsa le a nyomtatási ciklust. A nyomtatási ciklus leállításának egyetlen módja, ha kinyomtatja a dokumentumot, és láthatja, hogy mikor ér véget. A nézetosztálynak ellenőriznie kell a dokumentum végét a nyomtatás során, majd tájékoztatnia kell a keretrendszert a befejezésről.

A keretrendszer a nézetosztály OnPrepareDC függvényére támaszkodik, hogy megmondja, mikor kell leállítani. Minden egyes OnPrepareDC hívás után a keretrendszer ellenőrzi a CPrintInfo struktúra, m_bContinuePrinting nevű, egy tagját. Az alapértelmezett értéke IGAZ. Amíg így marad, a keretrendszer folytatja a nyomtatási ciklust. Ha HAMIS értékre van állítva, a keretrendszer leáll. A nyomtatási idő lapozásának végrehajtásához felülbírálással OnPrepareDC ellenőrizze, hogy elérte-e a dokumentum végét, és állítsa a m_bContinuePrintingHAMIS értékre, amikor az megtörtént.

Az alapértelmezett implementáció OnPrepareDCm_bContinuePrinting-t HAMIS-ra állítja, ha az aktuális oldal nagyobb, mint 1. Ez azt jelenti, hogy ha a dokumentum hossza nem lett megadva, a keretrendszer feltételezi, hogy a dokumentum egy oldal hosszú. Ennek egyik következménye, hogy óvatosnak kell lennie, ha az alaposztály verzióját OnPrepareDChívja meg. Ne feltételezze, hogy a m_bContinuePrintingigaz lesz az alaposztály verziójának meghívása után.

Mit szeretne többet megtudni

Lásd még

Nyomtatás
CView osztály
CDC-osztály