home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1995 May
/
cica_0595_4.zip
/
cica_0595_4
/
UTIL
/
GPT34SRC
/
WIN
/
WPRINTER.C
< prev
next >
Wrap
C/C++ Source or Header
|
1993-05-11
|
9KB
|
323 lines
#ifndef lint
static char *RCSid = "$Id: wprinter.c%v 3.38.2.74 1993/02/19 01:16:40 woo Exp woo $";
#endif
/* GNUPLOT - win/wprinter.c */
/*
* Copyright (C) 1992 Maurice Castro, Russell Lang
*
* Permission to use, copy, and distribute this software and its
* documentation for any purpose with or without fee is hereby granted,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation.
*
* Permission to modify the software is granted, but not the right to
* distribute the modified code. Modifications are to be distributed
* as patches to released version.
*
* This software is provided "as is" without express or implied warranty.
*
*
* AUTHORS
*
* Maurice Castro
* Russell Lang
*
* Send your comments or suggestions to
* info-gnuplot@dartmouth.edu.
* This is a mailing list; to join it send a note to
* info-gnuplot-request@dartmouth.edu.
* Send bug reports to
* bug-gnuplot@dartmouth.edu.
*/
/* Dump a file to the printer */
#define STRICT
#include <windows.h>
#include <windowsx.h>
#if WINVER >= 0x030a
#include <commdlg.h>
#endif
#ifdef __MSC__
#include <memory.h>
#else
#include <mem.h>
#endif
#include "wgnuplib.h"
#include "wresourc.h"
#include "wcommon.h"
LPPRINT prlist = NULL;
BOOL CALLBACK _export PrintSizeDlgProc(HWND hdlg, UINT wmsg, WPARAM wparam, LPARAM lparam);
BOOL CALLBACK _export
PrintSizeDlgProc(HWND hdlg, UINT wmsg, WPARAM wparam, LPARAM lparam)
{
char buf[8];
LPPRINT lpr;
lpr = (LPPRINT)GetWindowLong(GetParent(hdlg), 4);
switch (wmsg) {
case WM_INITDIALOG:
wsprintf(buf,"%d",lpr->pdef.x);
SetDlgItemText(hdlg, PSIZE_DEFX, buf);
wsprintf(buf,"%d",lpr->pdef.y);
SetDlgItemText(hdlg, PSIZE_DEFY, buf);
wsprintf(buf,"%d",lpr->poff.x);
SetDlgItemText(hdlg, PSIZE_OFFX, buf);
wsprintf(buf,"%d",lpr->poff.y);
SetDlgItemText(hdlg, PSIZE_OFFY, buf);
wsprintf(buf,"%d",lpr->psize.x);
SetDlgItemText(hdlg, PSIZE_X, buf);
wsprintf(buf,"%d",lpr->psize.y);
SetDlgItemText(hdlg, PSIZE_Y, buf);
CheckDlgButton(hdlg, PSIZE_DEF, TRUE);
EnableWindow(GetDlgItem(hdlg, PSIZE_X), FALSE);
EnableWindow(GetDlgItem(hdlg, PSIZE_Y), FALSE);
return TRUE;
case WM_COMMAND:
switch (wparam) {
case PSIZE_DEF:
EnableWindow(GetDlgItem(hdlg, PSIZE_X), FALSE);
EnableWindow(GetDlgItem(hdlg, PSIZE_Y), FALSE);
return FALSE;
case PSIZE_OTHER:
EnableWindow(GetDlgItem(hdlg, PSIZE_X), TRUE);
EnableWindow(GetDlgItem(hdlg, PSIZE_Y), TRUE);
return FALSE;
case IDOK:
if (SendDlgItemMessage(hdlg, PSIZE_OTHER, BM_GETCHECK, 0, 0L)) {
SendDlgItemMessage(hdlg, PSIZE_X, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
GetInt(buf, &lpr->psize.x);
SendDlgItemMessage(hdlg, PSIZE_Y, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
GetInt(buf, &lpr->psize.y);
}
else {
lpr->psize.x = lpr->pdef.x;
lpr->psize.y = lpr->pdef.y;
}
SendDlgItemMessage(hdlg, PSIZE_OFFX, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
GetInt(buf, &lpr->poff.x);
SendDlgItemMessage(hdlg, PSIZE_OFFY, WM_GETTEXT, 7, (LPARAM)((LPSTR)buf));
GetInt(buf, &lpr->poff.y);
if (lpr->psize.x <= 0)
lpr->psize.x = lpr->pdef.x;
if (lpr->psize.y <= 0)
lpr->psize.y = lpr->pdef.y;
EndDialog(hdlg, IDOK);
return TRUE;
case IDCANCEL:
EndDialog(hdlg, IDCANCEL);
return TRUE;
}
break;
}
return FALSE;
}
/* GetWindowLong(hwnd, 4) must be available for use */
BOOL
PrintSize(HDC printer, HWND hwnd, LPRECT lprect)
{
HDC hdc;
DLGPROC lpfnPrintSizeDlgProc ;
BOOL status = FALSE;
PRINT pr;
SetWindowLong(hwnd, 4, (LONG)((LPPRINT)&pr));
pr.poff.x = 0;
pr.poff.y = 0;
pr.psize.x = GetDeviceCaps(printer, HORZSIZE);
pr.psize.y = GetDeviceCaps(printer, VERTSIZE);
hdc = GetDC(hwnd);
GetClientRect(hwnd,lprect);
pr.pdef.x = MulDiv(lprect->right-lprect->left, 254, 10*GetDeviceCaps(hdc, LOGPIXELSX));
pr.pdef.y = MulDiv(lprect->bottom-lprect->top, 254, 10*GetDeviceCaps(hdc, LOGPIXELSX));
ReleaseDC(hwnd,hdc);
#ifdef __DLL__
lpfnPrintSizeDlgProc = (DLGPROC)GetProcAddress(hdllInstance, "PrintSizeDlgProc");
#else
lpfnPrintSizeDlgProc = (DLGPROC)MakeProcInstance((FARPROC)PrintSizeDlgProc, hdllInstance);
#endif
if (DialogBox (hdllInstance, "PrintSizeDlgBox", hwnd, lpfnPrintSizeDlgProc)
== IDOK) {
lprect->left = MulDiv(pr.poff.x*10, GetDeviceCaps(printer, LOGPIXELSX), 254);
lprect->top = MulDiv(pr.poff.y*10, GetDeviceCaps(printer, LOGPIXELSY), 254);
lprect->right = lprect->left + MulDiv(pr.psize.x*10, GetDeviceCaps(printer, LOGPIXELSX), 254);
lprect->bottom = lprect->top + MulDiv(pr.psize.y*10, GetDeviceCaps(printer, LOGPIXELSY), 254);
status = TRUE;
}
#ifndef __DLL__
FreeProcInstance((FARPROC)lpfnPrintSizeDlgProc);
#endif
SetWindowLong(hwnd, 4, (LONG)(0L));
return status;
}
#if WINVER >= 0x030a
void
PrintRegister(LPPRINT lpr)
{
LPPRINT next;
next = prlist;
prlist = lpr;
lpr->next = next;
}
LPPRINT
PrintFind(HDC hdc)
{
LPPRINT this;
this = prlist;
while (this && (this->hdcPrn!=hdc)) {
this = this->next;
}
return this;
}
void
PrintUnregister(LPPRINT lpr)
{
LPPRINT this, prev;
prev = (LPPRINT)NULL;
this = prlist;
while (this && (this!=lpr)) {
prev = this;
this = this->next;
}
if (this && (this == lpr)) {
/* unhook it */
if (prev)
prev->next = this->next;
else
prlist = this->next;
}
}
/* GetWindowLong(GetParent(hDlg), 4) must be available for use */
BOOL CALLBACK _export
PrintDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
LPPRINT lpr;
lpr = (LPPRINT)GetWindowLong(GetParent(hDlg), 4);
switch(message) {
case WM_INITDIALOG:
lpr->hDlgPrint = hDlg;
SetWindowText(hDlg,(LPSTR)lParam);
EnableMenuItem(GetSystemMenu(hDlg,FALSE),SC_CLOSE,MF_GRAYED);
return TRUE;
case WM_COMMAND:
lpr->bUserAbort = TRUE;
lpr->hDlgPrint = 0;
EnableWindow(GetParent(hDlg),TRUE);
EndDialog(hDlg, FALSE);
return TRUE;
}
return FALSE;
}
BOOL CALLBACK _export
PrintAbortProc(HDC hdcPrn, int code)
{
MSG msg;
LPPRINT lpr;
lpr = PrintFind(hdcPrn);
while (!lpr->bUserAbort && PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
if (!lpr->hDlgPrint || !IsDialogMessage(lpr->hDlgPrint,&msg)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(!lpr->bUserAbort);
}
/* GetWindowLong(hwnd, 4) must be available for use */
void WDPROC
DumpPrinter(HWND hwnd, LPSTR szAppName, LPSTR szFileName)
{
HDC printer;
char *buf;
int *bufcount, count;
HFILE hfile;
DLGPROC lpfnAbortProc;
DLGPROC lpfnPrintDlgProc;
PRINTDLG pd;
PRINT pr;
_fmemset(&pd, 0, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.hwndOwner = hwnd;
pd.Flags = PD_PRINTSETUP | PD_RETURNDC;
if (PrintDlg(&pd)) {
printer = pd.hDC;
if (printer != (HDC)NULL) {
pr.hdcPrn = printer;
SetWindowLong(hwnd, 4, (LONG)((LPPRINT)&pr));
PrintRegister((LPPRINT)&pr);
if ( (hfile = _lopen(szFileName, READ)) != HFILE_ERROR) {
if ( (buf = LocalAllocPtr(LHND, 4096+2)) != (char *)NULL ) {
bufcount = (int *)buf;
EnableWindow(hwnd,FALSE);
pr.bUserAbort = FALSE;
#ifdef __DLL__
lpfnPrintDlgProc = (DLGPROC)GetProcAddress(hdllInstance, "PrintDlgProc");
lpfnAbortProc = (DLGPROC)GetProcAddress(hdllInstance, "PrintAbortProc");
#else
lpfnPrintDlgProc = (DLGPROC)MakeProcInstance((FARPROC)PrintDlgProc, hdllInstance);
lpfnAbortProc = (DLGPROC)MakeProcInstance((FARPROC)PrintAbortProc, hdllInstance);
#endif
pr.hDlgPrint = CreateDialogParam(hdllInstance,"PrintDlgBox",hwnd,lpfnPrintDlgProc,(LPARAM)szAppName);
Escape(printer,SETABORTPROC,0,(LPSTR)lpfnAbortProc,NULL);
if (Escape(printer, STARTDOC, lstrlen(szAppName),szAppName, NULL) > 0)
{
while ( (count = _lread(hfile, buf+2, 4096)) != 0 ) {
*bufcount = count;
Escape(printer, PASSTHROUGH, count+2, (LPSTR)buf, NULL);
}
if (pr.bUserAbort)
Escape(printer,ABORTDOC,0,NULL,NULL);
else
Escape(printer,ENDDOC,0,NULL,NULL);
}
if (!pr.bUserAbort) {
EnableWindow(hwnd,TRUE);
DestroyWindow(pr.hDlgPrint);
}
LocalFreePtr(buf);
#ifndef __DLL__
FreeProcInstance((FARPROC)lpfnPrintDlgProc);
FreeProcInstance((FARPROC)lpfnAbortProc);
#endif
}
_lclose(hfile);
}
DeleteDC(printer);
SetWindowLong(hwnd, 4, (LONG)(0L));
PrintUnregister((LPPRINT)&pr);
}
}
}
#else
void WDPROC
DumpPrinter(HWND hwnd, LPSTR szAppName, LPSTR szFileName);
{
MessageBox(GetDesktopWindow(), "wgnuplib.dll needs to be compiled with WINVER >= 0x030a",
"wgnuplib.dll", MB_OK | MB_ICONEXCLAMATION
}
#endif