|
|
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.