Last updated: 22. 1.1998, 23:16
<* +M2EXTENSIONS *> IMPLEMENTATION MODULE PopPrnt; (*---------------------------------------------- POPPRNT.C -- Popup Editor Printing Functions ----------------------------------------------*) IMPORT Windows; IMPORT SYSTEM; IMPORT h2d_PopPad; VAR bUserAbort : Windows.BOOL; hDlgPrint : Windows.HWND; VAR di : Windows.DOCINFO; pd : Windows.PRINTDLG; (*++++*****************************************************************) PROCEDURE [Windows.CALLBACK] PrintDlgProc (hDlg : Windows.HWND; msg : Windows.UINT; wParam : Windows.WPARAM; lParam : Windows.LPARAM) : Windows.BOOL; (**********************************************************************) BEGIN CASE (msg) OF | Windows.WM_INITDIALOG : Windows.EnableMenuItem (Windows.GetSystemMenu (hDlg, FALSE), Windows.SC_CLOSE, Windows.MF_GRAYED); RETURN TRUE; | Windows.WM_COMMAND : bUserAbort := TRUE; Windows.EnableWindow (Windows.GetParent (hDlg), TRUE); Windows.DestroyWindow (hDlg); hDlgPrint := SYSTEM.CAST(Windows.HWND,0); RETURN TRUE; ELSE RETURN FALSE; END; END PrintDlgProc; (*++++*****************************************************************) PROCEDURE [Windows.CALLBACK] AbortProc (hPrinterDC : Windows.HDC; iCode : INTEGER) : Windows.BOOL; (**********************************************************************) VAR msg : Windows.MSG; BEGIN WHILE (bUserAbort=FALSE) AND (Windows.PeekMessage (msg, NIL, 0, 0, Windows.PM_REMOVE)=TRUE) DO IF (hDlgPrint=SYSTEM.CAST(Windows.HWND,0)) OR (Windows.IsDialogMessage (hDlgPrint,msg)=FALSE) THEN Windows.TranslateMessage (msg); Windows.DispatchMessage (msg); END; END; RETURN NOT bUserAbort; END AbortProc; (*++++*****************************************************************) PROCEDURE PrintFile (hInst : Windows.HINSTANCE; hwnd : Windows.HWND; hwndEdit : Windows.HWND; szTitleName : Windows.PSTR) : Windows.BOOL; (**********************************************************************) VAR bSuccess : Windows.BOOL; pstrBuffer : Windows.PCTSTR; yChar : INTEGER; iCharsPerLine : INTEGER; iLinesPerPage : INTEGER; iTotalLines : INTEGER; iTotalPages : INTEGER; iPage : INTEGER; iLine : INTEGER; iLineNum : INTEGER; tm : Windows.TEXTMETRIC; iColCopy : CARDINAL; iNoiColCopy : CARDINAL; i : CARDINAL; j : CARDINAL; rc : INTEGER; CONST prDi = "PrintDlgBox"; BEGIN di := Windows.DOCINFO{ SIZE (Windows.DOCINFO), NIL,NIL,NIL,0}; pd.lStructSize := SIZE (Windows.PRINTDLG); pd.hwndOwner := hwnd; pd.hDevMode := NIL; pd.hDevNames := NIL; pd.hDC := NIL; pd.Flags := Windows.PD_ALLPAGES + Windows.PD_COLLATE + Windows.PD_RETURNDC; pd.nFromPage := 1; (* Korrektur von G. Born *) pd.nToPage := 0FFFFh; (* Werte von 0 auf 1 bzw. *) pd.nMinPage := 1; (* 0xFFFF gesetzt, damit *) pd.nMaxPage := 0FFFFh; (* Sortieren funktioniert *) pd.nCopies := 1; pd.hInstance := NIL; pd.lCustData := 0000h; pd.lpfnPrintHook := NIL; pd.lpfnSetupHook := NIL; pd.lpPrintTemplateName := NIL; pd.lpSetupTemplateName := NIL; pd.hPrintTemplate := NIL; pd.hSetupTemplate := NIL; IF ( NOT Windows.PrintDlg (pd)) THEN RETURN TRUE; END; (* *) iTotalLines := SYSTEM.CAST(Windows.SHORT, Windows.SendMessage (hwndEdit, Windows.EM_GETLINECOUNT, 0, 0000h)); IF (iTotalLines = 0) THEN RETURN TRUE; END; Windows.GetTextMetrics (pd.hDC, tm); yChar := tm.tmHeight + tm.tmExternalLeading; iCharsPerLine := Windows.GetDeviceCaps (pd.hDC, Windows.HORZRES) / tm.tmAveCharWidth; iLinesPerPage := Windows.GetDeviceCaps (pd.hDC, Windows.VERTRES) / yChar; iTotalPages := (iTotalLines + iLinesPerPage - 1) / iLinesPerPage; pstrBuffer := SYSTEM.CAST(Windows.PCTSTR,Windows.HeapAlloc (Windows.GetProcessHeap (), Windows.HEAP_NO_SERIALIZE, iCharsPerLine + 1)); Windows.EnableWindow (hwnd, FALSE); bSuccess := TRUE; bUserAbort := FALSE; hDlgPrint := Windows.CreateDialog (hInst,SYSTEM.ADR(prDi), hwnd, PrintDlgProc); Windows.SetDlgItemText (hDlgPrint, h2d_PopPad.IDD_FNAME, szTitleName^); rc := Windows.SetAbortProc (pd.hDC, SYSTEM.CAST(Windows.ABORTPROC,AbortProc)); Windows.GetWindowText (hwnd, di.lpszDocName^, SIZE (Windows.PTSTR)); IF (Windows.StartDoc (pd.hDC, di) > 0) THEN IF((SYSTEM.CAST(Windows.WORD,pd.Flags - Windows.PD_COLLATE))#0) THEN i := VAL(CARDINAL,pd.nCopies); ELSE i := 1; END; iColCopy := 0; LOOP iPage := 0; LOOP IF(pd.Flags - Windows.PD_COLLATE#SYSTEM.CAST(Windows.PD_SET,0)) THEN j := VAL(CARDINAL,pd.nCopies); ELSE j := 1; END; iNoiColCopy := 0; LOOP IF (Windows.StartPage (pd.hDC) < 0) THEN bSuccess := FALSE; EXIT; END; iLine := 0; LOOP iLineNum := iLinesPerPage * iPage + iLine; IF (iLineNum > iTotalLines) THEN EXIT; END; pstrBuffer := SYSTEM.CAST(Windows.PCTSTR,SYSTEM.ADR(iCharsPerLine)); Windows.TextOut (pd.hDC, 0, yChar * iLine, pstrBuffer^, Windows.SendMessage (hwndEdit, Windows.EM_GETLINE, iLineNum, SYSTEM.CAST(Windows.WPARAM,pstrBuffer))); INC(iLine); IF(iLine>iLinesPerPage) THEN EXIT; END; END; INC(iNoiColCopy); IF(iNoiColCopy>j) THEN EXIT; END; IF (Windows.EndPage (pd.hDC) < 0) THEN bSuccess := FALSE; EXIT; END; IF (bUserAbort) THEN EXIT; END; END; IF ( NOT bSuccess OR bUserAbort) THEN EXIT; END; INC(iPage); IF(iPage>=iTotalPages) THEN EXIT; END; END; IF ( NOT bSuccess OR bUserAbort) THEN EXIT; END; INC(iColCopy); IF(iColCopy>i-1) THEN EXIT; END; END; ELSE bSuccess := FALSE; END; IF (bSuccess) THEN Windows.EndDoc (pd.hDC); END; IF ( NOT bUserAbort) THEN Windows.EnableWindow (hwnd, TRUE); Windows.DestroyWindow (hDlgPrint); END; Windows.HeapFree (Windows.GetProcessHeap (), SYSTEM.CAST(Windows.HEAP_SET,0), SYSTEM.CAST(Windows.PVOID,pstrBuffer)); Windows.DeleteDC (pd.hDC); RETURN bSuccess AND NOT bUserAbort; END PrintFile; BEGIN END PopPrnt.