Annotation of mstools/samples/sdktools/porttool/ptprint.c, revision 1.1.1.1

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: #include "PortTool.h"
                     13: 
                     14: HWND   hCancelDlg = 0;
                     15: PRINTDLG       pdPrint;
                     16: 
                     17: /* get default printer configuration and save in hWnd extra bytes for use later */
                     18: BOOL WINAPI GetPrinterConfig (
                     19:     HWND    hWnd)
                     20: {
                     21:        // PRINTDLG     pdPrint;
                     22: 
                     23:     pdPrint.lStructSize = sizeof (PRINTDLG);
                     24:        pdPrint.Flags           = PD_RETURNDEFAULT;
                     25:        pdPrint.hwndOwner       = hWnd;
                     26:        pdPrint.hDevMode        = NULL;
                     27:        pdPrint.hDevNames       = NULL;
                     28:        pdPrint.hDC             = NULL;
                     29: 
                     30:        PrintDlg (&pdPrint);
                     31: 
                     32:        SetWindowLong (hWnd, WL_HPTRDEVNAMES, (LONG) pdPrint.hDevNames);
                     33: 
                     34:        return TRUE;
                     35: }
                     36: 
                     37: 
                     38: 
                     39: /* abort proc called by gdi during print download process */
                     40: int WINAPI AbortProc (
                     41:     HDC     hdc,
                     42:     int     nErr)
                     43: {
                     44:     BOOL    fContinue = TRUE;
                     45:     MSG     msg;
                     46: 
                     47:     /* process messages for cancel dialog and other apps */
                     48:     while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
                     49:        {
                     50:        if (msg.message == UM_CANCELPRINT)
                     51:            {
                     52:            fContinue = FALSE;
                     53:            break;
                     54:            }
                     55: 
                     56:        else if (!hCancelDlg || !IsDialogMessage (hCancelDlg, &msg))
                     57:            {
                     58:            TranslateMessage (&msg);
                     59:            DispatchMessage  (&msg);
                     60:            }
                     61:        }
                     62: 
                     63:     return fContinue;
                     64: }
                     65: 
                     66: 
                     67: 
                     68: 
                     69: BOOL WINAPI CancelDlgProc (
                     70:     HWND    hWnd,
                     71:     UINT    uMsg,
                     72:     UINT    uParam,
                     73:     LONG    lParam)
                     74: {
                     75: 
                     76:     switch (uMsg)
                     77:        {
                     78:        case WM_INITDIALOG:
                     79:            {
                     80:            char    *lpdn;
                     81:            char    lpszTitle[MAX_PATH];
                     82: 
                     83:            /* initialize dialog control information */
                     84:            lpdn = LocalLock ((HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES));
                     85:            SetDlgItemText (hWnd,
                     86:                            IDC_PRINTDEVICE,
                     87:                            lpdn + sizeof (DEVNAMES) +
                     88:                                ((DEVNAMES *)lpdn)->wDeviceOffset);
                     89:            SetDlgItemText (hWnd,
                     90:                            IDC_PRINTPORT,
                     91:                            lpdn + sizeof (DEVNAMES) +
                     92:                                ((DEVNAMES *)lpdn)->wOutputOffset);
                     93:            LocalUnlock ((HANDLE)GetWindowLong (hWnd, WL_HPTRDEVNAMES));
                     94:            GetWindowText (hWnd, lpszTitle, sizeof (lpszTitle));
                     95:            SetDlgItemText (hWnd, IDC_PRINTTITLE, lpszTitle);
                     96:            }
                     97:            break;
                     98: 
                     99:        case WM_COMMAND:
                    100:            /* if cancel button selected, post message to cancel print job */
                    101:            if (LOWORD (uParam) == IDCANCEL)
                    102:                {
                    103:                PostMessage (GetParent (hWnd), UM_CANCELPRINT, 0, 0);
                    104:                DestroyWindow (hWnd);
                    105:                }
                    106:            break;
                    107: 
                    108:        default:
                    109:            return FALSE;
                    110:     }
                    111:     return TRUE;
                    112: }
                    113: 
                    114: 
                    115: 
                    116: /* put up the print common dialog, and print */
                    117: int WINAPI PrintFile (
                    118:     HWND    hWnd)
                    119: {
                    120:     char       *lpEditData;
                    121:     HANDLE     hEditData;
                    122:     SIZE       sLine;
                    123:     int        yLineExt;
                    124:     int        yExt;
                    125:     int        yPageExt;
                    126:     UINT       uLine;
                    127:     UINT       uNumLines;
                    128:     UINT       uOffset;
                    129:     UINT       uLineLen;
                    130:     HWND       hWndEdit;
                    131:        // PRINTDLG     pdPrint;
                    132:     DOCINFO    diPrint;
                    133:     char       lpszJobName[MAX_PATH];
                    134: 
                    135: 
                    136:     /* call common print dialog to get initialized printer DC */
                    137:     pdPrint.hwndOwner = hWnd;
                    138:     pdPrint.hDC = NULL;
                    139:     pdPrint.Flags = PD_RETURNDC;
                    140: 
                    141:     /* call common print dialog */
                    142:     if (!PrintDlg (&pdPrint))
                    143:        return IDS_PTRCOMMDLGFAILED;
                    144: 
                    145:     /* start cancel dialog box */
                    146:     hCancelDlg = CreateDialog ((HANDLE)GetModuleHandle (NULL),
                    147:                               IDD_CANCELDLG,
                    148:                               hWnd,
                    149:                               CancelDlgProc);
                    150: 
                    151: 
                    152:     if (!hCancelDlg)
                    153:        return IDS_CANCELDLGFAILED;
                    154: 
                    155:     ShowWindow (hCancelDlg, SW_SHOW);
                    156:     UpdateWindow (hCancelDlg);
                    157: 
                    158:     /* set AbortProc callback */
                    159:     if (SetAbortProc (pdPrint.hDC, (PROC)AbortProc) < 0)
                    160:        {
                    161:        /* on error, clean up and go away */
                    162:        DestroyWindow (hCancelDlg);
                    163:        DeleteDC (pdPrint.hDC);
                    164:        return IDS_SETABORTPROCFAILED;
                    165:        }
                    166: 
                    167:     /* initialize printer for job */
                    168:     GetWindowText (hWnd, lpszJobName, sizeof (lpszJobName));
                    169:     diPrint.cbSize = sizeof (DOCINFO);
                    170:     diPrint.lpszDocName = lpszJobName;
                    171:     diPrint.lpszOutput = NULL;
                    172:     if (StartDoc (pdPrint.hDC, &diPrint) == SP_ERROR)
                    173:        {
                    174:        /* on error, clean up and go away */
                    175:        DestroyWindow (hCancelDlg);
                    176:        DeleteDC (pdPrint.hDC);
                    177:        return IDS_STARTDOCFAILED;
                    178:        }
                    179: 
                    180:     /* job started, so display cancel dialog */
                    181:     ShowWindow (hCancelDlg, SW_SHOW);
                    182:     UpdateWindow (hCancelDlg);
                    183: 
                    184:     /* retrieve dimensions for printing and init loop variables */
                    185:     hWndEdit = (HWND)GetWindowLong(hWnd, WL_HWNDEDIT);
                    186:     hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0L);
                    187:     uNumLines = (WORD)SendMessage (hWndEdit, EM_GETLINECOUNT, 0, 0L);
                    188:     GetTextExtentPoint (pdPrint.hDC, "CC", 2, &sLine);
                    189:     yLineExt = sLine.cy;
                    190:     yPageExt = GetDeviceCaps (pdPrint.hDC, VERTRES);
                    191:     yExt = 0;
                    192:     uLine = 0;
                    193: 
                    194:     /* print text line by line from top to bottom */
                    195:     while (uLine < uNumLines)
                    196:        {
                    197:        /* if at end of page, start a new page */
                    198:        if ((yExt + yLineExt) > yPageExt)
                    199:            {
                    200:            if (!EndPage (pdPrint.hDC))
                    201:                {
                    202:                DestroyWindow (hCancelDlg);
                    203:                DeleteDC (pdPrint.hDC);
                    204:                return IDS_PRINTABORTED;
                    205:                }
                    206:            yExt = 0;
                    207:            }
                    208: 
                    209:        /* determine buffer offset for current line and line length */
                    210:        uOffset = SendMessage (hWndEdit, EM_LINEINDEX, uLine, 0);
                    211:        uLineLen = SendMessage (hWndEdit, EM_LINELENGTH, uOffset, 0);
                    212:        lpEditData = (char *)LocalLock (hEditData) + uOffset;
                    213: 
                    214:        /* print current the line and unlock the text handle */
                    215:        TextOut (pdPrint.hDC, 0, yExt, lpEditData, uLineLen);
                    216:        LocalUnlock (hEditData);
                    217: 
                    218:        /* increment page position */
                    219:        yExt += yLineExt;
                    220:        uLine++;
                    221:        }
                    222: 
                    223:     /* end the last page and document */
                    224:     EndPage (pdPrint.hDC);
                    225:     EndDoc (pdPrint.hDC);
                    226: 
                    227:     /* end cancel dialog box, clean up and exit */
                    228:     DestroyWindow (hCancelDlg);
                    229:     DeleteDC(pdPrint.hDC);
                    230:     return TRUE;
                    231: }
                    232: 
                    233: 
                    234: 
                    235: /* printer setup common dialog */
                    236: int WINAPI PrinterSetup (
                    237:     HWND    hWnd)
                    238: {
                    239:        // PRINTDLG     pdPrint;
                    240: 
                    241:        pdPrint.Flags           = PD_PRINTSETUP;
                    242:        pdPrint.hwndOwner       = hWnd;
                    243: 
                    244:     /* call common print dialog */
                    245:        if (!PrintDlg (&pdPrint) && CommDlgExtendedError ())
                    246:                return IDS_PTRCOMMDLGFAILED;
                    247:        else
                    248:                return 0;
                    249: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.