|
|
1.1 ! root 1: /******************************************************************************\ ! 2: * ! 3: * MODULE: DEVCAPS.C ! 4: * ! 5: * PURPOSE: To create a DC based on the global varaibles DriverName, ! 6: * DeviceName, and Port, and then query all the device ! 7: * capabilities for that DC and list them in a dialog box. ! 8: * ! 9: * FUNTIONS: DevCapsDlgProc() - processes dialog messages ! 10: * DevCapsThread() - retrieves devcaps & inserts them in ! 11: * listbox ! 12: * TranslateCaps() - formats text strings based on return ! 13: * values of GetDeviceCaps ! 14: * ComplexCapLine() - handles cases when GetDeviceCaps ! 15: * returns multiple bit-values, inserts ! 16: * 1+ strings in listbox. ! 17: * ! 18: \******************************************************************************/ ! 19: ! 20: #include <windows.h> ! 21: #include <string.h> ! 22: #include "lookup.h" ! 23: #include "devcaps.h" ! 24: #include "vars.h" ! 25: #include "printer.h" ! 26: ! 27: ! 28: ! 29: /******************************************************************************\ ! 30: * ! 31: * FUNCTION: DevCapDlgProc (standard dialog procedure INPUTS/RETURNS) ! 32: * ! 33: * GLOBAL VARS: hDevCapsDlg - dialog window handle ! 34: * ! 35: \******************************************************************************/ ! 36: ! 37: BOOL APIENTRY DevCapDlgProc (HWND hDlg, UINT message, UINT wParam, ! 38: LONG lParam) ! 39: { switch (message) ! 40: { ! 41: case WM_INITDIALOG: ! 42: { ! 43: DWORD threadId; ! 44: ! 45: hDevCapsDlg = hDlg; ! 46: ! 47: if (!CreateThread (NULL, 0, ! 48: (LPTHREAD_START_ROUTINE) DevCapsThread, ! 49: NULL, NULL, &threadId)) ! 50: MessageBox (NULL, "DevCapsDlgProc(): CreateThread() failed", ! 51: "Err! - PRINTER", MB_OK | MB_ICONHAND); ! 52: break; ! 53: } ! 54: case WM_COMMAND: ! 55: ! 56: switch (LOWORD(wParam)) ! 57: { ! 58: case IDOK: ! 59: EndDialog(hDlg, TRUE); ! 60: break; ! 61: } ! 62: return (TRUE); ! 63: } ! 64: return (FALSE); ! 65: } ! 66: ! 67: ! 68: ! 69: /******************************************************************************\ ! 70: * ! 71: * FUNCTION: DevCapsThread ! 72: * ! 73: * GLOBAL VARS: hDevCapsDlg - DevCaps dialog window handle ! 74: * hwndMain - main application window handle ! 75: * DriverName - driver name of currently selected printer ! 76: * DeviceName - device name of currently selected printer ! 77: * Port - port of currently selected printer ! 78: * ! 79: * LOCAL VARS: hdc - DC fr current device ! 80: * i - loop variable ! 81: * iValue - return value of GetDeviceCaps ! 82: * ! 83: * COMMENTS: Retrieves all device caps for a DC & calls TranslateCaps ! 84: * to insert them in the dialog's listbox. ! 85: * ! 86: \******************************************************************************/ ! 87: ! 88: void DevCapsThread () ! 89: { ! 90: HDC hdc; ! 91: int i, iValue; ! 92: ! 93: if (!strcmp (DeviceName, "Display")) ! 94: { ! 95: if (!(hdc = GetDC (hDevCapsDlg))) ! 96: { ! 97: MessageBox (hDevCapsDlg, "GetCapsDlgProc(): GetDC() failed", ! 98: "Err! - PRINTER", MB_OK); ! 99: return; ! 100: } ! 101: } ! 102: else ! 103: { ! 104: if (!(hdc = CreateDC (DriverName, DeviceName, Port, NULL))) ! 105: { ! 106: MessageBox (hDevCapsDlg, "GetCapsDlgProc(): CreateDC() failed", ! 107: "Err! - PRINTER", MB_OK); ! 108: return; ! 109: } ! 110: } ! 111: for (i = 0; i < MAX_NUM_DEVICE_CAPS; i++) ! 112: { ! 113: iValue = GetDeviceCaps (hdc, caps[i].x.iIndex); ! 114: TranslateCaps (i, caps[i].x.iIndex, iValue); ! 115: } ! 116: DeleteDC (hdc); ! 117: } ! 118: ! 119: ! 120: ! 121: /******************************************************************************\ ! 122: * ! 123: * FUNCTION: TranslateCaps ! 124: * ! 125: * INPUTS: arrayIndex - index into caps[] ! 126: * capIndex - devcap index (eg. TECHNOLOGY, CURVECAPS) ! 127: * iValue - value returned by GetDeviceCaps ! 128: * ! 129: * GLOBAL VARS: hDevCapsDlg - DevCaps dialog window handle ! 130: * caps - LOOKUPENTRY table for all caps ! 131: * technologies - " " for TECHNOLOGY-cap flags ! 132: * curves - " " for CURVECAPS flags ! 133: * lines - " " for LINECAPS flags ! 134: * polygons - " " for POLYGONALSCAPS flags ! 135: * text - " " for TEXTCAPS flags ! 136: * clip - " " for CLIPCAPS flags ! 137: * raster - " " for RASTERCAPS flags ! 138: * ! 139: * LOCAL VARS: buf - a temporary buffer ! 140: * ! 141: * COMMENTS: For simple devcaps (eg. tjose with single numeric return ! 142: * value), appends caps value to string and inserts into ! 143: * listbox. For "complex" caps (those returning multiple ! 144: * bit-values) calls ComplexCapsLine which handles text ! 145: * formattting & insertion. ! 146: * ! 147: \******************************************************************************/ ! 148: ! 149: void TranslateCaps (int arrayIndex, int capIndex, int iValue) ! 150: { ! 151: char buf[BIGBUFSIZE]; ! 152: ! 153: strcpy (buf, caps[arrayIndex].lpszValue); ! 154: switch (capIndex) ! 155: { ! 156: case TECHNOLOGY: ! 157: ! 158: ComplexCapLine (buf, technologies, MAX_NUM_TECHNOLOGY_CAPS, ! 159: iValue); ! 160: break; ! 161: ! 162: case CURVECAPS: ! 163: ! 164: ComplexCapLine (buf, curves, MAX_NUM_CURVE_CAPS, iValue); ! 165: break; ! 166: ! 167: case LINECAPS: ! 168: ! 169: ComplexCapLine (buf, lines, MAX_NUM_LINE_CAPS, iValue); ! 170: break; ! 171: ! 172: case POLYGONALCAPS: ! 173: ! 174: ComplexCapLine (buf, polygons, MAX_NUM_POLYGON_CAPS, iValue); ! 175: break; ! 176: ! 177: case TEXTCAPS: ! 178: ! 179: ComplexCapLine (buf, text, MAX_NUM_TEXT_CAPS, iValue); ! 180: break; ! 181: ! 182: case CLIPCAPS: ! 183: ! 184: ComplexCapLine (buf, clip, MAX_NUM_CLIP_CAPS, iValue); ! 185: break; ! 186: ! 187: case RASTERCAPS: ! 188: ! 189: ComplexCapLine (buf, raster, MAX_NUM_RASTER_CAPS, iValue); ! 190: break; ! 191: ! 192: default: ! 193: ! 194: wsprintf(buf, caps[arrayIndex].lpszValue, iValue); ! 195: SendDlgItemMessage (hDevCapsDlg, DID_LISTBOX, LB_INSERTSTRING, ! 196: (UINT)-1, (LONG) buf); ! 197: break; ! 198: } ! 199: } ! 200: ! 201: ! 202: ! 203: /******************************************************************************\ ! 204: * ! 205: * FUNCTION: ComplexCapLine ! 206: * ! 207: * INPUTS: pbuf - pointer to buffer containing a cap-type ! 208: * string ! 209: * pLkUp - pointer to a LOOKUPENTRY table ! 210: * iMaxEntries - # of enries in table pointed at by pLkUp ! 211: * iValue - an integer containing 1+ bit-value flags. ! 212: * ! 213: * GLOBAL VARS: hDevCapsDlg - DevCaps dialog window handle ! 214: * ! 215: * LOCAL VARS: i - loop variable ! 216: * bNewLine - flag specifying new line required ! 217: * ! 218: * COMMENTS: This function is used to expand an int containing ! 219: * multiple bit-values into a set of strings which are ! 220: * inserted into the DevCapsDlg listbox. The iValue ! 221: * parameter is checked against each iIndex entry in the ! 222: * LOOKUPENTRY table pointed at by pLkUp, and when matches ! 223: * are found the corresponding (lpszValue) string is ! 224: * inserted. ! 225: * ! 226: * The buffer pointed to by pbuf will be destroyed. ! 227: * ! 228: \******************************************************************************/ ! 229: ! 230: void ComplexCapLine (char *pbuf, LOOKUPENTRY *pLkUp, int iMaxEntries, ! 231: int iValue) ! 232: { ! 233: int i; ! 234: BOOL bNewLine = FALSE; ! 235: ! 236: for (i = 0; i < iMaxEntries; i++) ! 237: ! 238: if (iValue & (pLkUp + i)->x.iIndex) ! 239: { ! 240: if (bNewLine) ! 241: { ! 242: /**********************************************************************\ ! 243: * Keep the first symbolic constant on the same line as the ! 244: * cap type, eg: "TECHNOLOGY: DT_RASDISPLAY". ! 245: \**********************************************************************/ ! 246: ! 247: strcpy (pbuf, BLANKS); ! 248: strcat (pbuf, (pLkUp + i)->lpszValue); ! 249: } ! 250: else ! 251: { ! 252: /**********************************************************************\ ! 253: * Put symbolic constant on new line, eg: ! 254: * " DT_RASPRINTER". ! 255: \**********************************************************************/ ! 256: ! 257: strcat (pbuf, (pLkUp + i)->lpszValue); ! 258: bNewLine = TRUE; ! 259: } ! 260: SendDlgItemMessage (hDevCapsDlg, DID_LISTBOX, LB_INSERTSTRING, ! 261: (UINT)-1, (LONG) pbuf); ! 262: } ! 263: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.