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