⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gvwprn.c

📁 GSview 4.6 PostScript previewer。Ghostscript在MS-Windows, OS/2 and Unix下的图形化接口
💻 C
📖 第 1 页 / 共 5 页
字号:
	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 + -