Avatar billede mathiash Nybegynder
22. november 2005 - 16:31 Der er 8 kommentarer og
1 løsning

Udskrive til printer

Hej!

Jeg er igang med et system hvor jeg har brug for at kunne skrive noget information ud.

Hvordan kan det lade sig gøre?

Jeg koder ren api, bruger ikke mfc. Min compiler er Visual C++ .net

// Mathias Hansen
Avatar billede mathiash Nybegynder
22. november 2005 - 18:11 #2
Jeg syntes at det er en smule forvirrende.. Kan jeg ikke få et eksempel på at udskrive teksten: "hej verden" incl. en printer dialog (så man selv kan vælge printer)
Avatar billede bertelbrander Novice
22. november 2005 - 19:45 #3
Avatar billede driis Nybegynder
22. november 2005 - 19:53 #4
At printe i Win API er ikke simpelt. Derfor linket, hvis du vil programmere i Win32 API, er du nødt til at vænne dig til at læse den slags dokumentation.

Men, at printe kan gøres på følgende måde:
1) Brug PrintDlgEx til at vise en print-dialog. Herfra får du senere printerens device-context (DC).
2) Start et printjob med StartDoc
3) Start en side med StartPage
4) Brug GDI funktioner til at tegne og skrive på printerens device-context.
5) Kald EndPage for at afslutte siden, gentag 3 - 5 for hver side
6) Kald EndDoc

Her har jeg så ikke taget højde for skalering i forhold til printerens opløsning, fonte, og masser af andre ting. Det simpleste eksempel på det må være noget i retning af:
Avatar billede driis Nybegynder
22. november 2005 - 19:53 #5
#include <windows.h>
#include <stdio.h>
#define MSG TEXT("Hello, world")

int main()
{
    HWND hWnd = GetDesktopWindow();
    PRINTDLGEX printdialog = {0};
    PRINTPAGERANGE pageRange = {0};
    //  Initialize the PRINTDLGEX structure.
    printdialog.lStructSize = sizeof(PRINTDLGEX);
    printdialog.hwndOwner = hWnd;
    printdialog.Flags = PD_RETURNDC | PD_COLLATE;
    printdialog.nMaxPageRanges = 1;
    printdialog.lpPageRanges = &pageRange;
    printdialog.nMinPage = 1;
    printdialog.nMaxPage = 1000;
    printdialog.nCopies = 1;   
    printdialog.nStartPage = START_PAGE_GENERAL;
    HRESULT result = PrintDlgEx(&printdialog);
    if ( S_OK == result && printdialog.dwResultAction == PD_RESULT_PRINT )
    {
        // user wants to print
        printf("Printing ...\n");
        DOCINFO doc = {0};
        doc.cbSize = sizeof(DOCINFO);       
        doc.lpszDocName = MSG;
        if ( StartDoc(printdialog.hDC,&doc) )
        {
            StartPage(printdialog.hDC);
            TextOut(printdialog.hDC,100,100,MSG,wcslen(MSG));
            EndPage(printdialog.hDC);
            EndDoc(printdialog.hDC);
        }
    }
}
Avatar billede driis Nybegynder
22. november 2005 - 19:54 #6
(jeg havde i øvrigt ikke set bertel's kommentar i mellemtiden)
Avatar billede mathiash Nybegynder
22. november 2005 - 20:31 #7
Perfekt!

Jeg brugte bertelbranders eksempel da jeg nemt kunne implentere det i mit projekt, jeg syntes dog i begge skal have points for de gode svar.

bertelbrander lægger du et svar?
Avatar billede bertelbrander Novice
22. november 2005 - 21:02 #8
Jeg samler ikke på point.
Avatar billede mathiash Nybegynder
23. november 2005 - 14:32 #9
Okay.. Tusind tak :) Det fungerer perfekt.
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