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