📄 gvwprn.c
字号:
SetDlgItemText(hDlg, IDC_SELECT_PAGES, buf);
set_check_method(hDlg, option.print_method);
SetDlgItemTextA(hDlg, IDC_GS_DEVNAME, option.printer_device);
/* We can't collate. */
EnableWindow(GetDlgItem(hDlg, 1041), FALSE);
if ((psfile.page_list.select != (BOOL *)NULL) && psfile.dsc) {
int i;
for (i=0; i< (int)(psfile.dsc->page_count); i++)
psfile.page_list.select[i] = TRUE;
}
return TRUE;
}
else if (message == WM_COMMAND) {
switch(LOWORD(wParam)) {
case IDC_DEVICE_GDI:
case IDC_DEVICE_GS:
case IDC_DEVICE_PS:
set_check_method(hDlg, get_method(hDlg));
return FALSE; /* not processed */
case IDOK:
option.print_method = get_method(hDlg);
return FALSE; /* not processed */
case IDC_SELECT_PAGES:
if (get_page_range(hDlg, get_method(hDlg)))
SendDlgNotification(hDlg, 1057, BN_CLICKED);
return TRUE;
case IDC_GS_WINDOWS:
if (DialogBoxParamL(hlanguage, MAKEINTRESOURCE(IDD_PRINTGDI),
hDlg, GDIDlgProc, (LPARAM)NULL))
set_check_method(hDlg, PRINT_GDI);
return TRUE;
case IDC_GS_DEVNAME:
device_queue_list = get_queues();
if (device_queue_list == (char *)NULL)
return TRUE;
if (DialogBoxParamL(hlanguage, MAKEINTRESOURCE(IDD_PRINTGS),
hDlg, NewDeviceDlgProc, (LPARAM)NULL))
set_check_method(hDlg, PRINT_GS);
free(device_queue_list);
device_queue_list = NULL;
SetDlgItemTextA(hDlg, IDC_GS_DEVNAME, option.printer_device);
return TRUE;
case IDC_GS_ADVPS:
if (DialogBoxParamL(hlanguage, MAKEINTRESOURCE(IDD_ADVPS),
hDlg, AdvPSDlgProc, (LPARAM)NULL))
set_check_method(hDlg, PRINT_PS);
return TRUE;
case ID_HELP:
get_help();
return(FALSE);
}
}
return 0; /* default handler */
}
void print_devmode(void (*pfn)(const char *str), HANDLE hDevMode)
{
char buf[512];
DWORD dw;
LPDEVMODE dm;
if ((hDevMode == NULL) || (hDevMode == INVALID_HANDLE_VALUE))
return;
dm = (LPDEVMODE)GlobalLock(hDevMode);
sprintf(buf, "DevMode:\n");
(*pfn)(buf);
#ifdef UNICODE
strcpy(buf, " dmDeviceName=\042");
convert_widechar(buf+strlen(buf), dm->dmDeviceName,
sizeof(buf)-strlen(buf)-1);
strcat(buf, "\042\n");
#else
sprintf(buf, " dmDeviceName=\042%s\042\n", dm->dmDeviceName);
#endif
(*pfn)(buf);
sprintf(buf, " dmFields=0x%x\n", dm->dmFields);
(*pfn)(buf);
dw = dm->dmFields;
if (dw & DM_ORIENTATION) {
sprintf(buf, " DM_ORIENTATION\n");
(*pfn)(buf);
}
if (dw & DM_PAPERSIZE) {
sprintf(buf, " DM_PAPERSIZE\n");
(*pfn)(buf);
}
if (dw & DM_PAPERLENGTH) {
sprintf(buf, " DM_PAPERLENGTH\n");
(*pfn)(buf);
}
if (dw & DM_PAPERWIDTH) {
sprintf(buf, " DM_PAPERWIDTH\n");
(*pfn)(buf);
}
if (dw & DM_SCALE) {
sprintf(buf, " DM_SCALE\n");
(*pfn)(buf);
}
if (dw & DM_COPIES) {
sprintf(buf, " DM_COPIES\n");
(*pfn)(buf);
}
if (dw & DM_DEFAULTSOURCE) {
sprintf(buf, " DM_DEFAULTSOURCE\n");
(*pfn)(buf);
}
if (dw & DM_PRINTQUALITY) {
sprintf(buf, " DM_PRINTQUALITY\n");
(*pfn)(buf);
}
if (dw & DM_COLOR) {
sprintf(buf, " DM_COLOR\n");
(*pfn)(buf);
}
if (dw & DM_DUPLEX) {
sprintf(buf, " DM_DUPLEX\n");
(*pfn)(buf);
}
if (dw & DM_YRESOLUTION) {
sprintf(buf, " DM_YRESOLUTION\n");
(*pfn)(buf);
}
if (dw & DM_TTOPTION) {
sprintf(buf, " DM_TTOPTION\n");
(*pfn)(buf);
}
if (dw & DM_COLLATE) {
sprintf(buf, " DM_COLLATE\n");
(*pfn)(buf);
}
if (dw & DM_FORMNAME) {
sprintf(buf, " DM_FORMNAME\n");
(*pfn)(buf);
}
sprintf(buf, " dmOrientation=%d\n", dm->dmOrientation);
(*pfn)(buf);
sprintf(buf, " dmPaperSize=%d\n", dm->dmPaperSize);
(*pfn)(buf);
sprintf(buf, " dmPaperLength=%d\n", dm->dmPaperLength);
(*pfn)(buf);
sprintf(buf, " dmPaperWidth=%d\n", dm->dmPaperWidth);
(*pfn)(buf);
sprintf(buf, " dmScale=%d\n", dm->dmScale);
(*pfn)(buf);
sprintf(buf, " dmCopies=%d\n", dm->dmCopies);
(*pfn)(buf);
sprintf(buf, " dmDefaultSource=%d\n", dm->dmDefaultSource);
(*pfn)(buf);
sprintf(buf, " dmPrintQuality=%d\n", dm->dmPrintQuality);
(*pfn)(buf);
sprintf(buf, " dmColor=%d\n", dm->dmColor);
(*pfn)(buf);
sprintf(buf, " dmDuplex=%d\n", dm->dmDuplex);
(*pfn)(buf);
sprintf(buf, " dmYResolution=%d\n", dm->dmYResolution);
(*pfn)(buf);
sprintf(buf, " dmTTOption=%d\n", dm->dmTTOption);
(*pfn)(buf);
sprintf(buf, " dmCollate=%d\n", dm->dmCollate);
(*pfn)(buf);
#ifdef UNICODE
strcpy(buf, " dmFormName=\042");
convert_widechar(buf+strlen(buf), dm->dmFormName,
sizeof(buf)-strlen(buf)-1);
strcat(buf, "\042\n");
#else
sprintf(buf, " dmFormName=\042%s\042\n", dm->dmFormName);
#endif
(*pfn)(buf);
sprintf(buf, " dmLogPixels=%d\n", dm->dmLogPixels);
(*pfn)(buf);
sprintf(buf, " dmBitsPerPel=%d\n", dm->dmBitsPerPel);
(*pfn)(buf);
sprintf(buf, " dmPelsWidth=%d\n", dm->dmPelsWidth);
(*pfn)(buf);
sprintf(buf, " dmPelsHeight=%d\n", dm->dmPelsHeight);
(*pfn)(buf);
sprintf(buf, " dmDisplayFlags=%d\n", dm->dmDisplayFlags);
(*pfn)(buf);
sprintf(buf, " dmDisplayFrequency=%d\n", dm->dmDisplayFrequency);
(*pfn)(buf);
GlobalUnlock(hDevMode);
}
void print_devnames(void (*pfn)(const char *str), HANDLE hDevNames)
{
char buf[512];
LPDEVNAMES lpdevnames;
if ((hDevNames == NULL) || (hDevNames == INVALID_HANDLE_VALUE))
return;
lpdevnames = (LPDEVNAMES)GlobalLock(hDevNames);
sprintf(buf, "DevNames:\n");
(*pfn)(buf);
sprintf(buf, " Device=\042%s\042\n",
((char *)lpdevnames) + lpdevnames->wDeviceOffset);
(*pfn)(buf);
sprintf(buf, " Driver=\042%s\042\n",
((char *)lpdevnames) + lpdevnames->wDriverOffset);
(*pfn)(buf);
sprintf(buf, " Output=\042%s\042\n",
((char *)lpdevnames) + lpdevnames->wOutputOffset);
(*pfn)(buf);
GlobalUnlock(hDevNames);
}
/* Return a devnames structure for the specified printer.
* If device == NULL, return for the default printer.
* MSLU doesn't support DocumentProperties, so call ANSI version.
* Since DEVNAMES may be used with the Unicode CreateDC, we
* need to support Unicode strings.
*/
BOOL get_devnames(LPSTR device, HANDLE *hdevnames)
{
char devicebuf[256];
char driverbuf[512];
char *driver;
char *output;
int length, offset;
HANDLE hglobal;
LPDEVNAMES lpdevnames;
if ((device == NULL) || (strlen(device)==0)) {
/* no device specified - use default */
GetProfileStringA("windows", "device", "",
devicebuf, sizeof(devicebuf));
strtok(devicebuf, ",");
device = devicebuf;
}
if (strlen(device)==0)
return FALSE;
/* Get the information needed for the DEVNAMES structure */
GetProfileStringA("Devices", device, "", driverbuf, sizeof(driverbuf));
if (strlen(driverbuf) == 0)
return FALSE; /* printer doesn't exist */
driver = strtok(driverbuf, ",");
output = strtok(NULL, ",");
/* Build the DEVNAMES structure */
/* Must support Unicode */
if (hdevnames) {
#ifdef UNICODE
TCHAR *t;
length = sizeof(DEVNAMES) + sizeof(TCHAR) *
(strlen(device) + 1 + strlen(driver) + 1 + strlen(output) + 2);
if (length < 1024)
length = 1024;
hglobal = GlobalAlloc(GMEM_MOVEABLE, length);
if (hglobal == NULL)
return FALSE;
lpdevnames = (LPDEVNAMES)GlobalLock(hglobal);
memset(lpdevnames, 0, length);
offset = sizeof(DEVNAMES) / sizeof(TCHAR);
lpdevnames->wDriverOffset = (WORD)offset;
t = (TCHAR *)lpdevnames + offset;
convert_multibyte(t, driver, strlen(driver)+1);
offset += lstrlen(t) + 1;
lpdevnames->wDeviceOffset = (WORD)offset;
t = (TCHAR *)lpdevnames + offset;
convert_multibyte(t, device, strlen(device)+1);
offset += lstrlen(t) + 1;
lpdevnames->wOutputOffset = (WORD)offset;
t = (TCHAR *)lpdevnames + offset;
convert_multibyte(t, output, strlen(output)+1);
GlobalUnlock(hglobal);
lpdevnames = NULL;
*hdevnames = hglobal;
#else
length = sizeof(DEVNAMES) +
(strlen(device) + 1 + strlen(driver) + 1 + strlen(output) + 2);
if (length < 1024)
length = 1024;
hglobal = GlobalAlloc(GMEM_MOVEABLE, length);
if (hglobal == NULL)
return FALSE;
lpdevnames = (LPDEVNAMES)GlobalLock(hglobal);
memset(lpdevnames, 0, length);
offset = sizeof(DEVNAMES);
lpdevnames->wDriverOffset = (WORD)offset;
strncpy((char *)lpdevnames + offset, driver, strlen(driver)+1);
offset += strlen((char *)lpdevnames + offset) + 1;
lpdevnames->wDeviceOffset = (WORD)offset;
strncpy((char *)lpdevnames + offset, device, strlen(device)+1);
offset += strlen((char *)lpdevnames + offset) + 1;
lpdevnames->wOutputOffset = (WORD)offset;
strncpy((char *)lpdevnames + offset, output, strlen(output)+1);
GlobalUnlock(hglobal);
lpdevnames = NULL;
*hdevnames = hglobal;
#endif
}
return TRUE;
}
/* open GSview default printer */
/* no prompts */
BOOL open_printer(void)
{
TCHAR *device;
TCHAR *driver;
LPDEVNAMES lpdevnames;
if (!get_devnames(option.printer_queue, &pd.hDevNames))
return FALSE;
lpdevnames = (LPDEVNAMES)GlobalLock(pd.hDevNames);
device = ((TCHAR *)lpdevnames) + lpdevnames->wDeviceOffset;
driver = ((TCHAR *)lpdevnames) + lpdevnames->wDriverOffset;
/*
char *output = ((char *)lpdevnames) + lpdevnames->wOutputOffset;
*/
pd.hDC = CreateDC(driver, device, NULL, NULL);
GlobalUnlock(pd.hDevNames);
if (debug & DEBUG_GDI)
print_devnames(gs_addmess, pd.hDevNames);
psfile.print_from = 1;
psfile.print_to = 999999;
psfile.print_oddeven = ALL_PAGES;
psfile.print_copies = 1;
psfile.print_ignoredsc = FALSE;
set_page_range();
return TRUE;
}
/* We don't release hDevMode and hDevNames after calls to */
/* query_printer, so we must provide a way to free them */
/* when exiting GSview. */
void
printer_cleanup(void)
{
if ((pd.hDevMode != 0) && (pd.hDevMode != INVALID_HANDLE_VALUE))
GlobalFree(pd.hDevMode);
if ((pd.hDevNames != 0) && (pd.hDevNames != INVALID_HANDLE_VALUE))
GlobalFree(pd.hDevNames);
pd.hDevMode = NULL;
pd.hDevNames = NULL;
}
typedef struct {
WORD dlgVer;
WORD signature;
DWORD helpID;
DWORD exStyle;
DWORD style;
WORD cDlgItems;
short x;
short y;
short cx;
short cy;
WORD /* sz_Or_Ord */ menu;
WORD /* sz_Or_Ord */ windowClass;
WCHAR title[1 /* titleLen */];
/* The following members exist only if the style member is */
/* set to DS_SETFONT or DS_SHELLFONT. */
WORD pointsize;
WORD weight;
BYTE italic;
BYTE charset;
WCHAR typeface[1 /* stringLen */];
} DLGTEMPLATEEX;
typedef DLGTEMPLATEEX *LPDLGTEMPLATEEX;
typedef struct {
DWORD helpID;
DWORD exStyle;
DWORD style;
short x;
short y;
short cx;
short cy;
WORD id;
WORD /* sz_Or_Ord */ windowClass;
WORD /* sz_Or_Ord */ title;
WORD extraCount;
} DLGITEMTEMPLATEEX;
typedef DLGITEMTEMPLATEEX *LPDLGITEMTEMPLATEEX;
WORD *skip_unicode_string(WORD *pw)
{
char buf[MAXSTR];
int i=0;
while ((*pw) && (i < MAXSTR-1)) {
if (*pw < 0xff)
buf[i] = (char)*pw; /* assume ISO-Latin1 subset */
i++;
pw++;
}
if (*pw == 0)
pw++;
buf[i] = 0;
if (debug & DEBUG_GDI)
gs_addmess(buf);
return pw;
}
/* returns length of dlgtemplateex */
int
parse_dlgtemplateex(LPDLGTEMPLATEEX pt, LPDLGITEMTEMPLATEEX *pitem, int item_id)
{
LPWORD pw;
LPDLGITEMTEMPLATEEX pit;
int i;
int fixup;
char buf[MAXSTR];
BOOL debug_gdi = debug & DEBUG_GDI;
/* for debugging, dump to gs messages */
if (debug_gdi) {
gs_addmess("=== Dump of dialog template ex ===\n");
sprintf(buf, "dlgVer=%d signature=0x%x helpID=%d exStyle=0x%x style=0x%x cDlgItems=%d x=%d y=%d cx=%d cy=%d\n",
(int)pt->dlgVer, (int)pt->signature,
(int)pt->helpID,
(int)pt->style, (int)pt->exStyle,
(int)pt->cDlgItems, (int)pt->x, (int)pt->y,
(int)pt->cx, (int)pt->cy);
gs_addmess(buf);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -