|
|
1.1 ! root 1: /******************************************************************************\ ! 2: * ! 3: * PROGRAM: PRINTER.C ! 4: * ! 5: * PURPOSE: To demonstrate the printing of graphics & fonts in Win32. ! 6: * Also allows a user to enumerate all system printers ! 7: * (and graphically lists all info returned by EnumPrinters), ! 8: * print various graphics & fonts to each one, and to query ! 9: * the device capablities for each printer and the display. ! 10: * ! 11: * FUNTIONS: WinMain() - register class, create windows, ! 12: * msg loop ! 13: * MainWndProc() - processes main window msgs ! 14: * InvalidateClient() - invalidates client area, excluding ! 15: * toolbar ! 16: * ! 17: \******************************************************************************/ ! 18: ! 19: #include <windows.h> ! 20: #include "lookup.h" ! 21: #include "printer.h" ! 22: #include "paint.h" ! 23: #include "toolbar.h" ! 24: #include "vars.h" ! 25: ! 26: ! 27: ! 28: /******************************************************************************\ ! 29: * ! 30: * FUNCTION: WinMain (standard WinMain INPUTS/RETURNS) ! 31: * ! 32: * GLOBAL VARS: hInst - current program instance handle ! 33: * hWndMain - handle of the main standard window ! 34: * ! 35: * LOCAL VARS: wc - class initial;ization struct ! 36: * msg - msg to get/dispatch ! 37: * ! 38: * COMMENTS: Standard WinMain: registers a class, creates a window, ! 39: * creates a toolbar for the window, does a msg loop, then ! 40: * terminates. ! 41: * ! 42: \******************************************************************************/ ! 43: ! 44: int APIENTRY WinMain (HANDLE hInstance, HANDLE hPrevInstance, ! 45: LPSTR lpCmdLine, int nCmdShow) ! 46: { ! 47: WNDCLASS wc; ! 48: MSG msg; ! 49: ! 50: wc.style = CS_HREDRAW | CS_VREDRAW; ! 51: wc.lpfnWndProc = (WNDPROC)MainWndProc; ! 52: wc.cbClsExtra = 0; ! 53: wc.cbWndExtra = 0; ! 54: wc.hInstance = hInstance; ! 55: wc.hIcon = LoadIcon(hInstance, "printericon"); ! 56: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 57: wc.hbrBackground = GetStockObject(WHITE_BRUSH); ! 58: wc.lpszMenuName = "PrinterMenu"; ! 59: wc.lpszClassName = "PrinterSampleClass"; ! 60: ! 61: if (!RegisterClass(&wc)) ! 62: return 0; ! 63: ! 64: hInst = hInstance; ! 65: CreateWindow ("PrinterSampleClass", "PRINTER Sample App", ! 66: WS_OVERLAPPEDWINDOW, ! 67: CW_USEDEFAULT, CW_USEDEFAULT, ! 68: CW_USEDEFAULT, CW_USEDEFAULT, ! 69: NULL, NULL, hInstance, NULL); ! 70: ! 71: if (!hWndMain) ! 72: return 0; ! 73: ! 74: if (!CreateDialog (hInst, (LPTSTR)"PrinterToolbar", hWndMain, ! 75: (DLGPROC) ToolbarProc)) ! 76: MessageBox (NULL, "CreateDialog failed", "Err!", MB_OK); ! 77: ! 78: ShowWindow (hWndMain, nCmdShow); ! 79: UpdateWindow (hWndMain); ! 80: ! 81: while (GetMessage(&msg, NULL,NULL,NULL)) ! 82: { ! 83: TranslateMessage(&msg); ! 84: DispatchMessage(&msg); ! 85: } ! 86: return (msg.wParam); ! 87: } ! 88: ! 89: ! 90: ! 91: /******************************************************************************\ ! 92: * ! 93: * FUNCTION: MainWndProc (standard window procedure INPUTS/RETURNS) ! 94: * ! 95: * GLOBAL VARS: hInst - current program instance handle ! 96: * iMapMode - current map mode (eg. MM_TEXT) ! 97: * dwGraphicsOptions - current graphics to draw in client ! 98: * area ! 99: * ! 100: * LOCAL VARS: hMenu - handle of main menu ! 101: * hMapModesSubMenu - handle of "Map modes" submenu ! 102: * hGraphicsSubMenu - handle of "Graphics" submenu ! 103: * wLastMapMode - menu id corresponding to last map mode ! 104: * ! 105: * COMMENTS: The value of the iMapMode and dwGraphicsOptions variables ! 106: * determines the output when the Paint() routine is called ! 107: * in the WM_PAINT procedure. ! 108: * ! 109: \******************************************************************************/ ! 110: ! 111: LONG APIENTRY MainWndProc (HWND hWnd, UINT message,UINT wParam,LONG lParam) ! 112: { ! 113: static HMENU hMenu, hMapModesSubMenu, hGraphicsSubMenu; ! 114: static WORD wLastMapMode; ! 115: ! 116: switch (message) ! 117: { ! 118: case WM_COMMAND: ! 119: ! 120: switch (LOWORD(wParam)) ! 121: { ! 122: case IDM_HIENGLISH: ! 123: case IDM_HIMETRIC: ! 124: case IDM_LOENGLISH: ! 125: case IDM_LOMETRIC: ! 126: case IDM_TWIPS: ! 127: case IDM_ISOTROPIC: ! 128: case IDM_ANISOTROPIC: ! 129: case IDM_TEXT: ! 130: ! 131: /********************************************************************\ ! 132: * Uncheck the last map mode menuitem, check the new map mode ! 133: * menuitem, set iMapMode according to menu id, and invalidate ! 134: * the client area so it'll be redrawn. ! 135: \********************************************************************/ ! 136: ! 137: CheckMenuItem (hMapModesSubMenu, wLastMapMode, ! 138: MF_UNCHECKED | MF_BYCOMMAND); ! 139: CheckMenuItem (hMapModesSubMenu, LOWORD(wParam), ! 140: MF_CHECKED | MF_BYCOMMAND); ! 141: iMapMode = iLookupWord (iMapModesLkUpW, LOWORD(wParam), ! 142: MAX_MAPMODES); ! 143: InvalidateClient (); ! 144: wLastMapMode = LOWORD(wParam); ! 145: break; ! 146: ! 147: case IDM_ARC: ! 148: case IDM_ELLIPSE: ! 149: case IDM_LINETO: ! 150: case IDM_PIE: ! 151: case IDM_POLYBEZIER: ! 152: case IDM_POLYGON: ! 153: case IDM_POLYLINE: ! 154: case IDM_POLYPOLYGON: ! 155: case IDM_RECTANGLE: ! 156: case IDM_ROUNDRECT: ! 157: case IDM_STRETCHBLT: ! 158: case IDM_TEXTOUT: ! 159: { ! 160: /********************************************************************\ ! 161: * Retrieve the DWORD flag value for the particular menuitem, ! 162: * toggle (un/check) the menuitem, set/clear the flag in ! 163: * dwGraphicsOptions, and invalidate the client area so it'll ! 164: * be redrawn. ! 165: \********************************************************************/ ! 166: ! 167: DWORD dwGraphic = dwLookupWord (dwGraphicsLkUpW, LOWORD(wParam), ! 168: MAX_GRAPHICS); ! 169: ! 170: if (GetMenuState (hGraphicsSubMenu, LOWORD(wParam), ! 171: MF_BYCOMMAND) & MF_CHECKED) ! 172: { dwGraphicsOptions &= ~dwGraphic; ! 173: CheckMenuItem (hGraphicsSubMenu, LOWORD(wParam), ! 174: MF_UNCHECKED | MF_BYCOMMAND); ! 175: } ! 176: else ! 177: { ! 178: /******************************************************************\ ! 179: * Clear/uncheck the ENUMFONTS flag/menuitem ! 180: \******************************************************************/ ! 181: ! 182: dwGraphicsOptions &= ~ENUMFONTS; ! 183: CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS, ! 184: MF_UNCHECKED | MF_BYCOMMAND); ! 185: ! 186: dwGraphicsOptions |= dwGraphic; ! 187: CheckMenuItem (hGraphicsSubMenu, LOWORD(wParam), ! 188: MF_CHECKED | MF_BYCOMMAND); ! 189: } ! 190: InvalidateClient (); ! 191: break; ! 192: } ! 193: case IDM_ALLGRAPHICS: ! 194: { ! 195: UINT i; ! 196: ! 197: /********************************************************************\ ! 198: * Clear/uncheck the ENUMFONTS flag/menuitem, set/check all ! 199: * other graphics flags/menuitems, and invalidate the client ! 200: * area so it'll be repainted. ! 201: \********************************************************************/ ! 202: ! 203: dwGraphicsOptions = 0; ! 204: CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS, ! 205: MF_UNCHECKED | MF_BYCOMMAND); ! 206: ! 207: for (i = 0; i < MAX_GRAPHICS; i++) ! 208: { CheckMenuItem (hGraphicsSubMenu, IDM_ARC + i, ! 209: MF_CHECKED | MF_BYCOMMAND); ! 210: dwGraphicsOptions |= dwLookupWord (dwGraphicsLkUpW, ! 211: (WORD) (IDM_ARC+i), ! 212: MAX_GRAPHICS); ! 213: } ! 214: InvalidateClient (); ! 215: break; ! 216: } ! 217: case IDM_NOGRAPHICS: ! 218: { ! 219: UINT i; ! 220: ! 221: /********************************************************************\ ! 222: * Clear/uncheck all graphics flags/menuitems, and invalidate ! 223: * the client area so it'll be repainted. ! 224: \********************************************************************/ ! 225: ! 226: for (i = 0; i < MAX_GRAPHICS; i++) ! 227: CheckMenuItem (hGraphicsSubMenu, IDM_ARC + i, ! 228: MF_UNCHECKED | MF_BYCOMMAND); ! 229: ! 230: dwGraphicsOptions = 0; ! 231: ! 232: InvalidateClient (); ! 233: break; ! 234: } ! 235: case IDM_ENUMFONTS: ! 236: { ! 237: /********************************************************************\ ! 238: * Set/clear ENUMFONTS flag, toggle (un/check) menuitem, if ! 239: * checking IDM_ENUMFONTS then uncheck all other items, and ! 240: * invalidate the client area so it'll be repainted. ! 241: \********************************************************************/ ! 242: ! 243: if (GetMenuState (hGraphicsSubMenu, IDM_ENUMFONTS, ! 244: MF_BYCOMMAND) & MF_CHECKED) ! 245: { dwGraphicsOptions = 0; ! 246: CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS, ! 247: MF_UNCHECKED | MF_BYCOMMAND); ! 248: } ! 249: else ! 250: { SendMessage (hWnd, WM_COMMAND, IDM_NOGRAPHICS, 0); ! 251: ! 252: dwGraphicsOptions = ENUMFONTS; ! 253: CheckMenuItem (hGraphicsSubMenu, IDM_ENUMFONTS, ! 254: MF_CHECKED | MF_BYCOMMAND); ! 255: } ! 256: InvalidateClient (); ! 257: break; ! 258: } ! 259: } ! 260: break; ! 261: ! 262: case WM_PAINT: ! 263: { ! 264: PAINTSTRUCT ps; ! 265: RECT rect; ! 266: HDC hdc = BeginPaint (hWnd, &ps); ! 267: ! 268: GetClientRect (hWnd, &rect); ! 269: ! 270: if (iMapMode == MM_TEXT || iMapMode == MM_ANISOTROPIC) ! 271: ! 272: SetViewportOrgEx (hdc, 0, TOOLBARHEIGHT, NULL); ! 273: ! 274: else ! 275: ! 276: SetViewportOrgEx (hdc, 0, rect.bottom, NULL); ! 277: ! 278: rect.bottom -= TOOLBARHEIGHT; ! 279: SetMapMode (hdc, iMapMode); ! 280: Paint (hdc, &rect); ! 281: EndPaint (hWnd, &ps); ! 282: break; ! 283: } ! 284: case WM_CREATE: ! 285: ! 286: hWndMain = hWnd; ! 287: hMenu = GetMenu (hWnd); ! 288: hMapModesSubMenu = GetSubMenu (hMenu, 0); ! 289: hGraphicsSubMenu = GetSubMenu (hMenu, 1); ! 290: SendMessage (hWnd, WM_COMMAND, (DWORD) MAKELONG (IDM_TEXT,0), 0); ! 291: SendMessage (hWnd, WM_COMMAND, ! 292: (DWORD) MAKELONG (IDM_ALLGRAPHICS,0), 0); ! 293: break; ! 294: ! 295: case WM_DESTROY: ! 296: ! 297: PostQuitMessage(0); ! 298: break; ! 299: ! 300: default: ! 301: ! 302: return (DefWindowProc(hWnd, message, wParam, lParam)); ! 303: } ! 304: return (NULL); ! 305: } ! 306: ! 307: ! 308: ! 309: /******************************************************************************\ ! 310: * ! 311: * FUNCTION: InvalidateClient ! 312: * ! 313: * GLOBAL VARS: hWndMain - main app window handle ! 314: * ! 315: * COMMENTS: Eliminates the flashing of the toolbar when we redraw ! 316: * ! 317: \******************************************************************************/ ! 318: ! 319: void InvalidateClient () ! 320: { ! 321: RECT r; ! 322: ! 323: GetClientRect (hWndMain, &r); ! 324: ! 325: r.top += TOOLBARHEIGHT; ! 326: ! 327: InvalidateRect (hWndMain, &r, TRUE); ! 328: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.