PTPRINT.C
/******************************************************************************\ 
*       This is a part of the Microsoft Source Code Samples. 
*       Copyright (C) 1993-96 Microsoft Corporation. 
*       All rights reserved. 
*       This source code is only intended as a supplement to 
*       Microsoft Development Tools and/or WinHelp documentation. 
*       See these sources for detailed information regarding the 
*       Microsoft samples programs. 
\******************************************************************************/ 
 
#include "PortTool.h" 
 
HWNDhCancelDlg = 0; 
PRINTDLGpdPrint; 
 
 
/* get default printer configuration and save in hWnd extra bytes for use later */ 
BOOL WINAPI GetPrinterConfig ( 
    HWND    hWnd) 
{ 
    pdPrint.lStructSize = sizeof (PRINTDLG); 
pdPrint.Flags= PD_RETURNDEFAULT; 
pdPrint.hwndOwner= hWnd; 
pdPrint.hDevMode= NULL; 
pdPrint.hDevNames= NULL; 
pdPrint.hDC = NULL; 
 
PrintDlg (&pdPrint); 
 
SetWindowLong (hWnd, WL_HPTRDEVNAMES, (LONG) pdPrint.hDevNames); 
 
return TRUE; 
} 
 
 
 
/* abort proc called by gdi during print download process */ 
int WINAPI AbortProc ( 
    HDC     hdc, 
    int     nErr) 
{ 
    BOOL    fContinue = TRUE; 
    MSG     msg; 
 
    /* process messages for cancel dialog and other apps */ 
    while (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE)) 
{ 
if (msg.message == UM_CANCELPRINT) 
    { 
    fContinue = FALSE; 
    break; 
    } 
 
else if (!hCancelDlg || !IsDialogMessage (hCancelDlg, &msg)) 
    { 
    TranslateMessage (&msg); 
    DispatchMessage  (&msg); 
    } 
} 
 
    return fContinue; 
} 
 
 
 
 
BOOL WINAPI CancelDlgProc ( 
    HWND    hWnd, 
    UINT    uMsg, 
    UINT    uParam, 
    LONG    lParam) 
{ 
 
    switch (uMsg) 
{ 
case WM_INITDIALOG: 
    { 
    char    *lpdn; 
    char    lpszTitle[MAX_PATH]; 
        HWND    hWndOwner = GetWindow(hWnd, GW_OWNER); 
 
    /* initialize dialog control information */ 
    lpdn = LocalLock (pdPrint.hDevNames); 
 
    SetDlgItemText (hWnd, 
    IDC_PRINTDEVICE, 
    lpdn + sizeof (DEVNAMES) + 
((DEVNAMES *)lpdn)->wDeviceOffset); 
    SetDlgItemText (hWnd, 
    IDC_PRINTPORT, 
    lpdn + sizeof (DEVNAMES) + 
((DEVNAMES *)lpdn)->wOutputOffset); 
    LocalUnlock (pdPrint.hDevNames); 
    GetWindowText (hWndOwner, lpszTitle, sizeof (lpszTitle)); 
    SetDlgItemText (hWnd, IDC_PRINTTITLE, lpszTitle); 
    } 
    break; 
 
case WM_COMMAND: 
    /* if cancel button selected, post message to cancel print job */ 
    if (LOWORD (uParam) == IDCANCEL) 
{ 
PostMessage (GetParent (hWnd), UM_CANCELPRINT, 0, 0); 
DestroyWindow (hWnd); 
} 
    break; 
 
default: 
    return FALSE; 
    } 
    return TRUE; 
} 
 
 
 
