Last updated: 11. 1.1998, 17:16
<*/NOWARN:F*>
IMPLEMENTATION MODULE PopPrnt;
(*----------------------------------------------
POPPRNT.C -- Popup Editor Printing Functions
----------------------------------------------*)
IMPORT WINUSER;
IMPORT WIN32;
IMPORT WINGDI;
IMPORT COMMDLG;
IMPORT SYSTEM;
IMPORT h2d_PopPad;
VAR
bUserAbort : WIN32.BOOL;
hDlgPrint : WIN32.HWND;
VAR di : WINGDI.DOCINFO;
pd : COMMDLG.PRINTDLG;
<*/PUSH*>
%IF WIN32 %THEN
<*/CALLS:WIN32SYSTEM*>
%ELSE
<*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE PrintDlgProc (hDlg : WIN32.HWND;
msg : WIN32.UINT;
wParam : WIN32.WPARAM;
lParam : WIN32.LPARAM) : WIN32.BOOL [EXPORT];
(**********************************************************************)
BEGIN
CASE (msg) OF
| WINUSER.WM_INITDIALOG :
WINUSER.EnableMenuItem (WINUSER.GetSystemMenu (hDlg, FALSE), WINUSER.SC_CLOSE,
WINUSER.MF_GRAYED);
RETURN TRUE;
| WINUSER.WM_COMMAND :
bUserAbort := TRUE;
WINUSER.EnableWindow (WINUSER.GetParent (hDlg), TRUE);
WINUSER.DestroyWindow (hDlg);
hDlgPrint := SYSTEM.CAST(WIN32.HWND,0);
RETURN TRUE;
ELSE
RETURN FALSE;
END;
END PrintDlgProc;
<*/POP*>
<*/PUSH*>
%IF WIN32 %THEN
<*/CALLS:WIN32SYSTEM*>
%ELSE
<*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE AbortProc (hPrinterDC : WIN32.HDC;
iCode : INTEGER) : WIN32.BOOL [EXPORT];
(**********************************************************************)
VAR
msg : WINUSER.MSG;
BEGIN
WHILE (bUserAbort=FALSE) AND (WINUSER.PeekMessage (msg, NIL, 0, 0, WINUSER.PM_REMOVE)=TRUE) DO
IF (hDlgPrint=SYSTEM.CAST(WIN32.HWND,0)) OR (WINUSER.IsDialogMessage (hDlgPrint,msg)=FALSE) THEN
WINUSER.TranslateMessage (msg);
WINUSER.DispatchMessage (msg);
END;
END;
RETURN NOT bUserAbort;
END AbortProc;
<*/POP*>
(*++++*****************************************************************)
PROCEDURE PrintFile (hInst : WIN32.HINSTANCE;
hwnd : WIN32.HWND;
hwndEdit : WIN32.HWND;
szTitleName : WIN32.LPSTR) : WIN32.BOOL;
(**********************************************************************)
VAR
bSuccess : WIN32.BOOL;
pstrBuffer : WIN32.LPCTSTR;
yChar : INTEGER;
iCharsPerLine : INTEGER;
iLinesPerPage : INTEGER;
iTotalLines : INTEGER;
iTotalPages : INTEGER;
iPage : INTEGER;
iLine : INTEGER;
iLineNum : INTEGER;
tm : WINGDI.TEXTMETRIC;
iColCopy : CARDINAL;
iNoiColCopy : CARDINAL;
i : CARDINAL;
j : CARDINAL;
rc : INTEGER;
BEGIN
di := WINGDI.DOCINFO{ SIZE (WINGDI.DOCINFO), NIL,NIL};
pd.lStructSize := SIZE (COMMDLG.PRINTDLG);
pd.hwndOwner := hwnd;
pd.hDevMode := NIL;
pd.hDevNames := NIL;
pd.hDC := NIL;
pd.Flags := COMMDLG.PD_ALLPAGES BOR COMMDLG.PD_COLLATE BOR COMMDLG.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 := SYSTEM.CAST(COMMDLG.LPPRINTHOOKPROC,NIL);
pd.lpfnSetupHook := SYSTEM.CAST(COMMDLG.LPSETUPHOOKPROC,NIL);
pd.lpPrintTemplateName := NIL;
pd.lpSetupTemplateName := NIL;
pd.hPrintTemplate := NIL;
pd.hSetupTemplate := NIL;
IF ( NOT COMMDLG.PrintDlg (pd)) THEN
RETURN TRUE;
END; (* *)
iTotalLines := SYSTEM.CAST(WIN32.SHORT, WINUSER.SendMessage (hwndEdit, WINUSER.EM_GETLINECOUNT, 0, 0000h));
IF (iTotalLines = 0) THEN
RETURN TRUE;
END;
WINGDI.GetTextMetrics (pd.hDC, tm);
yChar := tm.tmHeight + tm.tmExternalLeading;
iCharsPerLine := WINGDI.GetDeviceCaps (pd.hDC, WINGDI.HORZRES) / tm.tmAveCharWidth;
iLinesPerPage := WINGDI.GetDeviceCaps (pd.hDC, WINGDI.VERTRES) / yChar;
iTotalPages := (iTotalLines + iLinesPerPage - 1) / iLinesPerPage;
pstrBuffer := SYSTEM.CAST(WIN32.LPCTSTR,WIN32.HeapAlloc (WIN32.GetProcessHeap (),
WIN32.HEAP_NO_SERIALIZE, iCharsPerLine + 1));
WINUSER.EnableWindow (hwnd, FALSE);
bSuccess := TRUE;
bUserAbort := FALSE;
hDlgPrint := WINUSER.CreateDialog (hInst,"PrintDlgBox", hwnd, PrintDlgProc);
WINUSER.SetDlgItemText (hDlgPrint, h2d_PopPad.IDD_FNAME, szTitleName^);
rc := WINGDI.SetAbortProc (pd.hDC, SYSTEM.CAST(WINGDI.ABORTPROC,AbortProc));
WINUSER.GetWindowText (hwnd, di.lpszDocName^, SIZE (WIN32.PTSTR));
IF (WINGDI.StartDoc (pd.hDC, di) > 0) THEN
IF((SYSTEM.CAST(WIN32.WORD,pd.Flags - COMMDLG.PD_COLLATE))#0) THEN
i := VAL(CARDINAL,pd.nCopies);
ELSE
i := 1;
END;
iColCopy := 0;
LOOP
iPage := 0;
LOOP
IF(pd.Flags - COMMDLG.PD_COLLATE#0) THEN
j := VAL(CARDINAL,pd.nCopies);
ELSE
j := 1;
END;
iNoiColCopy := 0;
LOOP
IF (WINGDI.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(WIN32.LPCTSTR,SYSTEM.ADR(iCharsPerLine));
WINGDI.TextOut (pd.hDC, 0, yChar * iLine, pstrBuffer^,
WINUSER.SendMessage (hwndEdit, WINUSER.EM_GETLINE,
iLineNum,
SYSTEM.CAST(WIN32.WPARAM,pstrBuffer)));
INC(iLine);
IF(iLine>iLinesPerPage) THEN
EXIT;
END;
END;
INC(iNoiColCopy);
IF(iNoiColCopy>j) THEN
EXIT;
END;
IF (WINGDI.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
WINGDI.EndDoc (pd.hDC);
END;
IF ( NOT bUserAbort) THEN
WINUSER.EnableWindow (hwnd, TRUE);
WINUSER.DestroyWindow (hDlgPrint);
END;
WIN32.HeapFree (WIN32.GetProcessHeap (), 0, SYSTEM.CAST(WIN32.LPVOID,pstrBuffer));
WINGDI.DeleteDC (pd.hDC);
RETURN bSuccess AND NOT bUserAbort;
END PrintFile;
BEGIN
END PopPrnt.