Avatar billede simonkofod Nybegynder
13. november 2001 - 14:55 Der 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?
Avatar billede jpk Nybegynder
13. november 2001 - 15:27 #1
Du skriver jo ikke tekstbaserede linier til et DC, men \'tegner\' derimod teksten!
Altså, nej, det er der ikke...

Du skal selv styre hvor der skal skrives på dit dc, CPrintInfo indeholder den aktuelle side der skal uskrives i attributten m_nCurPage

Avatar billede jpk Nybegynder
13. november 2001 - 15:28 #2
Er det ren tekst der skal udskrives eller også grafik?
Avatar billede alvion Nybegynder
13. november 2001 - 16:47 #3
Du skal bruge funktionen DrawText af to omgange.

Først kalder du den således:

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:

DrawText(hdc, str, strlen(str), &rect, DT_WORDBREAK);

Hvor str indeholder den \"klippede\" tekst og rect indeholder papirets koordinater både bredde og højre.

Den resterende tekst, der ikke er skrevet ud, skal nu skrives på næste side efter samme mønster.
Avatar billede simonkofod Nybegynder
13. november 2001 - 18:28 #4
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?

Avatar billede alvion Nybegynder
13. november 2001 - 19:42 #5
Nej det skal du selv klare med StartPage() og EndPage(). Du kan se et basalt print eksempel her:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcemfc/htm/cdc_89.asp

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.
Avatar billede jpk Nybegynder
14. november 2001 - 09:44 #6
=> 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.

void CClientCardView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
    CView::OnPrepareDC(pDC, pInfo);

    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...

Avatar billede alvion Nybegynder
14. november 2001 - 09:50 #7
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?
Avatar billede jpk Nybegynder
14. november 2001 - 10:15 #8
=> 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...

Avatar billede alvion Nybegynder
14. november 2001 - 10:22 #9
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)
Avatar billede jpk Nybegynder
14. november 2001 - 10:33 #10
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!

Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester