13. november 2001 - 14:55Der er
9 kommentarer og 1 løsning
Sideskift ved udskrift?
I mit SDI projekt har jeg en lang række
pDC->TextOut(0,linje,string)
Problemet er, at når jeg vil udskrive, så bliver der ikke skiftet side automatisk. Er der en funktion (f.eks. til CDC eller CPrintInfo), som opretter et sideskift?
int height = DrawText(hdc, str, strlen(str), &rect, DT_WORDBREAK, DT_CALCRECT);
rect skal indeholde left og right værdier for hvor bred siden er. top skal være 0. Så beregner DrawText højden af din tekst (enten returneres den eller også skrives den direkte i rect, det kan jeg ikke huske). Funktionen skriver IKKE noget ud, den beregner kun.
Hvis højden er for stor i forhold til siden, gør du din streng mindre og gentager proceduren. Dette skal foregå i et loop.
Så snart højden er i orden, kalder du funktionen således:
Til jpk: Der skal også udskrives grafik. Dvs. Der skal udskrives grafik på den ene side, og tekst på den anden. Jeg er med på at teksten tegnes, og jeg har prøvet at sætte m_nCurPage til f.eks. 2, men det skifter ikke side...
Til alvion: Jeg kender ikke DrawText, men jeg prøver. Du skriver \"Den resterende tekst,...,skal nu udskrives på næste side efter samme mønster.\" Finder programmet selv ud af at skifte side?
DrawText er smartere end TextOut, idet du ikke blot angiver (x,y) koordinater men et helt rektangel, hvori der skal \"tegnes\" tekst. Dermed kan funktionen også selv finde ud af at wordwrappe teksten for dig.
=> alvion Såvidt jeg husker virker wordwrapping ikke med CDC::DrawText ved udskrift til et metafile dc... Måske du kan huske det?
=>simonkofod Der er flere fremgangsmåder du kan anvende:
Du kan fx vælge at override CView::OnPrepareDC Her kan du sætte viewporten for dc\'et, altså, som her, sætte koordinatsættets begyndelsespunkt efter hvad side der printes (pInfo->m_nCurPage). variablen m_nCurPage er ikke en du skal sætte, men aflæse. Den fortæller dig nemlig hvilken side der printes nu. Prøv at se på understående kode. Koordinatsystemet sættes til at begynde det sted hvor den aktuelle side begynder i dc\'et.
if(pDC->IsPrinting()) { int y = (pInfo->m_nCurPage - 1) * pDC->GetDeviceCaps(VERTRES); pDC->SetViewportOrg(0, -y); } }
Du kan også override CView::OnPrint og her aflæse hvilken side der printes (igen pInfo->m_nCurPage) og hvis det er side 1, udskrive grafikken, hvis den er 2, udskrive teksten...
jpk -> Hurmpf... Det ved jeg sgu ikke. :-) Jeg ville umiddelbart tro, at DrawText opfører sig ens overfor alle devices. Hvem siger i øvrigt, at det er en metafile?
=> alvion Jeg ved godt at det i dette tilfælde ikke drejer sig om en metafile dc, det var mere til eget brug. Det kunne jo være du vidste det...
Men nej, jeg mener absolut ikke at DrawText opfører sig ens på alle devices, fx har et printer dc jo en række attributter som fx max-opløsning og sidebredde, hvilket et metafile-dc pr definition ikke har. Disse vil skulle hentes fx fra et skærm/printer-dc...
Metafiler har vel også en max. bredde/højde. Er det ikke efter koordinatsystemet x [-1,1] og y [-1,1] ? (Jeg har ikke selv arbejdet med metafiler, kun læst om dem)
Nej, metafiler indeholder blot en serie GDI-kommandoer, som ikke er afskærmet i størrelse. Fx er: MoveTo(-10000, -20000); LineTo(10000, 20000); Fyldt gyldige i den forstand at de ikke klippes efter en fysisk begrænsning som fx en printers horizontale eller vertikale opløsning i pixels!
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.