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

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

unix.superglobalmegacorp.com

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