/* put up the print common dialog, and print */ 
int WINAPI PrintFile ( 
    HWND    hWnd) 
{ 
    char*lpEditData; 
    HANDLEhEditData; 
    SIZEsLine; 
    int yLineExt; 
    int yExt; 
    int yPageExt; 
    UINTuLine; 
    UINTuNumLines; 
    UINTuOffset; 
    UINTuLineLen; 
    UINTuTitleLen; 
    HWNDhWndEdit; 
// PRINTDLGpdPrint; 
    DOCINFOdiPrint; 
    charlpszJobName[MAX_PATH]; 
    HFONThFont; 
    HFONThFontPrt = NULL; 
    intnPageCnt = 1; 
 
 
    /* call common print dialog to get initialized printer DC */ 
    pdPrint.hwndOwner = hWnd; 
    pdPrint.hDC = NULL; 
    pdPrint.Flags = PD_RETURNDC ; 
 
 
    /* call common print dialog */ 
    if (!PrintDlg (&pdPrint)) 
return IDS_PTRCOMMDLGFAILED; 
 
    /* start cancel dialog box */ 
    hCancelDlg = CreateDialog ((HANDLE)GetModuleHandle (NULL), 
       IDD_CANCELDLG, 
       hWnd, 
       CancelDlgProc); 
 
 
    if (!hCancelDlg) 
return IDS_CANCELDLGFAILED; 
 
    ShowWindow (hCancelDlg, SW_SHOW); 
    UpdateWindow (hCancelDlg); 
 
    /* set AbortProc callback */ 
    if (SetAbortProc (pdPrint.hDC, AbortProc) < 0) 
{ 
/* on error, clean up and go away */ 
DestroyWindow (hCancelDlg); 
DeleteDC (pdPrint.hDC); 
return IDS_SETABORTPROCFAILED; 
} 
 
    hWndEdit = (HWND)GetWindowLong (hWnd, WL_HWNDEDIT); 
    if (NULL == (hFont = (HFONT)SendMessage(hWndEdit, WM_GETFONT, 0, 0L))) { 
        hFont = GetStockObject(SYSTEM_FONT); 
    } else { 
        HDC     hdcScreen; 
        LOGFONT lf; 
 
        if (NULL != (hdcScreen = GetDC(hWnd))) { 
            if(GetObject(hFont, sizeof(LOGFONT), &lf)) { 
                lf.lfWidth = 0; 
                lf.lfHeight = lf.lfHeight 
                            * GetDeviceCaps(pdPrint.hDC, LOGPIXELSX) 
                            / GetDeviceCaps(hdcScreen, LOGPIXELSX); 
                if (NULL != (hFontPrt = CreateFontIndirect(&lf))) { 
                    hFont = hFontPrt; 
                } 
            } 
            ReleaseDC(hWnd, hdcScreen); 
        } 
    } 
    hFont = SelectObject(pdPrint.hDC, hFont); 
 
    /* initialize printer for job */ 
    GetWindowText (hWnd, lpszJobName, sizeof (lpszJobName)); 
    diPrint.cbSize = sizeof (DOCINFO); 
    diPrint.lpszDocName = lpszJobName; 
    diPrint.lpszOutput = NULL; 
    if (StartDoc (pdPrint.hDC, &diPrint) == SP_ERROR ||  StartPage (pdPrint.hDC) < 0) 
{ 
/* on error, clean up and go away */ 
DestroyWindow (hCancelDlg); 
SelectObject(pdPrint.hDC, hFont); 
        if (hFontPrt) { 
    DeleteObject(hFontPrt); 
        } 
DeleteDC (pdPrint.hDC); 
return IDS_STARTDOCFAILED; 
} 
 
    /* job started, so display cancel dialog */ 
    ShowWindow (hCancelDlg, SW_SHOW); 
    UpdateWindow (hCancelDlg); 
 
    /* retrieve dimensions for printing and init loop variables */ 
    /* 'hWndEdit' has already been got. */ 
    hWndEdit = (HWND)GetWindowLong(hWnd, WL_HWNDEDIT); 
    hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0L); 
    uNumLines = (WORD)SendMessage (hWndEdit, EM_GETLINECOUNT, 0, 0L); 
    GetTextExtentPoint (pdPrint.hDC, "CC", 2, &sLine); 
    yLineExt = sLine.cy; 
    yPageExt = GetDeviceCaps (pdPrint.hDC, VERTRES); 
    yExt = 0; 
    uLine = 0; 
    if (pdPrint.Flags & PD_PAGENUMS) { 
uLine = (pdPrint.nFromPage - 1) * (yPageExt / yLineExt); 
    } 
 
    /* print text line by line from top to bottom */ 
    while (uLine < uNumLines) 
{ 
if ((pdPrint.Flags & PD_PAGENUMS) && 
    (uLine >= (UINT)(pdPrint.nToPage * (yPageExt / yLineExt)))) { 
    break; 
} 
/* if at end of page, start a new page */ 
if ((yExt + yLineExt) > yPageExt) 
    { 
    if (!EndPage (pdPrint.hDC) || StartPage (pdPrint.hDC) < 0) 
{ 
DestroyWindow (hCancelDlg); 
SelectObject(pdPrint.hDC, hFont); 
                if (hFontPrt) { 
                    DeleteObject(hFontPrt); 
                } 
DeleteDC (pdPrint.hDC); 
return IDS_PRINTABORTED; 
} 
    yExt = 0; 
    } 
 
/* determine buffer offset for current line and line length */ 
uOffset = SendMessage (hWndEdit, EM_LINEINDEX, uLine, 0); 
uLineLen = SendMessage (hWndEdit, EM_LINELENGTH, uOffset, 0); 
 
#if defined (WIN32) 
    uTitleLen=GetWindowTextLength(hWndEdit); 
    hEditData=LocalAlloc(LHND,uTitleLen+1);  
    lpEditData=LocalLock(hEditData);  
    GetWindowText(hWndEdit, lpEditData, uTitleLen+1); 
#else 
    hEditData = (HANDLE)SendMessage (hWndEdit, EM_GETHANDLE, 0, 0L); 
lpEditData = LocalLock (hEditData); 
#endif 
 
/* print current the line and unlock the text handle */ 
    TextOut (pdPrint.hDC, 0, yExt, (char *)lpEditData+uOffset, uLineLen); 
LocalUnlock (hEditData); 
 
/* increment page position */ 
yExt += yLineExt; 
uLine++; 
} 
 
    /* end the last page and document */ 
    EndPage (pdPrint.hDC); 
    EndDoc (pdPrint.hDC); 
 
    SelectObject(pdPrint.hDC, hFont); 
    if (hFontPrt) { 
        DeleteObject(hFontPrt); 
    } 
    /* end cancel dialog box, clean up and exit */ 
    DestroyWindow (hCancelDlg); 
    DeleteDC(pdPrint.hDC); 
    return TRUE; 
} 
 
 
 
/* printer setup common dialog */ 
int WINAPI PrinterSetup ( 
    HWND    hWnd) 
{ 
// PRINTDLGpdPrint; 
 
pdPrint.Flags= PD_PRINTSETUP; 
pdPrint.hwndOwner= hWnd; 
 
    /* call common print dialog */ 
if (!PrintDlg (&pdPrint) && CommDlgExtendedError ()) 
return IDS_PTRCOMMDLGFAILED; 
else 
return 0; 
}