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

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

unix.superglobalmegacorp.com

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