Annotation of mstools/samples/fontview/fontview.c, revision 1.1.1.3

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.