427 lines
11 KiB
C
427 lines
11 KiB
C
|
||
/*************************************************
|
||
* lcprint.c *
|
||
* *
|
||
* Copyright (C) 1995-1999 Microsoft Inc. *
|
||
* *
|
||
*************************************************/
|
||
|
||
#include <windows.h> // required for all Windows applications
|
||
#include <windowsx.h>
|
||
#include <stdlib.h>
|
||
#include "rc.h"
|
||
#include "lctool.h"
|
||
|
||
#ifndef UNICODE
|
||
#define lWordBuff iWordBuff
|
||
#endif
|
||
|
||
#define UM_CANCELPRINT WM_USER+2
|
||
#define TOP_SPACE 250
|
||
#define WORD_POS 7
|
||
#define PHRASE_POS 10
|
||
|
||
PRINTDLG pdPrint;
|
||
HWND hCancelDlg = 0;
|
||
int nFromLine = 1;
|
||
int nToLine = 1;
|
||
|
||
int TransNum(TCHAR *);
|
||
|
||
/* 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);
|
||
|
||
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;
|
||
}
|
||
|
||
|
||
|
||
|
||
INT_PTR WINAPI LineDlgProc (
|
||
HWND hDlg,
|
||
UINT message,
|
||
WPARAM wParam,
|
||
LPARAM lParam)
|
||
{
|
||
TCHAR szLine[MAX_PATH];
|
||
|
||
switch (message)
|
||
{
|
||
case WM_INITDIALOG:
|
||
|
||
/* initialize dialog control information */
|
||
SetDlgItemText (hDlg,
|
||
IDD_FROM_LINE,
|
||
_TEXT("1"));
|
||
#ifdef UNICODE
|
||
wsprintf(szLine,_TEXT("%5d"), lWordBuff);
|
||
#else
|
||
wsprintf(szLine,_TEXT("%5d"), iWordBuff);
|
||
#endif
|
||
SetDlgItemText (hDlg,
|
||
IDD_TO_LINE,
|
||
szLine);
|
||
break;
|
||
|
||
case WM_COMMAND:
|
||
switch (wParam) {
|
||
|
||
case IDOK:
|
||
|
||
GetDlgItemText(hDlg,IDD_FROM_LINE,
|
||
szLine, sizeof(szLine)/sizeof(TCHAR));
|
||
nFromLine=TransNum(szLine);
|
||
#ifdef UNICODE
|
||
if((nFromLine < 1) || (nFromLine > (int)lWordBuff)) {
|
||
#else
|
||
if((nFromLine < 1) || (nFromLine > (int)iWordBuff)) {
|
||
#endif
|
||
MessageBeep(0);
|
||
SetFocus(GetDlgItem(hDlg, IDD_FROM_LINE));
|
||
return TRUE;
|
||
}
|
||
GetDlgItemText(hDlg,IDD_TO_LINE,
|
||
szLine, sizeof(szLine));
|
||
nToLine=TransNum(szLine);
|
||
if((nToLine < nFromLine) || (nToLine > (int)lWordBuff)) {
|
||
MessageBeep(0);
|
||
SetFocus(GetDlgItem(hDlg, IDD_TO_LINE));
|
||
return TRUE;
|
||
}
|
||
EndDialog (hDlg, TRUE) ;
|
||
return TRUE;
|
||
|
||
|
||
case IDCANCEL:
|
||
EndDialog (hDlg, FALSE) ;
|
||
return TRUE;
|
||
}
|
||
break ;
|
||
|
||
case WM_CLOSE:
|
||
EndDialog(hDlg, FALSE);
|
||
return TRUE;
|
||
|
||
default:
|
||
return FALSE;
|
||
}
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
|
||
BOOL WINAPI CancelDlgProc (
|
||
HWND hWnd,
|
||
UINT uMsg,
|
||
UINT uParam,
|
||
LONG lParam)
|
||
{
|
||
|
||
switch (uMsg)
|
||
{
|
||
case WM_INITDIALOG:
|
||
{
|
||
TCHAR szStr[MAX_PATH];
|
||
TCHAR szShowMsg[MAX_PATH];
|
||
|
||
|
||
/* initialize dialog control information */
|
||
LoadString(hInst, IDS_PRINTING, szStr, sizeof(szStr)/sizeof(TCHAR));
|
||
wsprintf(szShowMsg, szStr, nFromLine, nToLine);
|
||
SetDlgItemText (hWnd,
|
||
IDC_PRINTLINE,
|
||
szShowMsg);
|
||
}
|
||
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 lcPrint (
|
||
HWND hWnd)
|
||
{
|
||
SIZE sLine;
|
||
int yLineExt;
|
||
int nLineChar;
|
||
int xExt, yExt;
|
||
int yPageExt;
|
||
int xPageExt;
|
||
int xPageOff, yPageOff;
|
||
int nStart,nEnd;
|
||
DOCINFO diPrint;
|
||
TCHAR lpszJobName[MAX_PATH];
|
||
TCHAR szStr[MAX_CHAR_NUM+20];
|
||
int i,len;
|
||
int is_OK;
|
||
|
||
|
||
if(!lcSaveEditText(iDisp_Top, 0))
|
||
return TRUE; // Some error, but msg had displayed
|
||
|
||
/* Display Choose line number dialog */
|
||
is_OK=(int)DialogBox(hInst,_TEXT("LineDialog"), hwndMain, (DLGPROC)LineDlgProc);
|
||
|
||
if(!is_OK)
|
||
return TRUE; // User choose Cancel
|
||
|
||
/* call common print dialog to get initialized printer DC */
|
||
pdPrint.Flags = PD_RETURNDC | PD_NOPAGENUMS | PD_NOSELECTION;
|
||
|
||
/* call common print dialog */
|
||
if (!PrintDlg (&pdPrint))
|
||
return TRUE; // User choose Cancel
|
||
|
||
/* start cancel dialog box */
|
||
hCancelDlg = CreateDialog (hInst,
|
||
_TEXT("IDD_CANCELDLG"),
|
||
hwndMain,
|
||
(DLGPROC)CancelDlgProc);
|
||
|
||
|
||
if (!hCancelDlg)
|
||
return IDS_CANCELDLGFAILED;
|
||
|
||
ShowWindow (hCancelDlg, SW_SHOW);
|
||
UpdateWindow (hCancelDlg);
|
||
|
||
/* set AbortProc callback */
|
||
if (SetAbortProc (pdPrint.hDC, (ABORTPROC)AbortProc) < 0) {
|
||
/* on error, clean up and go away */
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC (pdPrint.hDC);
|
||
return IDS_SETABORTPROCFAILED;
|
||
}
|
||
|
||
/* initialize printer for job */
|
||
GetWindowText (hWnd, lpszJobName, sizeof (lpszJobName));
|
||
diPrint.cbSize = sizeof (DOCINFO);
|
||
diPrint.lpszDocName = lpszJobName;
|
||
diPrint.lpszOutput = NULL;
|
||
diPrint.lpszDatatype = NULL;
|
||
diPrint.fwType = 0;
|
||
if (StartDoc(pdPrint.hDC, &diPrint) == SP_ERROR) {
|
||
/* on error, clean up and go away */
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC (pdPrint.hDC);
|
||
return IDS_STARTDOCFAILED;
|
||
}
|
||
|
||
/* Set Cursor status
|
||
SetCursor(hCursorWait);
|
||
|
||
/* job started, so display cancel dialog */
|
||
ShowWindow (hCancelDlg, SW_SHOW);
|
||
UpdateWindow (hCancelDlg);
|
||
|
||
/* retrieve dimensions for printing and init loop variables */
|
||
GetTextExtentPoint (pdPrint.hDC,_TEXT("<EFBFBD><EFBFBD>"), 2, &sLine);
|
||
sLine.cx += (sLine.cx % 2);
|
||
sLine.cy += (sLine.cy % 2);
|
||
yLineExt = sLine.cy+4;
|
||
yPageExt = GetDeviceCaps (pdPrint.hDC, VERTRES);
|
||
xPageExt = GetDeviceCaps (pdPrint.hDC, HORZRES);
|
||
xPageOff = GetDeviceCaps (pdPrint.hDC, PHYSICALOFFSETX);
|
||
yPageOff = GetDeviceCaps (pdPrint.hDC, PHYSICALOFFSETY);
|
||
nLineChar= (xPageExt - xPageOff * 2)/(1+(sLine.cx>>1)) - 6;
|
||
//yExt = TOP_SPACE;
|
||
xExt = xPageOff;
|
||
yExt = yPageOff + sLine.cy;
|
||
|
||
if (StartPage(pdPrint.hDC) <= 0)
|
||
{
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC (pdPrint.hDC);
|
||
return IDS_PRINTABORTED;
|
||
}
|
||
|
||
/* Print Title */
|
||
LoadString(hInst, IDS_PRINTINGTITLE, szStr, sizeof(szStr));
|
||
TextOut (pdPrint.hDC, xExt, yExt, szStr, lstrlen(szStr));
|
||
yExt += (yLineExt*2);
|
||
|
||
FillMemory(szStr, 20, ' ');
|
||
|
||
/* print text line by line from top to bottom */
|
||
for(i=nFromLine; i<=nToLine; i++) {
|
||
wsprintf(szStr,_TEXT("%5d"), i);
|
||
szStr[5]=' ';
|
||
#ifdef UNICODE
|
||
szStr[WORD_POS]=lpWord[i-1].wWord;
|
||
#else
|
||
//szStr[WORD_POS]=HIBYTE(lpWord[i-1].wWord);
|
||
//szStr[WORD_POS+1]=LOBYTE(lpWord[i-1].wWord);
|
||
#endif
|
||
len=lcMem2Disp(i-1, &szStr[PHRASE_POS])+PHRASE_POS;
|
||
|
||
/* if at end of page, start a new page */
|
||
if ((yExt + yLineExt) > (yPageExt - (yPageOff + sLine.cy) * 2))
|
||
{
|
||
if (EndPage(pdPrint.hDC) == SP_ERROR)
|
||
{
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC (pdPrint.hDC);
|
||
return IDS_PRINTABORTED;
|
||
}
|
||
if (StartPage(pdPrint.hDC) <= 0)
|
||
{
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC (pdPrint.hDC);
|
||
return IDS_PRINTABORTED;
|
||
}
|
||
yExt = yPageOff + sLine.cy; //TOP_SPACE;
|
||
}
|
||
if( len <=(nLineChar-PHRASE_POS)) {
|
||
/* print current the line and unlock the text handle */
|
||
TextOut (pdPrint.hDC, xExt, yExt, szStr, len);
|
||
} else {
|
||
nStart=nLineChar;
|
||
//if(is_DBCS_1st(szStr,nStart-1))
|
||
// nStart--;
|
||
TextOut (pdPrint.hDC, xExt, yExt, szStr, nStart);
|
||
|
||
while(nStart < len-1) {
|
||
yExt += yLineExt;
|
||
|
||
/* if at end of page, start a new page */
|
||
if ((yExt + yLineExt) > (yPageExt - (yPageOff + sLine.cy) * 2))
|
||
{
|
||
if (EndPage(pdPrint.hDC) == SP_ERROR)
|
||
{
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC (pdPrint.hDC);
|
||
return IDS_PRINTABORTED;
|
||
}
|
||
if (StartPage(pdPrint.hDC) <= 0)
|
||
{
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC (pdPrint.hDC);
|
||
return IDS_PRINTABORTED;
|
||
}
|
||
yExt = yPageOff + sLine.cy; //TOP_SPACE;
|
||
}
|
||
|
||
while (szStr[nStart]==' ') nStart++;
|
||
|
||
nEnd=nStart+nLineChar-PHRASE_POS;
|
||
if(nEnd >= len)
|
||
nEnd=len;
|
||
#ifdef UNICODE
|
||
#else
|
||
else
|
||
if(is_DBCS_1st(szStr,nEnd-1))
|
||
nEnd--;
|
||
#endif
|
||
TextOut (pdPrint.hDC, xExt+sLine.cx*(PHRASE_POS>>1), yExt, &szStr[nStart], nEnd-nStart);
|
||
nStart=nEnd;
|
||
}
|
||
}
|
||
|
||
/* increment page position */
|
||
yExt += yLineExt;
|
||
}
|
||
|
||
/* end the last page and document */
|
||
EndPage (pdPrint.hDC);
|
||
EndDoc (pdPrint.hDC);
|
||
|
||
/* end cancel dialog box, clean up and exit */
|
||
DestroyWindow (hCancelDlg);
|
||
DeleteDC(pdPrint.hDC);
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
BOOL is_DBCS_1st(
|
||
TCHAR *szStr,
|
||
int nAddr)
|
||
{
|
||
#ifndef UNICODE
|
||
int i;
|
||
BOOL bDBCS=FALSE;
|
||
|
||
for(i=0; i<=nAddr; i++) {
|
||
if(bDBCS)
|
||
bDBCS=FALSE;
|
||
else
|
||
if((szStr[i] >= 0x81) && (szStr[i] <= 0xFE))
|
||
bDBCS=TRUE;
|
||
}
|
||
|
||
return bDBCS;
|
||
#else
|
||
return TRUE;
|
||
#endif
|
||
}
|
||
|
||
int TransNum(
|
||
TCHAR *szStr)
|
||
{
|
||
int i,j,nNum;
|
||
|
||
for(i=0; szStr[i] == ' '; i++) ;
|
||
nNum=0;
|
||
for(j=i; szStr[j] != 0; j++) {
|
||
if((szStr[j] < '0') || (szStr[j] >'9'))
|
||
return 0;
|
||
nNum=nNum*10+(szStr[j]-'0');
|
||
}
|
||
|
||
return nNum;
|
||
}
|
||
|