|
|
1.1 root 1: #define NOMINMAX
2: #include <windows.h>
1.1.1.2 root 3:
1.1 root 4: #include "FontView.H"
1.1.1.2 root 5:
1.1 root 6: #include <math.h>
1.1.1.2 root 7: #include <stdlib.h>
1.1 root 8: #include <string.h>
9: #include <time.h>
10:
1.1.1.2 root 11: #if !defined (WIN32)
12: #define APIENTRY FAR PASCAL
13: typedef unsigned int UINT;
14: #define WNDPROC FARPROC
1.1.1.3 ! root 15: #define DLGPROC FARPROC
1.1 root 16: #endif
17:
18:
19: char szAppName[] = "FontView";
20: char szAppTitle[] = "FontView - A Font Examination Utility";
21:
1.1.1.2 root 22: BOOL bZoomed = FALSE;
23:
1.1 root 24: HWND hwndMain, hwndClient;
1.1.1.2 root 25: HWND hwndMenuField, hwndTimeField;
26: HWND hwndLabel1, hwndCreateParam, hwndCreateValue, hwndZoom;
1.1 root 27:
28: LOGFONT lf = {0,0,0,0,0,0,0,0,0,0,0,0,0,""};
29:
30: HMENU hSysMenuMain = (HMENU)NULL;
31: HMENU hFileMenu = (HMENU)NULL;
32: HMENU hEditMenu = (HMENU)NULL;
1.1.1.2 root 33: HMENU hViewMenu = (HMENU)NULL;
34: HMENU hMetricsMenu = (HMENU)NULL;
1.1 root 35: HMENU hHelpMenu = (HMENU)NULL;
36: HMENU hSysMenuAdv = (HMENU)NULL;
37: HMENU hMenu = (HMENU)NULL;
38:
39: LONG APIENTRY WndProc (HWND, UINT, UINT, LONG);
40: LONG APIENTRY ClientProc (HWND, UINT, UINT, LONG);
1.1.1.2 root 41: LONG APIENTRY ClientCharSetProc (HWND, UINT, UINT, LONG);
42: LONG APIENTRY ClientGlyphProc (HWND, UINT, UINT, LONG);
43:
1.1 root 44: BOOL FillInParam (HWND, int);
45: BOOL FillInValue (HWND, int);
46: int FAR PASCAL EnumFontNames (LPLOGFONT, LPTEXTMETRIC, short, LPINT);
47:
1.1.1.2 root 48: WNDPROC fpCharSetProc = 0;
49: WNDPROC fpGlyphProc = 0;
1.1 root 50:
51: /* Dialogs.C Prototypes */
52: BOOL APIENTRY SimpleDlgProc (HWND, UINT, UINT, LONG);
53: BOOL APIENTRY CreateDlgProc (HWND, UINT, UINT, LONG);
54: BOOL APIENTRY MetricsDlgProc (HWND, UINT, UINT, LONG);
55: BOOL APIENTRY EnumDlgProc (HWND, UINT, UINT, LONG);
56:
57: /* Display.C Prototypes */
58: void DrawAscii (HDC hdc, RECT *pRect, WORD direction);
1.1.1.2 root 59: BYTE FindChar (HDC hdc, RECT *pRect, int x, int y);
60: void DrawGlyph (HDC hdc, RECT *pRect, BYTE glyph, HFONT hfont);
1.1 root 61:
62: /* ToolBar.C Prototypes */
63: BOOL InitToolBar (HANDLE);
1.1.1.2 root 64: BOOL CreateToolBar (HWND, HANDLE, int);
1.1 root 65: BOOL AdjustToolBar (HWND);
1.1.1.2 root 66: HWND AddToolLabel (HANDLE , int, LPSTR, int, DWORD);
67: HWND AddToolCombo (HANDLE, int, int, DWORD);
68: HWND AddToolButton (HANDLE, int, LPSTR, int, int, DWORD);
69: BOOL AddToolSpace (int, int);
1.1 root 70: int ToolBarHeight (HWND);
71:
72: /* StatusBar.C Prototypes */
73: BOOL InitStatusBar (HANDLE);
1.1.1.2 root 74: BOOL CreateStatusBar (HWND, HANDLE, int);
1.1 root 75: BOOL AdjustStatusBar (HWND);
1.1.1.2 root 76: HWND AddStatusField (HANDLE, int, int, int, BOOL);
1.1 root 77: int StatusBarHeight (HWND);
78:
79:
80: int APIENTRY WinMain(HANDLE hInst, HANDLE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
81: {
82:
1.1.1.2 root 83: MSG msg;
84: WNDCLASS wndclass;
85: HANDLE hAccelTable;
86:
87: if (!hPrevInst) {
88: wndclass.style = CS_HREDRAW | CS_VREDRAW;
89: #if defined(WIN32)
90: wndclass.lpfnWndProc = (WNDPROC)WndProc;
91: #else
92: wndclass.lpfnWndProc = WndProc;
1.1 root 93: #endif
1.1.1.2 root 94: wndclass.cbClsExtra = 0;
95: wndclass.cbWndExtra = 0;
96: wndclass.hInstance = hInst;
97: wndclass.hIcon = LoadIcon (hInst, szAppName);
98: wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
99: wndclass.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE+1);
100: wndclass.lpszMenuName = szAppName;
101: wndclass.lpszClassName = szAppName;
102:
103: if (!RegisterClass (&wndclass)) {
104: return FALSE;
105: }
106:
107: wndclass.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
108: #if defined(WIN32)
109: wndclass.lpfnWndProc = (WNDPROC)ClientProc;
110: #else
111: wndclass.lpfnWndProc = ClientProc;
112: #endif
113: wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
114: wndclass.lpszMenuName = NULL;
115: wndclass.lpszClassName = "FontClient";
116:
117: if (!RegisterClass (&wndclass)) {
118: return FALSE;
119: }
120:
121: fpCharSetProc = MakeProcInstance ((WNDPROC)ClientCharSetProc, hInst);
122: fpGlyphProc = MakeProcInstance ((WNDPROC)ClientGlyphProc, hInst);
123:
124: if (!InitToolBar (hInst)) {
125: return FALSE;
126: }
127:
128: if (!InitStatusBar (hInst)) {
129: return FALSE;
130: }
131: }
132:
133:
134: hwndMain = CreateWindow (szAppName, szAppName,
135: WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
136: CW_USEDEFAULT, 0,
137: CW_USEDEFAULT, 0,
138: NULL, NULL, hInst, NULL);
139:
140: if (!hwndMain) {
141: return FALSE;
142: }
143: /* Get handles to the various menus. Some of these we will use later */
144: /* to display menu descriptions in the status bar */
145: hSysMenuMain = GetSystemMenu(hwndMain,FALSE);
146: hMenu = GetMenu(hwndMain);
147: if (hMenu) {
148: hFileMenu = GetSubMenu(hMenu,0);
149: hEditMenu = GetSubMenu(hMenu,1);
150: hViewMenu = GetSubMenu(hMenu, 2);
151: hMetricsMenu = GetSubMenu(hMenu,3);
152: hHelpMenu = GetSubMenu(hMenu,4);
153: }
154:
155: if (CreateToolBar (hwndMain, hInst, ID_TOOLBAR)) {
156: hwndLabel1 = AddToolLabel (hInst, 0, "CreateFont:", 0, SS_RIGHT);
157: AddToolSpace (6, 0);
158: hwndCreateParam = AddToolCombo (hInst, ID_CREATEPARAM, -25, CBS_DROPDOWN | WS_VSCROLL);
159: FillInParam (hwndCreateParam, 0);
160:
161: AddToolSpace (10, 0);
162: hwndCreateValue = AddToolCombo (hInst, ID_CREATEVALUE, -30, CBS_DROPDOWN | WS_VSCROLL);
163: FillInValue (hwndCreateValue, CFP_BASE+0);
164:
165: AddToolSpace (10, 0);
166: hwndZoom = AddToolButton (hInst, ID_ZOOM, "ZOOM", 24, 0, BS_OWNERDRAW);
167:
168: } else {
169: return FALSE;
170: }
171:
172:
173: if (CreateStatusBar (hwndMain, hInst, ID_STATUSBAR)) {
174: hwndMenuField = AddStatusField (hInst, ID_MENUFIELD, 100, 0, FALSE);
175: hwndTimeField = AddStatusField (hInst, ID_TIMEFIELD, -13, -13, TRUE);
176: if (hwndTimeField) {
177: SetTimer (hwndMain, 1, 1000, NULL);
178: }
179: } else {
180: return FALSE;
181: }
182:
183: hwndClient = CreateWindow ("FontClient", "FontClient",
184: WS_CHILD | WS_CLIPSIBLINGS | WS_BORDER | WS_VISIBLE,
185: 0, 0, 0, 0,
186: hwndMain,(HMENU)666, hInst, NULL);
187:
188: SetWindowLong (hwndClient, GWL_WNDPROC, (DWORD)fpCharSetProc);
189: bZoomed = FALSE;
190:
191: if (!hwndMain) {
192: return FALSE;
193: }
194:
195: ShowWindow (hwndMain, nCmdShow);
196: //UpdateWindow (hwndMain);
197:
198: hAccelTable = LoadAccelerators (hInst, szAppName);
199:
200: while (GetMessage (&msg, NULL, 0, 0)) {
201: if (!TranslateAccelerator (hwndMain, hAccelTable, &msg)) {
202: TranslateMessage (&msg);
203: DispatchMessage (&msg);
204: }
205: }
1.1 root 206:
207:
1.1.1.2 root 208: return msg.wParam;
1.1 root 209:
1.1.1.2 root 210: lpCmdLine; // Just to resolve reference
1.1 root 211: }
212:
1.1.1.2 root 213:
214: /* ================================================================================================ *\
215: Fill in the first combo box with all the different 'CreateFont' parameters that we can change
216: \* ================================================================================================ */
1.1 root 217: BOOL FillInParam (HWND hwnd, int focus)
218: {
1.1.1.2 root 219: int index;
1.1 root 220:
1.1.1.2 root 221: index = 0;
222: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"nHeight");
223: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_HEIGHT);
224: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"nWidth");
225: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_WIDTH);
226: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"nEscapement");
227: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_ESCAPEMENT);
228: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"nOrientation");
229: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_ORIENTATION);
230: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"nWeight");
231: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_WEIGHT);
232: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cItalic");
233: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_ITALIC);
234: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cUnderline");
235: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_UNDERLINE);
236: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cStrikeOut");
237: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_STRIKEOUT);
238: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cCharSet");
239: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_CHARSET);
240: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cOutputPrecision");
241: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_OUTPUTPRECISION);
242: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cClipPrecision");
243: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_CLIPPRECISION);
244: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cQuality");
245: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_QUALITY);
246: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"cPitch...");
247: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_PITCH);
248: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"c...Family");
249: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_FAMILY);
250: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"lpFacename");
251: SendMessage (hwnd, CB_SETITEMDATA, index++, CFP_FACENAME);
252: SendMessage (hwnd, CB_SETCURSEL, focus, 0);
253: return TRUE;
1.1 root 254: }
255:
1.1.1.2 root 256: /* ================================================================================================ *\
257: Fill in the second combo box with valid values, based on the current setting in the first combo
258: \* ================================================================================================ */
1.1 root 259: BOOL FillInValue (HWND hwnd, int param)
260: {
1.1.1.2 root 261: int i, index, focus;
262: long data;
263: char szTmp[80];
264: ATOM atom;
265: HDC hdc;
266: FARPROC lpEnumFonts;
267: HANDLE hInst;
268:
269: SendMessage (hwnd, CB_RESETCONTENT, 0, 0);
270: focus = -1;
271: index = 0;
272:
273: // Each of the following cases will contain two different 'loops', the first one will fill the
274: // combo box with values, the second will locate the current setting in the combobox and set
275: // the focus to it. If the value is not currently in the combobox, then it will be inserted at
276: // the proper location.
277:
278: switch (param) {
279: case CFP_HEIGHT:
280: // Lets just toss in a range of heights, from -72 to 72, by twos
281: // If the user wants to enter in a custom value, they need to use
282: // the 'CreateFont' dialog for now.
283: for (i=-72; i<72; i+=2) {
284: if (i < 0) {
285: wsprintf (szTmp, "%d = cell height = %u", i, abs(i));
286: } else if (i == 0) {
287: wsprintf (szTmp, "%u = default", i);
288: } else {
289: wsprintf (szTmp, "%u = character height", i);
290: }
291: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)szTmp);
292: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)i);
293: }
294:
295: for (i=0; i<index; i++) {
296: data = (long)SendMessage (hwnd, CB_GETITEMDATA, i, 0);
297: if (data == lf.lfHeight) {
298: focus = i;
299: break;
300: } else if (data > lf.lfHeight) {
301: wsprintf (szTmp, "%u", lf.lfHeight);
302: SendMessage (hwnd, CB_INSERTSTRING, i, (DWORD)(LPSTR)szTmp);
303: SendMessage (hwnd, CB_SETITEMDATA, i, (DWORD)lf.lfHeight);
304: focus = i;
305: break;
306: }
307: }
308: if (focus == -1) {
309: wsprintf (szTmp, "%u", lf.lfHeight);
310: focus = (int)SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)szTmp);
311: SendMessage (hwnd, CB_SETITEMDATA, focus, (DWORD)lf.lfHeight);
312: }
313:
314: break;
315:
316: case CFP_WIDTH:
317: // Lets just toss in a range of widths, from 0 to 72, by twos
318: // If the user wants to enter in a custom value, they need to use
319: // the 'CreateFont' dialog for now.
320: for (i=0; i<72; i+=2) {
321: if (i==0) {
322: wsprintf (szTmp, "%u = default aspect", i);
323: } else {
324: wsprintf (szTmp, "%u", i);
325: }
326: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)szTmp);
327: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)i);
328: }
329: for (i=0; i<index; i++) {
330: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
331: if (data == lf.lfWidth) {
332: focus = i;
333: break;
334: } else if (data > lf.lfWidth) {
335: wsprintf (szTmp, "%u", lf.lfWidth);
336: SendMessage (hwnd, CB_INSERTSTRING, i, (DWORD)(LPSTR)szTmp);
337: SendMessage (hwnd, CB_SETITEMDATA, i, (DWORD)lf.lfWidth);
338: focus = i;
339: break;
340: }
341: }
342: break;
343:
344: case CFP_ESCAPEMENT:
345: for (i=0; i<4500; i+=10) {
346: wsprintf (szTmp, "%u = (%u/10 degrees)", i, i);
347: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)szTmp);
348: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)i);
349: }
350: for (i=0; i<index; i++) {
351: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
352: if (data == lf.lfEscapement) {
353: focus = i;
354: break;
355: } else if (data > lf.lfEscapement) {
356: wsprintf (szTmp, "%u = (%u/10 degrees)", lf.lfWidth);
357: SendMessage (hwnd, CB_INSERTSTRING, i, (DWORD)(LPSTR)szTmp);
358: SendMessage (hwnd, CB_SETITEMDATA, i, (DWORD)lf.lfEscapement);
359: focus = i;
360: break;
361: }
362: }
363: break;
364:
365: case CFP_ORIENTATION:
366: for (i=0; i<4500; i+=10) {
367: wsprintf (szTmp, "%u = (%u/10 degrees)", i, i);
368: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)szTmp);
369: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)i);
370: }
371: for (i=0; i<index; i++) {
372: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
373: if (data == lf.lfOrientation) {
374: focus = i;
375: break;
376: } else if (data > lf.lfOrientation) {
377: wsprintf (szTmp, "%u = (%u/10 degrees)", lf.lfWidth);
378: SendMessage (hwnd, CB_INSERTSTRING, i, (DWORD)(LPSTR)szTmp);
379: SendMessage (hwnd, CB_SETITEMDATA, i, (DWORD)lf.lfOrientation);
380: focus = i;
381: break;
382: }
383: }
384: break;
385:
386: case CFP_WEIGHT:
387: index = 0;
388: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"0 = FW_DONTCARE");
389: SendMessage (hwnd, CB_SETITEMDATA, index++, 0);
390: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"100 = FW_THIN");
391: SendMessage (hwnd, CB_SETITEMDATA, index++, 100);
392: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"200 = FW_EXTRALIGHT");
393: SendMessage (hwnd, CB_SETITEMDATA, index++, 200);
394: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"300 = FW_LIGHT");
395: SendMessage (hwnd, CB_SETITEMDATA, index++, 300);
396: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"400 = FW_NORMAL");
397: SendMessage (hwnd, CB_SETITEMDATA, index++, 400);
398: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"500 = FW_MEDIUM");
399: SendMessage (hwnd, CB_SETITEMDATA, index++, 500);
400: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"600 = FW_SEMIBOLD");
401: SendMessage (hwnd, CB_SETITEMDATA, index++, 600);
402: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"700 = FW_BOLD");
403: SendMessage (hwnd, CB_SETITEMDATA, index++, 700);
404: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"800 = FW_EXTRABOLD");
405: SendMessage (hwnd, CB_SETITEMDATA, index++, 800);
406: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"900 = FW_HEAVY");
407: SendMessage (hwnd, CB_SETITEMDATA, index++, 900);
408:
409: for (i=0; i<index; i++) {
410: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
411: if (data == lf.lfWeight) {
412: focus = i;
413: break;
414: } else if (data > lf.lfWeight) {
415: wsprintf (szTmp, "%u", lf.lfWeight);
416: SendMessage (hwnd, CB_INSERTSTRING, i, (DWORD)(LPSTR)szTmp);
417: focus = i;
418: break;
419: }
420: }
421: break;
422:
423: case CFP_ITALIC:
424: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FALSE");
425: SendMessage (hwnd, CB_SETITEMDATA, 0, (DWORD)FALSE);
426: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"TRUE");
427: SendMessage (hwnd, CB_SETITEMDATA, 1, (DWORD)TRUE);
428: focus = (lf.lfItalic?1:0);
429: break;
430:
431: case CFP_UNDERLINE:
432: index=0;
433: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FALSE");
434: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FALSE);
435: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"TRUE");
436: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)TRUE);
437: focus = (lf.lfUnderline?1:0);
438: break;
439:
440: case CFP_STRIKEOUT:
441: index=0;
442: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FALSE");
443: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FALSE);
444: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"TRUE");
445: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)TRUE); \
446: focus = (lf.lfStrikeOut?1:0);
447: break;
448:
449: case CFP_CHARSET:
450: index = 0;
451: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"0 = ANSI_CHARSET");
452: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)ANSI_CHARSET);
453: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"SYMBOL_CHARSET");
454: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)SYMBOL_CHARSET);
455: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"SHIFTJIS_CHARSET");
456: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)SHIFTJIS_CHARSET);
457: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"OEM_CHARSET");
458: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)OEM_CHARSET);
459: for (i=0; i<index; i++) {
460: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
461: if (data == (long)lf.lfCharSet) {
462: focus = i;
463: break;
464: }
465: }
466: break;
467:
468: break;
469:
470: case CFP_OUTPUTPRECISION:
471: index=0;
472: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"0 = OUT_DEFAULT_PRECIS");
473: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)OUT_DEFAULT_PRECIS);
474: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"OUT_STRING_PRECIS");
475: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)OUT_STRING_PRECIS);
476: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"OUT_CHARACTER_PRECIS");
477: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)OUT_CHARACTER_PRECIS);
478: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"OUT_STROKE_PRECIS");
479: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)OUT_STROKE_PRECIS);
480: for (i=0; i<index; i++) {
481: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
482: if (data == (long)lf.lfOutPrecision) {
483: focus = i;
484: break;
485: }
486: }
487: break;
488:
489: case CFP_CLIPPRECISION:
490: index=0;
491: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"0 = CLIP_DEFAULT_PRECIS");
492: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)CLIP_DEFAULT_PRECIS);
493: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"CLIP_CHARACTER_PRECIS");
494: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)CLIP_CHARACTER_PRECIS);
495: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"CLIP_STROKE_PRECIS");
496: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)CLIP_STROKE_PRECIS);
497: for (i=0; i<index; i++) {
498: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
499: if (data == (long)lf.lfClipPrecision) {
500: focus = i;
501: break;
502: }
503: }
504: break;
505:
506: case CFP_QUALITY:
507: index=0;
508: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"0 = DEFAULT_QUALITY");
509: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)DEFAULT_QUALITY);
510: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"DRAFT_QUALITY");
511: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)DRAFT_QUALITY);
512: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"PROOF_QUALITY");
513: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)PROOF_QUALITY);
514: for (i=0; i<index; i++) {
515: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
516: if (data == (long)lf.lfQuality) {
517: focus = i;
518: break;
519: }
520: }
521: break;
522:
523: case CFP_PITCH:
524: index=0;
525: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"0 = DEFAULT_PITCH");
526: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)DEFAULT_PITCH);
527: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FIXED_PITCH");
528: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FIXED_PITCH);
529: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"VARIABLE_PITCH");
530: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)VARIABLE_PITCH);
531: for (i=0; i<index; i++) {
532: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
533: if (data == (long)(0x03&lf.lfPitchAndFamily)) {
534: focus = i;
535: break;
536: }
537: }
538: break;
539:
540: case CFP_FAMILY:
541: index=0;
542: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"0 = FF_DONTCARE");
543: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FF_DONTCARE);
544: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FF_ROMAN");
545: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FF_ROMAN);
546: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FF_SWISS");
547: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FF_SWISS);
548: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FF_MODERN");
549: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FF_MODERN);
550: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FF_SCRIPT");
551: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FF_SCRIPT);
552: SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"FF_DECORATIVE");
553: SendMessage (hwnd, CB_SETITEMDATA, index++, (DWORD)FF_DECORATIVE);
554: for (i=0; i<index; i++) {
555: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
556: if (data == (long)(0xFC&lf.lfPitchAndFamily)) {
557: focus = i;
558: break;
559: }
560: }
561: break;
562:
563: case CFP_FACENAME:
564: index = (int)SendMessage (hwnd, CB_ADDSTRING, 0, (DWORD)(LPSTR)"(none)");
565: SendMessage (hwnd, CB_SETITEMDATA, index, 0);
566: if (lstrcmp(lf.lfFaceName, "(none)") == 0) {
567: lf.lfFaceName[0] = 0;
568: }
569: hdc = GetDC (hwnd);
1.1 root 570:
1.1.1.2 root 571: #if defined (WIN32)
572: hInst = (HANDLE)GetWindowLong (hwnd, GWL_HINSTANCE);
573: #else
574: hInst = GetWindowWord (hwnd, GWW_HINSTANCE);
1.1 root 575: #endif
1.1.1.2 root 576: lpEnumFonts = MakeProcInstance ((FARPROC)EnumFontNames, hInst);
1.1.1.3 ! root 577: EnumFonts (hdc, NULL, (FONTENUMPROC)lpEnumFonts, (LPARAM)&hwnd);
1.1.1.2 root 578: FreeProcInstance (lpEnumFonts);
579: ReleaseDC (hwnd, hdc);
580: atom = GlobalFindAtom ((LPSTR)lf.lfFaceName);
581: if (atom == NULL && (lstrlen (lf.lfFaceName)>0)) {
582: index = (int)SendMessage (hwnd, CB_ADDSTRING, 0, (LONG)(LPSTR)lf.lfFaceName);
583: focus = index;
584: } else if (lstrlen(lf.lfFaceName)==0) {
585: index = (int)SendMessage (hwnd, CB_FINDSTRING, (UINT)-1, (LONG)(LPSTR)"(none)");
586: focus = index;
587: } else {
588: index = (int)SendMessage (hwnd, CB_GETCOUNT, 0, 0);
589: for (i=0; i<index; i++) {
590: data = SendMessage (hwnd, CB_GETITEMDATA, i, 0);
591: if ((DWORD)data == (DWORD)atom) {
592: focus = i;
593: break;
594: }
595: }
596: }
597: break;
598: }
599: if (focus >= 0) {
600: SendMessage (hwnd, CB_SETCURSEL, focus, 0);
601: } else {
602: SendMessage (hwnd, CB_SETCURSEL, 0, 0);
603: }
604: return TRUE;
1.1 root 605: }
606:
607:
1.1.1.2 root 608: // Font enumeration callback. This adds the font name to the atom list.
609: int FAR PASCAL EnumFontNames (LPLOGFONT lpLogFont, LPTEXTMETRIC lpTextMetric, short nFontType, LPINT lpData)
610: {
611: HWND hwnd;
612: FARPROC lpFontEnumProc;
613: HDC hdc;
614: ATOM atom;
615: HWND hwndCombo;
616: int index;
617:
618: hwnd = GetFocus();
619: hdc = GetDC(hwnd);
620: hwndCombo = (HWND)*lpData;
621:
622: atom = GlobalFindAtom ((LPSTR)lpLogFont->lfFaceName);
623: if (atom == NULL) {
624: atom = GlobalAddAtom (lpLogFont->lfFaceName);
625: }
626: if (index = SendMessage(hwndCombo, CB_FINDSTRING, (UINT)-1, (LONG)(LPSTR)lpLogFont->lfFaceName) == CB_ERR) {
627: index = (int)SendMessage (hwndCombo, CB_ADDSTRING, 0, (LONG)(LPSTR)lpLogFont->lfFaceName);
628: SendMessage (hwndCombo, CB_SETITEMDATA, index, atom);
629: }
630:
631: ReleaseDC(hwnd, hdc);
632:
633: return TRUE;
634:
635: lpTextMetric; // unreferenced formal paramater
636: nFontType; // unreferenced formal parameter
637: lpFontEnumProc; // unreferenced formal parameter
1.1 root 638: }
639:
640:
1.1.1.2 root 641: // A quick little routine that will center one window over another, handy for dialog boxes.
1.1 root 642: BOOL CenterWindow (HWND hwndChild, HWND hwndParent)
643: {
1.1.1.2 root 644: RECT rChild, rParent;
645: int wChild, hChild, wParent, hParent;
646: int wScreen, hScreen, xNew, yNew;
647: HDC hdc;
648:
649: GetWindowRect (hwndChild, &rChild);
650: wChild = rChild.right - rChild.left;
651: hChild = rChild.bottom - rChild.top;
652:
653: GetWindowRect (hwndParent, &rParent);
654: wParent = rParent.right - rParent.left;
655: hParent = rParent.bottom - rParent.top;
656:
657: hdc = GetDC (hwndChild);
658: wScreen = GetDeviceCaps (hdc, HORZRES);
659: hScreen = GetDeviceCaps (hdc, VERTRES);
660: ReleaseDC (hwndChild, hdc);
661:
662: xNew = rParent.left + ((wParent - wChild) /2);
663: if (xNew < 0) {
664: xNew = 0;
665: } else if ((xNew+wChild) > wScreen) {
666: xNew = wScreen - wChild;
667: }
668:
669: yNew = rParent.top + ((hParent - hChild) /2);
670: if (yNew < 0) {
671: yNew = 0;
672: } else if ((yNew+hChild) > hScreen) {
673: yNew = hScreen - hChild;
674: }
1.1 root 675:
1.1.1.2 root 676: return SetWindowPos (hwndChild, NULL, xNew, yNew, 0, 0, SWP_NOSIZE | SWP_NOZORDER);
1.1 root 677: }
678:
679:
680: LONG APIENTRY WndProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam)
681: {
1.1.1.2 root 682: HANDLE hInst;
683: HDC hdc;
684: PAINTSTRUCT ps;
685: FARPROC lpDlgFunc;
686: char szMsg [80];
687: time_t lTime;
688: struct tm *datetime;
689:
1.1 root 690: #define HOUR (datetime->tm_hour)
691: #define MIN (datetime->tm_min)
692: #define SEC (datetime->tm_sec)
693:
1.1.1.2 root 694: char szTime [20];
695: int index;
696: RECT rect;
697:
698: static int idMenuSelect;
699: int tmp, wmEvent, wmId;
700: HWND wmhWnd;
701: POINT point;
702: BOOL bRedraw;
703: int wmMenuCmd, wmFlags;
704: HMENU wmhMenu;
705:
706: if (hwnd) {
707: #if defined (WIN32)
708: hInst = (HANDLE)GetWindowLong (hwnd, GWL_HINSTANCE);
1.1 root 709: #else
1.1.1.2 root 710: hInst = (HANDLE)GetWindowWord (hwnd, GWW_HINSTANCE);
1.1 root 711: #endif
1.1.1.2 root 712: }
1.1 root 713:
1.1.1.2 root 714: switch (msg) {
715: case WM_CREATE:
716: return DefWindowProc (hwnd, msg, wParam, lParam);
717: break;
718:
719: case WM_TIMER:
720: time (&lTime);
721: datetime = localtime (&lTime);
722: wsprintf (szTime, "%02d:%02d:%02d %s",
723: (HOUR%12?HOUR%12:12), MIN, SEC, (LPSTR)(HOUR/12?"PM":"AM"));
724: SetWindowText (hwndTimeField, szTime);
725: break;
726:
727: case WM_SIZE:
728: AdjustToolBar (hwnd);
729: AdjustStatusBar (hwnd);
730: GetClientRect (hwnd, &rect);
731: rect.top += ToolBarHeight (hwnd);
732: rect.bottom -= StatusBarHeight (hwnd);
733: SetWindowPos (hwndClient, NULL, rect.left, rect.top, rect.right-rect.left, rect.bottom-rect.top, SWP_NOZORDER);
734: break;
735:
736: case WM_CHAR:
737: switch (wParam) {
738: case VK_F10:
739: wParam = VK_MENU;
740: return DefWindowProc (hwnd, msg, wParam, lParam);
741: break;
742: }
743: break;
744:
745: case WM_PARENTNOTIFY:
746: #if defined (WIN32)
747: wmEvent = wParam; // Same as Win16, but only on (x,y) msgs
748: #else
749: wmEvent = wParam;
1.1 root 750: #endif
1.1.1.2 root 751: point.x = (int)LOWORD(lParam);
752: point.y = (int)HIWORD(lParam);
1.1 root 753:
1.1.1.2 root 754: ClientToScreen (hwnd, &point);
755: wmhWnd = WindowFromPoint(point);
756: if (wmhWnd) {
757: #if defined (WIN32)
758: wmId = GetWindowLong (wmhWnd, GWL_ID);
759: #else
760: wmId = GetWindowWord (wmhWnd, GWW_ID);
1.1 root 761: #endif
1.1.1.2 root 762: } else {
763: break;
1.1 root 764: }
1.1.1.2 root 765: switch (wmEvent) {
766: case WM_LBUTTONDOWN:
767: case WM_MBUTTONDOWN:
768: case WM_RBUTTONDOWN:
769: if (!LoadString (hInst, (UINT)wmId, szMsg, sizeof(szMsg))) {
770: wsprintf ((LPSTR)szMsg, "Unable to load ParentNotify string #%u", wmId);
771: }
772: SetWindowText (hwndMenuField, szMsg);
773: break;
774: }
775: break;
776:
777: case WM_COMMAND:
778: #if defined (WIN32)
779: wmId = LOWORD(wParam);
780: wmEvent = HIWORD(wParam);
781: #else
782: wmId = wParam;
783: wmEvent = HIWORD(lParam);
1.1 root 784: #endif
785:
1.1.1.2 root 786: switch (wmId) {
787: case ID_CREATEPARAM:
788:
789: switch (wmEvent) {
790: case CBN_SETFOCUS: //Indicates that the combo box has received input focus.
791: case CBN_DROPDOWN: //Informs the owner of the combo box that its list box is about to be dropped down.
792: if (!LoadString (hInst, wmId, szMsg, sizeof(szMsg))) {
793: wsprintf ((LPSTR)szMsg, "Unable to load FontName string #%u", wmId);
794: }
795: SetWindowText (hwndMenuField, szMsg);
796: break;
797:
798: case CBN_SELCHANGE: //Sent when the selection has been changed.
799: index = (int)SendMessage (hwndCreateParam, CB_GETCURSEL, 0, 0);
800: if (index != CB_ERR) {
801: SendMessage (hwndCreateParam, CB_GETLBTEXT, index, (LONG)(LPSTR)szMsg);
802: FillInValue (hwndCreateValue, CFP_BASE+index);
803: } else {
804: wsprintf (szMsg, "FontName: CB_ERR while retrieving text");
805: }
806: SetWindowText (hwndMenuField, szMsg);
807: break;
808: }
809: break;
810:
811: case ID_CREATEVALUE:
812: switch (wmEvent){
813: int iCreateParam;
814: int iParamValue;
815:
816: case CBN_SETFOCUS: //Indicates that the combo box has received input focus.
817: case CBN_DROPDOWN: //Informs the owner of the combo box that its list box is about to be dropped down.
818: if (!LoadString (hInst, wmId, szMsg, sizeof(szMsg))) {
819: wsprintf (szMsg, "Unable to load FontSize string #%u", wmId);
820: }
821: break;
822:
823: case CBN_SELCHANGE: //Sent when the selection has been changed.
824: index = (int)SendMessage (hwndCreateValue, CB_GETCURSEL, 0, 0);
825: bRedraw = FALSE;
826: if (index != CB_ERR) {
827: SendMessage (hwndCreateValue, CB_GETLBTEXT, index, (LONG)(LPSTR)szMsg);
828: iCreateParam =
829: (int)SendMessage (hwndCreateParam, CB_GETITEMDATA,
830: (WORD)SendMessage (hwndCreateParam, CB_GETCURSEL, 0, (DWORD)0),
831: (DWORD)0);
832: iParamValue = (int)SendMessage (hwndCreateValue, CB_GETITEMDATA, index, 0);
833:
834: switch (iCreateParam) {
835: BYTE tmpByte;
836:
837: case CFP_HEIGHT:
838: if (lf.lfHeight != iParamValue) {
839: lf.lfHeight = iParamValue;
840: bRedraw = TRUE;
841: }
842: break;
843:
844: case CFP_WIDTH:
845: if (lf.lfWidth != iParamValue) {
846: lf.lfWidth = iParamValue;
847: bRedraw = TRUE;
848: }
849: break;
850:
851: case CFP_ESCAPEMENT:
852: if (lf.lfEscapement != iParamValue) {
853: lf.lfEscapement= iParamValue;
854: bRedraw = TRUE;
855: }
856: break;
857:
858: case CFP_ORIENTATION:
859: if (lf.lfOrientation!= iParamValue) {
860: lf.lfOrientation= iParamValue;
861: bRedraw = TRUE;
862: }
863: break;
864:
865: case CFP_WEIGHT:
866: if (lf.lfWeight != iParamValue) {
867: lf.lfWeight= iParamValue;
868: bRedraw = TRUE;
869: }
870: break;
871:
872: case CFP_ITALIC:
873: if ((int)lf.lfItalic != iParamValue) {
874: lf.lfItalic = (BYTE)iParamValue;
875: bRedraw = TRUE;
876: }
877: break;
878:
879: case CFP_UNDERLINE:
880: if (lf.lfUnderline != (BYTE)iParamValue) {
881: lf.lfUnderline= (BYTE)iParamValue;
882: bRedraw = TRUE;
883: }
884: break;
885:
886: case CFP_STRIKEOUT:
887: if (lf.lfStrikeOut != (BYTE)iParamValue) {
888: lf.lfStrikeOut= (BYTE)iParamValue;
889: bRedraw = TRUE;
890: }
891: break;
892:
893: case CFP_CHARSET:
894: if (lf.lfCharSet != (BYTE)iParamValue) {
895: lf.lfCharSet= (BYTE)iParamValue;
896: bRedraw = TRUE;
897: }
898: break;
899:
900: case CFP_OUTPUTPRECISION:
901: if (lf.lfOutPrecision != (BYTE)iParamValue) {
902: lf.lfOutPrecision = (BYTE)iParamValue;
903: bRedraw = TRUE;
904: }
905: break;
906:
907: case CFP_CLIPPRECISION:
908: if (lf.lfClipPrecision != (BYTE)iParamValue) {
909: lf.lfClipPrecision = (BYTE)iParamValue;
910: bRedraw = TRUE;
911: }
912: break;
913:
914: case CFP_QUALITY:
915: if (lf.lfQuality != (BYTE)iParamValue) {
916: lf.lfQuality = (BYTE)iParamValue;
917: bRedraw = TRUE;
918: }
919: break;
920:
921: case CFP_PITCH:
922: tmpByte = lf.lfPitchAndFamily;
923: tmpByte &= 0xFC;
924: tmpByte |= iParamValue;
925: if (tmpByte != lf.lfPitchAndFamily) {
926: lf.lfPitchAndFamily = tmpByte;
927: bRedraw = TRUE;
928: }
929: break;
930:
931: case CFP_FAMILY:
932: tmpByte = lf.lfPitchAndFamily;
933: tmpByte &= 0x03;
934: tmpByte |= iParamValue;
935: if (tmpByte != lf.lfPitchAndFamily) {
936: lf.lfPitchAndFamily = tmpByte;
937: bRedraw = TRUE;
938: }
939: break;
940:
941: case CFP_FACENAME:
942: if (lstrcmp (lf.lfFaceName, szMsg)!=0) {
943: if (lstrcmp(lf.lfFaceName, "(none)") == 0) {
944: lf.lfFaceName[0] = 0;
945: } else {
946: wsprintf (lf.lfFaceName, "%s",(LPSTR)szMsg);
947: bRedraw = TRUE;
948: }
949: }
950: break;
951: }
952: } else {
953: wsprintf (szMsg, "CreateValue: CB_ERR while retrieving text");
954: }
955: if (bRedraw) {
956: InvalidateRect (hwndClient, NULL, TRUE);
957: }
958: SetWindowText (hwndMenuField, szMsg);
959: break;
960: }
961: break;
962:
963: // The Menu Selections
964: case IDM_NEW:
965: case IDM_OPEN:
966: case IDM_CLOSE:
967: case IDM_SAVE:
968: case IDM_SAVEAS:
969: case IDM_PRINT:
970: case IDM_PRINTSET:
971: SetWindowText (hwndMenuField, "This command is not yet implemented.");
972: break;
973:
974: case IDM_EXIT:
975: DestroyWindow(hwnd);
976: break;
977:
978: case IDM_UNDO:
979: case IDM_CUT:
980: case IDM_COPY:
981: case IDM_PASTE:
982: case IDM_DELETE:
983: case IDM_FIND:
984: case IDM_REPLACE:
985: SetWindowText (hwndMenuField, "This command is not yet implemented.");
986: break;
987:
988:
989: case ID_ZOOM:
990: if (bZoomed) {
991: SetWindowLong (hwndClient, GWL_WNDPROC, (LONG)fpCharSetProc);
992: bZoomed = FALSE;
993: } else {
994: SetWindowLong (hwndClient, GWL_WNDPROC, (LONG)fpGlyphProc);
995: bZoomed = TRUE;
996: }
997: InvalidateRect (hwndClient, NULL, TRUE);
998: break;
999:
1000: case IDM_CHARSET: // Display the full characater set
1001: SetWindowLong (hwndClient, GWL_WNDPROC, (LONG)fpCharSetProc);
1002: InvalidateRect (hwndClient, NULL, TRUE);
1003: bZoomed = FALSE;
1004: break;
1005:
1006: case IDM_GLYPH: // Display a single glyph from the font
1007: SetWindowLong (hwndClient, GWL_WNDPROC, (LONG)fpGlyphProc);
1008: InvalidateRect (hwndClient, NULL, TRUE);
1009: bZoomed = TRUE;
1010: break;
1011:
1012: break;
1013:
1014: case IDM_TOOLBAR: // This would hide the tool bar
1015: SetWindowText (hwndMenuField, "This command is not yet implemented.");
1016: break;
1017:
1018: case IDM_STATUSBAR: // This would hide the status bar
1019: SetWindowText (hwndMenuField, "This command is not yet implemented.");
1020: break;
1021:
1022: case IDM_CREATEFONT:
1023: lpDlgFunc = MakeProcInstance((FARPROC) CreateDlgProc, hInst);
1.1.1.3 ! root 1024: DialogBoxParam(hInst, "CreateFont", hwnd, (DLGPROC)lpDlgFunc, (DWORD)(LPLOGFONT)&lf);
1.1.1.2 root 1025: FreeProcInstance(lpDlgFunc);
1026: index = (int)SendMessage (hwndCreateParam, CB_GETCURSEL, 0, 0);
1027: if (index != CB_ERR) {
1028: FillInValue (hwndCreateValue, CFP_BASE+index);
1029: } else {
1030: wsprintf (szMsg, "CreateFont: CB_ERR while setting values");
1031: }
1032: InvalidateRect (hwndClient, NULL, TRUE);
1033:
1034: break;
1035:
1036: case IDM_TEXTMETRIC:
1037: lpDlgFunc = MakeProcInstance((FARPROC) MetricsDlgProc, hInst);
1.1.1.3 ! root 1038: DialogBoxParam(hInst, "TextMetric", hwnd, (DLGPROC)lpDlgFunc, (DWORD)(LPLOGFONT)&lf);
1.1.1.2 root 1039: FreeProcInstance(lpDlgFunc);
1040: index = (int)SendMessage (hwndCreateParam, CB_GETCURSEL, 0, 0);
1041: if (index != CB_ERR) {
1042: FillInValue (hwndCreateValue, CFP_BASE+index);
1043: } else {
1044: wsprintf (szMsg, "CreateFont: CB_ERR while setting values");
1045: }
1046: InvalidateRect (hwndClient, NULL, TRUE);
1047: break;
1048:
1049: case IDM_ENUMFONTS:
1050: lpDlgFunc = MakeProcInstance((FARPROC) EnumDlgProc, hInst);
1.1.1.3 ! root 1051: DialogBoxParam(hInst, "EnumFonts", hwnd, (DLGPROC)lpDlgFunc, (DWORD)(LPLOGFONT)&lf);
1.1.1.2 root 1052: FreeProcInstance(lpDlgFunc);
1053: index = (int)SendMessage (hwndCreateParam, CB_GETCURSEL, 0, 0);
1054: if (index != CB_ERR) {
1055: FillInValue (hwndCreateValue, CFP_BASE+index);
1056: } else {
1057: wsprintf (szMsg, "CreateFont: CB_ERR while setting values");
1058: }
1059: InvalidateRect (hwndClient, NULL, TRUE);
1060: break;
1061:
1062: case IDM_OUTLINEMETRICS:
1063: SetWindowText (hwndMenuField, "This command is not yet implemented.");
1064: break;
1065:
1066: case IDM_HELP_CONTENTS:
1067: WinHelp (hwnd, "FontView.HLP", HELP_KEY, (DWORD)(LPSTR)"CONTENTS");
1068: break;
1069: case IDM_HELP_INDEX:
1070: WinHelp (hwnd, "FontView.HLP", HELP_KEY, (DWORD)(LPSTR)"INDEX");
1071: break;
1072: case IDM_HELP_OVERVIEW:
1073: WinHelp (hwnd, "FontView.HLP", HELP_KEY, (DWORD)(LPSTR)"OVERVIEW");
1074: break;
1075: case IDM_HELP_GLOSSARY:
1076: WinHelp (hwnd, "FontView.HLP", HELP_KEY, (DWORD)(LPSTR)"GLOSSARY");
1077: break;
1078: case IDM_HELP_TUTORIAL:
1079: WinHelp (hwnd, "FontView.HLP", HELP_KEY, (DWORD)(LPSTR)"TUTORIAL");
1080: break;
1081: case IDM_HELP_DEMO:
1082: WinHelp (hwnd, "FontView.HLP", HELP_KEY, (DWORD)(LPSTR)"DEMO");
1083: break;
1084: case IDM_HELP_HELP:
1085: WinHelp (hwnd, "FontView.HLP", HELP_KEY, (DWORD)(LPSTR)"HELP");
1086: break;
1087:
1088: case IDM_ABOUT:
1089: lpDlgFunc = MakeProcInstance((FARPROC) SimpleDlgProc, hInst);
1090: DialogBox(hInst,
1091: (wmId==IDM_ABOUT)?"FONTVIEW":"UsageBox",
1092: hwnd,
1.1.1.3 ! root 1093: (DLGPROC)lpDlgFunc);
1.1.1.2 root 1094: FreeProcInstance(lpDlgFunc);
1095: break;
1.1 root 1096:
1097:
1098:
1.1.1.2 root 1099: }
1100: break;
1.1 root 1101:
1.1.1.2 root 1102: case WM_PAINT:
1103: hdc = BeginPaint (hwnd, &ps);
1104: EndPaint (hwnd, &ps);
1105: break;
1.1 root 1106:
1.1.1.2 root 1107: case WM_MENUSELECT:
1108: /* A menu item is hilited, get description text for status bar */
1109: tmp = idMenuSelect;
1.1 root 1110:
1.1.1.2 root 1111: #if defined (WIN32)
1112: wmMenuCmd = LOWORD(wParam);
1113: wmFlags = HIWORD(wParam);
1114: wmhMenu = (HMENU)lParam;
1115: #else
1116: wmMenuCmd = wParam;
1117: wmFlags = LOWORD(lParam);
1118: wmhMenu = (HMENU)HIWORD(lParam);
1.1 root 1119: #endif
1.1.1.2 root 1120:
1121: if((wmhMenu == 0) && (wmFlags = -1)) {
1122: tmp = idMenuSelect = 0;
1123: SetWindowText(hwndMenuField, "Ready...");
1124: } else if(wmhMenu == 0) {
1125: /* don't do anything for this */
1126: } else if(wmFlags & MF_POPUP) {
1127: if((HMENU)wmMenuCmd == hSysMenuMain)
1128: idMenuSelect = IDM_SYSMENU;
1129: else if((HMENU)wmMenuCmd == hFileMenu)
1130: idMenuSelect = IDM_FILE;
1131: else if((HMENU)wmMenuCmd == hEditMenu)
1132: idMenuSelect = IDM_EDIT;
1133: else if((HMENU)wmMenuCmd == hViewMenu)
1134: idMenuSelect = IDM_VIEW;
1135: else if((HMENU)wmMenuCmd == hMetricsMenu)
1136: idMenuSelect = IDM_DIALOG;
1137: else if((HMENU)wmMenuCmd == hHelpMenu)
1138: idMenuSelect = IDM_HELP;
1139: } else {
1140: if(wmMenuCmd != 0) { /* separators have wparam of 0 */
1141: idMenuSelect = wmMenuCmd;
1142: }
1143: }
1144:
1145: if (idMenuSelect != tmp) {
1146: if (!LoadString ( hInst, (int)idMenuSelect, szMsg, sizeof(szMsg))) {
1147: wsprintf ((LPSTR)szMsg, "Unable to load menu string #%u", idMenuSelect);
1148: }
1149: SetWindowText (hwndMenuField, szMsg);
1150: }
1151: break;
1152:
1153: case WM_QUERYENDSESSION:
1154: return (MessageBox (GetFocus(), "Exit Application?", szAppTitle,
1155: MB_ICONQUESTION | MB_YESNO) == IDYES);
1156:
1157: case WM_DESTROY:
1158: if (hwnd == hwndMain) {
1159: PostQuitMessage (0);
1160: }
1161: break;
1162:
1163: default:
1164: return DefWindowProc (hwnd, msg, wParam, lParam);
1165: }
1166: return 0L;
1.1 root 1167: }
1168:
1169: LONG APIENTRY ClientProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam)
1170: {
1.1.1.2 root 1171: switch (msg) {
1172: default:
1173: return DefWindowProc (hwnd, msg, wParam, lParam);
1174: }
1175: return 0L;
1176: }
1.1 root 1177:
1178:
1.1.1.2 root 1179: LONG APIENTRY ClientCharSetProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam)
1180: {
1181: HANDLE hInst;
1182: PAINTSTRUCT ps;
1183: HFONT hfont, hfontPrev;
1184: RECT rect;
1185: HDC hdc;
1186: int x, y;
1187: BYTE glyph;
1188:
1189: if (hwnd) {
1190: #if defined (WIN32)
1191: hInst = (HANDLE)GetWindowLong (hwnd, GWL_HINSTANCE);
1192: #else
1193: hInst = (HANDLE)GetWindowWord (hwnd, GWW_HINSTANCE);
1194: #endif
1.1 root 1195: }
1.1.1.2 root 1196: switch (msg) {
1197: case WM_PAINT:
1198: hdc = BeginPaint (hwnd, &ps);
1199: hfont = CreateFontIndirect (&lf);
1200: hfontPrev = SelectObject (hdc, hfont);
1201: GetClientRect (hwnd, &rect);
1202: DrawAscii (hdc, &rect, 0);
1203: SelectObject (hdc, hfontPrev);
1204: DeleteObject (hfont);
1205: EndPaint (hwnd, &ps);
1206: break;
1207:
1208: case WM_LBUTTONDBLCLK:
1209: x = LOWORD(lParam);
1210: y = HIWORD(lParam);
1211: //OutputDebugString ("WM_LBUTTONDOWN\n\r");
1212: hdc = GetWindowDC (hwnd);
1213: hfont = CreateFontIndirect (&lf);
1214: hfontPrev = SelectObject (hdc, hfont);
1215: GetClientRect (hwnd, &rect);
1216:
1217: glyph = FindChar (hdc, &rect, x, y);
1218: if (glyph) {
1219: SetWindowLong (hwndClient, GWL_WNDPROC, (LONG)fpGlyphProc);
1220: bZoomed = TRUE;
1221: SendMessage (hwndClient, WM_USER, (UINT)glyph, 0);
1222: InvalidateRect (hwndClient, NULL, TRUE);
1223: }
1224:
1225: SelectObject (hdc, hfontPrev);
1226: DeleteObject (hfont);
1227: ReleaseDC (hwnd, hdc);
1228: break;
1229:
1230:
1231: default:
1232: return DefWindowProc (hwnd, msg, wParam, lParam);
1233: }
1234: return 0L;
1.1 root 1235: }
1236:
1.1.1.2 root 1237: LONG APIENTRY ClientGlyphProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam)
1238: {
1239: HANDLE hInst;
1240: PAINTSTRUCT ps;
1241: HFONT hfont, hfontPrev;
1242: RECT rect;
1243: HDC hdc;
1244: TEXTMETRIC tm;
1245: static BYTE glyph = 'A';
1246:
1247: if (hwnd) {
1248: #if defined (WIN32)
1249: hInst = (HANDLE)GetWindowLong (hwnd, GWL_HINSTANCE);
1250: #else
1251: hInst = (HANDLE)GetWindowWord (hwnd, GWW_HINSTANCE);
1252: #endif
1253: }
1.1 root 1254:
1.1.1.2 root 1255: switch (msg) {
1256: case WM_LBUTTONDBLCLK:
1257: case WM_LBUTTONDOWN:
1258: glyph--;
1259: InvalidateRect (hwnd, NULL, TRUE);
1260: break;
1261:
1262: case WM_RBUTTONDBLCLK:
1263: case WM_RBUTTONDOWN:
1264: glyph++;
1265: InvalidateRect (hwnd, NULL, TRUE);
1266: break;
1267:
1268: case WM_USER:
1269: glyph = (BYTE)wParam;
1270: break;
1271:
1272: case WM_PAINT:
1273: hdc = BeginPaint (hwnd, &ps);
1274: hfont = CreateFontIndirect (&lf);
1275: hfontPrev = SelectObject (hdc, hfont);
1276: GetClientRect (hwnd, &rect);
1277:
1278: GetTextMetrics (hdc, &tm);
1279: if (glyph < tm.tmFirstChar) {
1280: MessageBeep (0);
1281: glyph = tm.tmFirstChar;
1282: }
1283: if (glyph > tm.tmLastChar) {
1284: MessageBeep(0);
1285: glyph = tm.tmLastChar;
1286: }
1287:
1288: DrawGlyph (hdc, &rect, glyph, hfont);
1289: SelectObject (hdc, hfontPrev);
1290: DeleteObject (hfont);
1291: EndPaint (hwnd, &ps);
1292: break;
1293:
1294: default:
1295: return DefWindowProc (hwnd, msg, wParam, lParam);
1296: }
1297: return 0L;
1298: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.