Annotation of mstools/samples/sdktools/fontedit/fontedit.c, revision 1.1.1.1

1.1       root        1: #define  NOVIRTUALKEYCODES
                      2: 
                      3: #include "windows.h"
                      4: #include <windowsx.h>
                      5: #include "fontedit.h"
                      6: #include "fcntl.h"
                      7: #include <stdlib.h>   // Causes redefinition warnings.
                      8: #include <string.h>
                      9: 
                     10: /****************************************************************************/
                     11: /*              Shared Variables (Home base)                                */
                     12: /****************************************************************************/
                     13: 
                     14: FARPROC lpHeaderProc;                  /* Pointer to Dialog Box Procedure */
                     15: FARPROC lpReSizeProc;                  /* Pointer to Dialog Box Procedure */
                     16: FARPROC lpWidthProc;                   /* Pointer to Dialog Box Procedure */
                     17: 
                     18: FontHeaderType font;                    /* Structure of Font File Header */
                     19: LONG lSizeOfOldFontHeader = 0;                  /* Old packed header size.              */
                     20: LONG lSizeOfOldFontHeader30 = 0;                /* Old 3.0 packed header size.  */
                     21: LONG lSizeOfOldGlyph20 = 0;             /* Old packed 2.0 glyph info size. */
                     22: LONG lSizeOfOldGlyph30 = 0;                     /* Old packed 3.0 glyph info size. */
                     23: extern CHAR szFontFile[];               /* Name of Font File */
                     24: extern CHAR szFontFileFull[];               /* Name of Font File */
                     25: extern CHAR szNewFile[];                /* Temporary Name */
                     26: extern BOOL NewFile;                    /* flag indicating if file was opened
                     27:                                            by selecting NEW menu item */
                     28: HCURSOR hCross;                         /* handle to a "+" shaped cursor */
                     29: HANDLE hInst;                           /* Handle to Window Instance */
                     30: HANDLE hgPrev;
                     31: INT  swH = 0;                           /* Position in Show Window 0-100 */
                     32: BYTE iChar = 65;                        /* Character being edited */
                     33: BYTE jChar = 65;                        /* Last Char. of edit block */
                     34: CHAR szFaceName[szNamesMax] = {""};     /* Face Name of Font */
                     35: DWORD offsets[257];                     /* Offsets Table */
                     36: CHAR *vrgsz[CSTRINGS];                  /* string table */
                     37: 
                     38: BOOL fChanged = FALSE;                  /* Note if we did anything */
                     39: BOOL fLoaded = FALSE;                   /* Set if a font is loaded */
                     40: BOOL fEdited = FALSE;                   /* Character was edited */
                     41: INT  iFontFormat;                       /* Set to id of current font format */
                     42: INT  iFontFormatPrev;                   /* Set to id of prev. font format */
                     43: BOOL fReadOnly;
                     44: 
                     45: HWND hBox = NULL;                       /* Handle to Edit Window */
                     46: HWND hFont = NULL;                      /* Handle to Show window */
                     47: HDC hMemDC = NULL;                      /* Handle to Memory Display Context */
                     48: HBITMAP hBitmap = NULL;                 /* Handle to our work bit map */
                     49: 
                     50: CHAR matBox [wBoxLim] [kBoxLim];        /* array to hold Box */
                     51: WORD wBox = 10;                 /* Width of Character(s) */
                     52: WORD kBox = 16;                 /* Height of Characters */
                     53: DWORD kStuff;                   /* Height of font window caption etc. */
                     54: 
                     55: OFSTRUCT ofstrFile;             /* holds info of file - filled in by dlgopen/save */
                     56: //WORD     fp = NULL;             /* global fp of current file - " " " " " " */
                     57: 
                     58: /*** string arrays for using stringtable ***/
                     59: CHAR    szAppName[MAX_STR_LEN];
                     60: CHAR    szIFN[MAX_STR_LEN];         /* illegal filename */
                     61: CHAR    szFNF[MAX_STR_LEN];         /* file not found   */
                     62: CHAR    szREF[MAX_STR_LEN];         /* replace existing file */
                     63: CHAR    szSCC[MAX_STR_LEN];         /* save current changes */
                     64: CHAR    szEOF[MAX_STR_LEN];         /* error opening file */
                     65: CHAR    szECF[MAX_STR_LEN];         /* error creating file */
                     66: CHAR    szFRO[MAX_STR_LEN];         /* error creating file */
                     67: CHAR    szExt[MAX_STR_LEN];         /* .FNT */
                     68: CHAR    szExtDesc[MAX_STR_LEN];     /* Font Files(.FNT) */
                     69: CHAR    szNEWFONT[MAX_STR_LEN];     /* Font Files(.FNT) */
                     70: CHAR    szFilter[MAX_STR_LEN];     /* Font Files(.FNT) */
                     71: 
                     72: 
                     73: /* size of system font */
                     74: INT     cSysWidth;
                     75: INT     cSysHeight;
                     76: 
                     77: /****************************************************************************/
                     78: /*              Local Variables                                             */
                     79: /****************************************************************************/
                     80: 
                     81: BYTE FindMouse();               /* Find where mouse is */
                     82: 
                     83: HBRUSH hbrWhite;
                     84: HBRUSH hbrBlack;
                     85: HBRUSH hbrGray;
                     86: HBRUSH hbrDkGray;
                     87: HBRUSH hbrBackGround;
                     88: 
                     89: BYTE downChar;                          /* Where mouse was pressed */
                     90: BYTE lastChar;                          /* Where mouse was last */
                     91: WORD wBoxOld;                           /* So we can catch any changes */
                     92: RECT rectWin;                           /* Client Rectangle */
                     93: LONG origin;                           /* Position in Show Window pixels */
                     94: BOOL fFirstShow = TRUE;                /* first time Show Window displayed? */
                     95: 
                     96: /****************************************************************************/
                     97: /*              Local Functions                                             */
                     98: /****************************************************************************/
                     99: 
                    100: VOID InvertFont(HDC, BYTE, BYTE);
                    101: BOOL FontEditInit(HANDLE);
                    102: VOID InitSizes(VOID);
                    103: 
                    104: /*****************************************************************************
                    105:  * FontShowHorzScroll(hFont, code, posNew)
                    106:  *
                    107:  * purpose: intepret scroll message for tiny window and call scroll funtion
                    108:  *          accordingly
                    109:  *
                    110:  * params: HWND hFont : handle to tiny window
                    111:  *         int code   : scroll message
                    112:  *         int posNew : thumb position
                    113:  * returns: none
                    114:  *
                    115:  * side effects: scroll position variable altered
                    116:  *
                    117:  ****************************************************************************/
                    118: VOID
                    119: FontShowHorzScroll(
                    120:     HWND hFont,
                    121:     INT code,
                    122:     INT posNew
                    123:         )
                    124: {
                    125:     WORD   wChar;
                    126:     RECT   rect;
                    127: 
                    128:     /* Get dimensions */
                    129:     GetClientRect(hFont, (LPRECT)&rect);
                    130: 
                    131:     /* Make a fair guess as to how many characters are in the window */
                    132:     /* Convert sorta to hex too. */
                    133:     wChar=(WORD)(11*(rect.right-rect.left)/(font.AvgWidth*16));
                    134: 
                    135:     switch (code)
                    136:         {
                    137:         case SB_LINEUP:     /* line left */
                    138:             swH -= 1;
                    139:             break;
                    140:         case SB_LINEDOWN:   /* line right */
                    141:             swH += 1;
                    142:             break;
                    143:         case SB_PAGEUP:     /* page left */
                    144:             swH -= wChar;
                    145:             break;
                    146:         case SB_PAGEDOWN:   /* page right */
                    147:             swH += wChar;
                    148:             break;
                    149:         case SB_THUMBPOSITION:
                    150:             swH = posNew;
                    151:             break;
                    152:         case SB_THUMBTRACK:
                    153:             return;
                    154:     }
                    155:     ScrollFont();
                    156: }
                    157: 
                    158: /*****************************************************************************
                    159:  * FontShowPaint(hDC)
                    160:  *
                    161:  * purpose: repaint the little window at the bottom
                    162:  *
                    163:  * params:  HDC hDC : handle to display context.
                    164:  *
                    165:  * returns: none
                    166:  *
                    167:  * side effects: some scroll globals altered.
                    168:  *
                    169:  ****************************************************************************/
                    170: 
                    171: VOID
                    172: FontShowPaint(
                    173:         HDC hDC
                    174:         )
                    175: {
                    176:         DWORD range, nBits;
                    177:         INT nx;
                    178: 
                    179:     nx=GetSystemMetrics(SM_CXBORDER);
                    180:     /* 320 --> 300 */
                    181:     nBits = min(300, rectWin.right - rectWin.left-nx-nx) - 24;
                    182:         /* Window width (pixels) */
                    183:     /* 320 --> 300 */
                    184:     range = max(0, (font.WidthBytes << 3) - min(300, nBits));
                    185:     origin = (swH * range) / 100;               /* Global variable */
                    186:     BitBlt(hDC, 12, 2, nBits, font.PixHeight,
                    187:            hMemDC, origin, 0, NOTSRCCOPY);
                    188:     /* Now highlight the current value of iChar */
                    189:     InvertFont(hDC, iChar, jChar);
                    190: }
                    191: 
                    192: 
                    193: /*****************************************************************************
                    194:  * MouseInFont(ptMouse)
                    195:  *
                    196:  * purpose: Select new char in tiny Show window by inverting current char
                    197:  *          and un-inverting last one
                    198:  *
                    199:  * params:  POINT ptMouse  : mouse coordinates
                    200:  *
                    201:  * returns: none
                    202:  *
                    203:  * side effects: pixels inverted(uninverted) in bitmap.
                    204:  *
                    205:  ****************************************************************************/
                    206: VOID
                    207: MouseInFont(
                    208:         POINT ptMouse                    /*  .. to get new iChar */
                    209:         )
                    210: {
                    211:         HDC hDC;
                    212: 
                    213:     BoxToChar(iChar);           /* Replace edited character in Box if changed */
                    214:     hDC = GetDC(hFont);
                    215:     /* UnInvert present inverted region */
                    216:     InvertFont(hDC, iChar, jChar);
                    217:     /* Find where mouse is */
                    218:     lastChar = downChar = iChar = jChar = FindMouse(ptMouse);
                    219:     /* Invert Character touched */
                    220:     InvertFont(hDC, iChar, jChar);
                    221:     ReleaseDC(hFont, hDC);
                    222: }
                    223: 
                    224: 
                    225: /*****************************************************************************
                    226:  *
                    227:  * purpose:
                    228:  *
                    229:  * params:
                    230:  *
                    231:  * returns:
                    232:  *
                    233:  * side effects:
                    234:  *
                    235:  ****************************************************************************/
                    236: VOID
                    237: MouseMoveFont(
                    238:         POINT ptMouse
                    239:         )
                    240:         /* Mouse raised in font */
                    241:         /*  .. to get new jChar */
                    242: {
                    243:         UNREFERENCED_PARAMETER(ptMouse);
                    244:     return;     /********* NOT YET IN USE !! ********/
                    245: 
                    246: #if 0
                    247:         BYTE newChar;
                    248:         HDC hDC;
                    249: 
                    250:     newChar = FindMouse(ptMouse);               /* Find where mouse is */
                    251:     if (newChar == lastChar)            /* Did we move ? */
                    252:         return;                         /* No: return */
                    253:     lastChar = newChar;
                    254:     hDC = GetDC(hFont);
                    255:     if (newChar > jChar)
                    256:         {
                    257:         InvertFont(hDC, jChar + 1, newChar);    /* extend jChar */
                    258:         jChar = newChar;
                    259:         }
                    260:     else if (newChar < iChar)           /* iChar & jChar switch */
                    261:         {
                    262:         InvertFont(hDC, newChar, iChar - 1);
                    263:         iChar = newChar;
                    264:         }
                    265:     else
                    266:         {
                    267:         if (newChar >= downChar)        /* width reduced on right */
                    268:             {
                    269:             InvertFont(hDC, newChar + 1, jChar);
                    270:             jChar = newChar;
                    271:             }
                    272:         if (newChar <= downChar)        /* width reduced on left */
                    273:             {
                    274:             InvertFont(hDC, iChar, newChar - 1);
                    275:             iChar = newChar;
                    276:             }
                    277:         }
                    278:     ReleaseDC(hFont, hDC);
                    279: #endif
                    280: }
                    281: 
                    282: 
                    283: /*****************************************************************************
                    284:  * InvertFont(hDC, iChar, jChar)
                    285:  *
                    286:  * purpose: inverts color on selected chars (iChar thro' jChar) in the Show
                    287:  *          Window
                    288:  *
                    289:  * params:  HDC hDC    : handle to display context
                    290:  *          char iChar : start char
                    291:  *          char jChar : end char
                    292:  *
                    293:  * returns: none
                    294:  *
                    295:  * side effects: changes pixel values in bitmap
                    296:  *
                    297:  ****************************************************************************/
                    298: VOID
                    299: InvertFont(
                    300:         HDC hDC,
                    301:         BYTE iChar,
                    302:         BYTE jChar
                    303:         )
                    304: {
                    305:     PatBlt(hDC,                         /* Use Blt to Invert it */
                    306:         12 + offsets[iChar] - origin,   /* X: Position */
                    307:         2,                              /* Y: Allow for top band */
                    308:         offsets[jChar + 1] - offsets[iChar],    /* dx: Compute width */
                    309:         font.PixHeight,                 /* dy: Look up the Height */
                    310:         DSTINVERT);                     /* Z: Tell it to invert it */
                    311: }
                    312: 
                    313: 
                    314: /*****************************************************************************
                    315:  * MouseOutFont(ptMouse)
                    316:  *
                    317:  * purpose: brings selected char to edit box and sets up tiny window for
                    318:  *          repainting
                    319:  *
                    320:  * params:  POINT ptMouse : mouse location
                    321:  *
                    322:  * returns: none
                    323:  *
                    324:  * side effects: changes matBox(2-d array containing ready pixel info. on
                    325:  *               char being edited)
                    326:  *
                    327:  ****************************************************************************/
                    328: VOID
                    329: MouseOutFont(
                    330:         POINT ptMouse
                    331:         )
                    332:         /* Mouse raised in font */
                    333:         /*  .. to get new jChar */
                    334: {
                    335:     MouseMoveFont(ptMouse);     /* Check on iChar and jChar */
                    336:     CharToBox(iChar);
                    337:     InvalidateRect(hFont, (LPRECT)NULL, TRUE);  /* Cause repaint */
                    338: }
                    339: 
                    340: 
                    341: /*****************************************************************************
                    342:  * BYTE FindMouse(ptMouse)
                    343:  *
                    344:  * purpose: Locate number of character(in tiny window at bottom) under mouse
                    345:  *
                    346:  * params:  POINT ptMouse : mouse location
                    347:  *
                    348:  * returns: number of character
                    349:  *
                    350:  * side effects: alters scroll position variable
                    351:  *
                    352:  ****************************************************************************/
                    353: 
                    354: BYTE
                    355: FindMouse(
                    356:         POINT ptMouse
                    357:         )
                    358: {
                    359:         int  iChar;
                    360:         LONG   x;
                    361: 
                    362: 
                    363:     x = ptMouse.x + origin - 12;        /* Horizontal position of mouse */
                    364:     if (x < 0)
                    365:         iChar = font.FirstChar;
                    366:     else
                    367:         {
                    368:         iChar = x / font.AvgWidth + font.FirstChar;
                    369:         /* Right if Fixed Pitch -- Best Guess if variable width */
                    370:         if (!font.PixWidth)                     /* Scan for new iChar */
                    371:             {
                    372:             if (iChar > (int)font.LastChar)
                    373:                    iChar = (int)font.LastChar;  /* Don't overshoot */
                    374: 
                    375:             while (iChar < (int)font.LastChar && offsets[iChar] < (DWORD)x)
                    376:                 iChar++;
                    377:             while (iChar > (int)font.FirstChar && offsets[iChar] > (DWORD)x)
                    378:                 iChar--;
                    379:             }
                    380:         }
                    381: 
                    382:     /* Bug fix: prevent nil character from showing if mouse is pressed way
                    383:        over on right side of font scroll with narrow fixed fonts. */
                    384:     if (iChar > (int)font.LastChar)
                    385:         iChar = (int)font.LastChar;  /* Don't overshoot */
                    386: 
                    387:     if (iChar < (int)font.FirstChar)
                    388:         iChar = (int)font.FirstChar;  /* Don't undershoot */
                    389: 
                    390:     if (ptMouse.x <= 12L)
                    391:         {
                    392:         swH -= 1;
                    393:         ScrollFont();
                    394:         }
                    395:     if (ptMouse.x > 308L)
                    396:         {
                    397:         swH += 1;
                    398:         ScrollFont();
                    399:         }
                    400:     return (BYTE)iChar;
                    401: }
                    402: 
                    403: 
                    404: /*****************************************************************************
                    405:  * ScrollFont()
                    406:  *
                    407:  * purpose: scrolls tiny window at bottom
                    408:  *
                    409:  * params:  none
                    410:  *
                    411:  * returns: none
                    412:  *
                    413:  * side effects: alters scroll position variable
                    414:  *
                    415:  ****************************************************************************/
                    416: VOID
                    417: ScrollFont(
                    418:         VOID
                    419:         )
                    420: {
                    421:         HDC hDC;
                    422: 
                    423:     swH = max(0, swH);
                    424:     swH = min(100, swH);        /* maintain 0 - 100 range */
                    425:     SetScrollPos(hFont, SB_HORZ, swH, TRUE);     /* Move thumb */
                    426:     hDC = GetDC(hFont);
                    427:     FontShowPaint(hDC);
                    428:     ReleaseDC(hFont, hDC);
                    429: }
                    430: 
                    431: 
                    432: /*****************************************************************************
                    433:  * BoxToChar(iChar)
                    434:  *
                    435:  * purpose: sets pixels in bitmap according to matBox(2-d array containing
                    436:  *          ready pixel info. on char being edited)
                    437:  *
                    438:  * params:  BYTE iChar : index of char in bitmap offset array(offsets)
                    439:  *
                    440:  * returns: none
                    441:  *
                    442:  * side effects: changes font bitmap
                    443:  *
                    444:  ****************************************************************************/
                    445: VOID
                    446: BoxToChar(
                    447:         BYTE iChar
                    448:         )
                    449: {
                    450:         DWORD x, y, offset;
                    451: 
                    452:     if (!fEdited)
                    453:         return;
                    454: 
                    455:     if (wBox != wBoxOld)                /* I.e if width has changed */
                    456:         CharWidth(iChar, wBox);         /* .. go fix it */
                    457: 
                    458:     offset = offsets[iChar];
                    459:     for (x = 0; x < wBox; x++)
                    460:         {
                    461:         for (y = 0; y < kBox; y++)
                    462:             SetPixel(hMemDC, offset + x, y,
                    463:                 matBox[x] [y] == TRUE ? WHITE : BLACK);
                    464:         }
                    465:     fEdited = FALSE;
                    466: }
                    467: 
                    468: 
                    469: /*****************************************************************************
                    470:  * CharToBox(iChar)
                    471:  *
                    472:  * purpose: assigns matBox(2-d array containing ready pixel info. on char being
                    473:  *          edited) according to pixels in portion of bitmap corresp. to char.
                    474:  *
                    475:  * params:  BYTE iChar : index of char in bitmap offset array(offsets)
                    476:  *
                    477:  * returns: none
                    478:  *
                    479:  * side effects: changes matBox
                    480:  *
                    481:  ****************************************************************************/
                    482: VOID
                    483: CharToBox(
                    484:         BYTE iChar
                    485:         )
                    486: {
                    487:         DWORD x, y, offset;
                    488:         HMENU hMenu;
                    489: 
                    490:     ClearBox();
                    491:     offset = offsets[iChar];
                    492:     wBox = wBoxOld = (WORD) (offsets[iChar + 1] - offset); /* Edit Box width */
                    493:     kBox = font.PixHeight;                              /* Edit Box Height */
                    494:     for (x = 0; x < wBox; x++)
                    495:         for (y = 0; y < kBox; y++)
                    496:             matBox[x][y] = (BYTE) (GetPixel(hMemDC, offset + x, y) ? 1 : 0);
                    497:     InvalidateRect(hBox, (LPRECT)NULL, TRUE);
                    498:     fEdited = FALSE;            /* Not Changed Yet */
                    499:     hMenu = GetMenu(hBox);
                    500:     EnableMenuItem(hMenu, BOX_UNDO, MF_GRAYED);
                    501:     EnableMenuItem(hMenu, BOX_REFRESH, MF_GRAYED);
                    502: }
                    503: 
                    504: 
                    505: /*****************************************************************************/
                    506: /*              WinMain  and  Friends                                        */
                    507: /*****************************************************************************/
                    508: 
                    509: 
                    510: /* Procedure called every time a new instance of the application
                    511: ** is created */
                    512: 
                    513: INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, INT cmdShow)
                    514: {
                    515:         MSG    msg;
                    516:         WORD   message;
                    517:         INT    nx;
                    518:         HANDLE hAccel;
                    519: 
                    520:     hInst = hInstance;
                    521:     hgPrev=hPrevInstance;
                    522: 
                    523: 
                    524:         if (!FontEditInit( hInstance ))
                    525:             return FALSE;
                    526: 
                    527: 
                    528: 
                    529:     LoadString(hInstance, IDS_APPNAME, szAppName, MAX_STR_LEN);
                    530:     LoadString(hInstance, IDS_IFN, szIFN, MAX_STR_LEN); /* illegal filename */
                    531:     LoadString(hInstance, IDS_FNF, szFNF, MAX_STR_LEN); /* file not found   */
                    532:     LoadString(hInstance, IDS_REF, szREF, MAX_STR_LEN);
                    533:                         /* replace existing file */
                    534:     LoadString(hInstance, IDS_SCC, szSCC, MAX_STR_LEN);
                    535:                         /* save current changes */
                    536:     LoadString(hInstance, IDS_EOF, szEOF, MAX_STR_LEN); /* error opening file */
                    537:     LoadString(hInstance, IDS_ECF, szECF, MAX_STR_LEN);
                    538:         // File is read only.
                    539:     LoadString(hInstance, IDS_FRO, szFRO, MAX_STR_LEN);
                    540:                         /* error creating file */
                    541:     LoadString(hInstance, IDS_EXT, szExt, MAX_STR_LEN); /* default file ext. */
                    542: 
                    543:         // File extension description for common dialog.
                    544:     LoadString(hInstance, IDS_EXTDESC, szExtDesc, MAX_STR_LEN);
                    545:         // Message for new font warning box.
                    546:     LoadString(hInstance, IDS_NEW_FONT, szNEWFONT, MAX_STR_LEN);
                    547:     memset(szFilter, 0, MAX_STR_LEN);
                    548:     LoadString(hInstance, IDS_EXTDESC, szFilter, MAX_STR_LEN);
                    549:     LoadString(hInstance, IDS_STARDOTFNT, szFilter+strlen(szFilter)+1,
                    550:                                 MAX_STR_LEN-(strlen(szFilter)+1));
                    551: 
                    552: 
                    553:     ClearBox();
                    554: 
                    555:         /* Create a window instance of class "FontEdit" */
                    556: 
                    557:     hBox = CreateWindow((LPSTR) vszFontEdit,
                    558:                       (LPSTR)szAppName,
                    559:                       WS_TILEDWINDOW,
                    560:                       56,34,
                    561:                       GetSystemMetrics(SM_CXFULLSCREEN)/2,
                    562:                       GetSystemMetrics(SM_CYFULLSCREEN)/2,
                    563:                       (HWND)NULL,        /* no parent */
                    564:                       (HMENU)NULL,       /* use class menu */
                    565:                       (HANDLE)hInstance, /* handle to window instance */
                    566:                       (LPSTR)NULL        /* no params to pass on */
                    567:                       );
                    568: 
                    569:     ShowWindow(hBox, cmdShow);
                    570:     UpdateWindow(hBox);
                    571:     InitSizes();     /* 11/21/86 - linsh - get system char width & height */
                    572: 
                    573: 
                    574:     GetWindowRect(hBox, (LPRECT)&rectWin);
                    575:     nx=GetSystemMetrics(SM_CXBORDER);
                    576:     hFont = CreateWindow((LPSTR) vszFontShow,
                    577:                        (LPSTR) "",
                    578:                        WS_BORDER|WS_HSCROLL|WS_CAPTION,
                    579:                        rectWin.left,
                    580:                        rectWin.bottom-56,
                    581:                        min(300, rectWin.right - rectWin.left-nx-nx),
                    582:                        50 - GetSystemMetrics(SM_CYBORDER),
                    583:                        (HWND)hBox,
                    584:                        (HMENU)NULL,
                    585:                        (HANDLE)hInstance,
                    586:                        (LPSTR)NULL
                    587:                        );
                    588: 
                    589: 
                    590:     /* Get address of Dialog Box procedure */
                    591:     lpHeaderProc = MakeProcInstance((FARPROC)HeaderProc, hInstance);
                    592:     lpReSizeProc = MakeProcInstance((FARPROC)ReSizeProc, hInstance);
                    593:     lpWidthProc = MakeProcInstance((FARPROC)WidthProc, hInstance);
                    594: 
                    595:     /* Start it loading if it's not iconic */
                    596:     if (!IsIconic(hBox))
                    597:         {
                    598:         if (lpszCmdLine[0])     /* If we have a font name use it */
                    599:             {
                    600:             BOOL   fDot;
                    601:             INT   i;
                    602: 
                    603:             /* Copy the specified file and make it upper case */
                    604:             lstrcpy((LPSTR)szFontFile, CharUpper((LPSTR)lpszCmdLine));
                    605: 
                    606:             fDot = FALSE;
                    607:             nx=lstrlen((LPSTR)szFontFile);
                    608: 
                    609:             for (i = 0; i < nx; i++)
                    610:                 {
                    611:                 if (szFontFile[i] == '.')       /* Add .FNT if none */
                    612:                     fDot = TRUE;
                    613: 
                    614:                 if (szFontFile[i] == ' ')
                    615:                     szFontFile[i]=0;
                    616:                 }
                    617: 
                    618:             if (!fDot)
                    619:                 lstrcat((LPSTR)szFontFile, (LPSTR)vszDotFNT);
                    620: 
                    621:             lstrcpy((LPSTR)szNewFile, (LPSTR)szFontFile);
                    622: 
                    623:             /* Do this thing that someone forgot.  THe dialog open does it
                    624:                and affects the Save As initialization. */
                    625:             (HFILE)OpenFile((LPSTR)szNewFile, &ofstrFile, OF_READ);
                    626: 
                    627:             message = FONT_START;
                    628:             }
                    629:         else            /* Start by doing a regular file load */
                    630:             message = FONT_LOAD;
                    631: 
                    632:         SetFocus(hBox);
                    633:         PostMessage(hBox, WM_COMMAND, message, (LONG)0);
                    634:         }
                    635: 
                    636:     if (!fLoaded)
                    637:         ShowWindow(hFont, SW_HIDE);
                    638: 
                    639:     hAccel=LoadAccelerators(hInstance, "FE");
                    640: 
                    641:     /* Quit message will terminate application */
                    642:     while (GetMessage((LPMSG)&msg, NULL, 0, 0))
                    643:         {
                    644:         if (!TranslateAccelerator (hBox, hAccel, &msg))
                    645:             {
                    646:             TranslateMessage((LPMSG)&msg);
                    647:             DispatchMessage((LPMSG)&msg);
                    648:             }
                    649:         }
                    650: 
                    651:     return msg.wParam;
                    652: }
                    653: 
                    654: /*****************************************************************************
                    655:  * int FontEditInit( hInstance )
                    656:  *
                    657:  * purpose: Initialises a whole lot of stuff
                    658:  *
                    659:  * params:  HANDLE hInstance : handle to instance of application
                    660:  *
                    661:  * returns:     TRUE : if everything goes off well
                    662:  *             FALSE : error in initialisation
                    663:  *
                    664:  * side effects: a whole lot
                    665:  *
                    666:  ****************************************************************************/
                    667: 
                    668: /* Procedure called when the application is loaded */
                    669: BOOL
                    670: FontEditInit(
                    671:         HANDLE hInstance
                    672:         )
                    673: {
                    674:     INT cch;          /* all variables used to load srings from .RC file */
                    675:     INT cchRemaining;
                    676:     CHAR *pch;
                    677:     HANDLE hStrings;
                    678:     INT i;
                    679:     CHAR ColorStr[CCHCOLORSTRING]; /* background color inf. fronm win.ini */
                    680:     BYTE bR, bG, bB;  /* the three primary color values ret. from win.ini */
                    681:     // CHAR cDummy;      /* dummy char to hold the " " char */
                    682:     PWNDCLASS   pFontEditClass;         /* Edit Box window class */
                    683:     PWNDCLASS   pFontShowClass;         /* Show Font window class */
                    684: 
                    685:         //
                    686:         // Initialize the conversion routines to read in the old font structure
                    687:         // off of disk.
                    688:         //
                    689: 
                    690:         if (fConvStructInit () == FALSE) {
                    691: 
                    692:                 return FALSE;
                    693:         }
                    694: 
                    695:     /* load strings from resource file */
                    696:     if (!(pch = (CHAR *)(hStrings =
                    697:                 LocalAlloc (LPTR, cchRemaining = CCHSTRINGSMAX))))
                    698:           return FALSE;        /* unable to alloc. Try increasing initial
                    699:                                   heapsize in .DEf file */
                    700:     for (i=0; i< CSTRINGS; i++){
                    701:         cch = 1+LoadString (hInstance, (WORD) i, (LPTSTR)pch, cchRemaining);
                    702:         if (cch < 2){
                    703:             return FALSE;
                    704:                 }
                    705:         vrgsz[i] = pch;
                    706:         pch += cch;
                    707:         if ((cchRemaining -= cch ) <= 0)
                    708:             return FALSE;
                    709:     }
                    710: 
                    711:     /* Allocate class structure in local heap */
                    712:     pFontEditClass = (PWNDCLASS)LocalAlloc( LPTR, sizeof(WNDCLASS) );
                    713:     if (pFontEditClass == NULL)
                    714:         return FALSE;
                    715: 
                    716:     /* set up some default brushes */
                    717:     hbrWhite = GetStockObject( WHITE_BRUSH );
                    718:     hbrBlack = GetStockObject( BLACK_BRUSH );
                    719:     hbrGray  = GetStockObject( GRAY_BRUSH );
                    720:     hbrDkGray  = GetStockObject( DKGRAY_BRUSH );
                    721: 
                    722:     /* get App. Workspace color from win.ini - LR */
                    723:     if (GetProfileString(vszcolors, vszAppWorkspace, "",ColorStr,
                    724:                                                        CCHCOLORSTRING)){
                    725:         bR = (BYTE)atoi((const char *)strtok (ColorStr, " "));
                    726:         bG = (BYTE)atoi((const char *)strtok (NULL, " "));
                    727:         bB = (BYTE)atoi((const char *)strtok (NULL, "\n"));
                    728:         hbrBackGround = CreateSolidBrush(RGB(bR, bG, bB));
                    729:     }
                    730:     else  /* set to lt. blue background */
                    731:         hbrBackGround = CreateSolidBrush((LONG)0x00FF8000);
                    732: 
                    733:     /* get necessary resources */
                    734:     pFontEditClass->hCursor  = LoadCursor( NULL, IDC_ARROW);
                    735:     pFontEditClass->hIcon    = LoadIcon( hInstance,(LPSTR)vszFontEdit);
                    736:     pFontEditClass->lpszMenuName = (LPSTR)vszFontEdit;
                    737:     pFontEditClass->lpszClassName = (LPSTR)vszFontEdit;
                    738:     pFontEditClass->hbrBackground = hbrBackGround;
                    739:     pFontEditClass->hInstance     = hInstance;
                    740: 
                    741:     pFontEditClass->style = CS_VREDRAW | CS_HREDRAW;
                    742: 
                    743:     /* Register our Window Proc */
                    744:     pFontEditClass->lpfnWndProc = (WNDPROC)FontEditWndProc;
                    745: 
                    746:     /* register this new class with WINDOWS */
                    747:     if (!hgPrev)
                    748:         if (!RegisterClass( (LPWNDCLASS)pFontEditClass ) )
                    749:             return FALSE;   /* Initialization failed */
                    750: 
                    751:     /* Now repeat the performance for the Show window */
                    752: 
                    753:     pFontShowClass = pFontEditClass;
                    754:     /* get necessary resources */
                    755:     pFontShowClass->hCursor  = LoadCursor(NULL,IDC_ARROW);
                    756:     pFontShowClass->hIcon    = (HICON)NULL;
                    757:     pFontShowClass->lpszMenuName = (HMENU)NULL;
                    758:     pFontShowClass->lpszClassName = (LPSTR)vszFontShow;
                    759:     pFontShowClass->hbrBackground = hbrGray;
                    760:     pFontShowClass->hInstance     = hInstance;
                    761:     pFontShowClass->style = CS_VREDRAW | CS_HREDRAW;
                    762: 
                    763:     /* Register our Window Proc */
                    764:     pFontShowClass->lpfnWndProc = (WNDPROC)FontShowWndProc;
                    765: 
                    766:     /* register this new class with WINDOWS */
                    767:     if (!hgPrev)
                    768:         if (!RegisterClass( (LPWNDCLASS)pFontShowClass ) )
                    769:             return FALSE;   /* Initialization failed */
                    770: 
                    771:     LocalFree( (HANDLE)pFontShowClass );
                    772: 
                    773:     return TRUE;    /* Initialization succeeded */
                    774: }
                    775: 
                    776: /*****************************************************************************
                    777:  * InitSizes()
                    778:  *
                    779:  * purpose: gets system char width and height
                    780:  *
                    781:  * params:  none
                    782:  *
                    783:  * returns: none
                    784:  *
                    785:  * side effects: sets width and height globals
                    786:  *
                    787:  ****************************************************************************/
                    788: VOID
                    789: InitSizes(
                    790:         VOID
                    791:         )
                    792: {
                    793:     HDC hDC;
                    794:     TEXTMETRIC tm;
                    795: 
                    796:     hDC = GetDC(hFont);
                    797:     GetTextMetrics(hDC, (LPTEXTMETRIC) &tm);
                    798:     cSysHeight = tm.tmHeight + tm.tmExternalLeading;;
                    799:     cSysWidth  = tm.tmAveCharWidth;
                    800:     ReleaseDC(hFont, hDC);
                    801: }
                    802: 
                    803: 
                    804: /*****************************************************************************
                    805:  * long  APIENTRY FontShowWndProc(hFont, message, wParam, lParam)
                    806:  *
                    807:  * purpose: Window function for tiny window at the bottom (showing font chars)
                    808:  *          Independently processes paint, scroll, keyboard and mouse
                    809:  *          messages for the window
                    810:  *
                    811:  * params:  as for window functions
                    812:  *
                    813:  * side effects: lots
                    814:  *
                    815:  ****************************************************************************/
                    816: 
                    817: /* Procedures which make up the window class. */
                    818: LONG  APIENTRY
                    819: FontShowWndProc(
                    820:         HWND   hFont,
                    821:         WORD   message,
                    822:         WPARAM wParam,
                    823:         LPARAM lParam
                    824:         )
                    825: {
                    826:         PAINTSTRUCT  ps;
                    827:         // RECT         rectWin;
                    828:         POINT        pt;
                    829: 
                    830:         ((pt).x = ((*((POINTS *)&(lParam)))).x, (pt).y = ((*((POINTS *)&(lParam)))).y);
                    831: 
                    832:     switch (message)
                    833:     {
                    834: 
                    835:         case WM_SIZE :
                    836:             switch (wParam){
                    837:                 /* if main window is iconised, hide the child window */
                    838:                 case SIZEICONIC :
                    839:                     ShowWindow(hFont, SW_HIDE);
                    840:                     break;
                    841:                 default:
                    842:                     return(DefWindowProc(hFont, message, wParam, lParam));
                    843:                     break;
                    844:             }
                    845:             break;
                    846: 
                    847: 
                    848:         case WM_PAINT:
                    849:             /* Time for the window to draw itself. */
                    850:             BeginPaint(hFont, (LPPAINTSTRUCT)&ps);
                    851:             FontShowPaint(ps.hdc);
                    852:             EndPaint(hFont, (LPPAINTSTRUCT)&ps);
                    853:             break;
                    854: 
                    855:         /* For each of following mouse window messages, wParam contains
                    856:         ** bits indicating whether or not various virtual keys are down,
                    857:         ** and lParam is a POINT containing the mouse coordinates.   The
                    858:         ** keydown bits of wParam are:  MK_LBUTTON (set if Left Button is
                    859:         ** down); MK_RBUTTON (set if Right Button is down); MK_SHIFT (set
                    860:         ** if Shift Key is down); MK_ALTERNATE (set if Alt Key is down);
                    861:         ** and MK_CONTROL (set if Control Key is down). */
                    862: 
                    863:         case WM_LBUTTONDOWN:
                    864:             MouseInFont(pt);              /* .. set iChar */
                    865:             break;
                    866:         case WM_LBUTTONUP:
                    867:             MouseOutFont(pt);     /* .. set jChar */
                    868:             break;
                    869:         case WM_RBUTTONDOWN:
                    870:         case WM_RBUTTONUP:
                    871:         case WM_MOUSEMOVE:                      /* If mouse is down */
                    872:             if (wParam & MK_LBUTTON)
                    873:                 MouseMoveFont(pt);        /* .. set jChar */
                    874:             break;
                    875:         case WM_LBUTTONDBLCLK:
                    876:         case WM_RBUTTONDBLCLK:
                    877:             break;
                    878: 
                    879:         case WM_HSCROLL:
                    880:             /* wParam contains the scroll code.
                    881:             ** For the thumb movement codes, the low
                    882:             ** word of lParam contain the new scroll position.
                    883:             ** Possible values for wParam are: SB_LINEUP, SB_LINEDOWN,
                    884:             ** SB_PAGEUP, SB_PAGEDOWN, SB_THUMBPOSITION, SB_THUMBTRACK */
                    885:             /* Horizontal scroll bar input.  Parameters same as for
                    886:             ** WM_HSCROLL.  UP and DOWN should be interpreted as LEFT
                    887:             ** and RIGHT, respectively. */
                    888:             FontShowHorzScroll(hFont, LOWORD(wParam),
                    889:                                 HIWORD(wParam));
                    890:             break;
                    891:         case WM_CLOSE:
                    892:             break;   /* don't allow this window to be closed before
                    893:                         bigger one */
                    894: 
                    895:         default:
                    896: 
                    897:             /* Everything else comes here.  This call MUST exist
                    898:             ** in your window proc.  */
                    899: 
                    900:             return(DefWindowProc(hFont, message, wParam, lParam));
                    901:             break;
                    902: 
                    903:     }
                    904: 
                    905:     /* A window proc should always return something */
                    906:     return(0L);
                    907: }
                    908: 
                    909: 
                    910: VOID
                    911: FontRename(
                    912:         CHAR * szError
                    913:         )
                    914: {
                    915:     CHAR *szTitle[MAX_STR_LEN+MAX_FNAME_LEN];
                    916: 
                    917:     if (szError[0])
                    918:         ErrorBox(hBox, szError);
                    919:     else
                    920:         {
                    921:         lstrcpy((LPSTR)szFontFileFull, (LPSTR)szNewFile);
                    922:         lstrcpy((LPSTR)szTitle, (LPSTR)szAppName);
                    923:         lstrcat((LPSTR)szTitle, (LPSTR)vszBlankDashBlank);
                    924:         lstrcat((LPSTR)szTitle, (LPSTR)szFontFile);
                    925:         SetWindowText(hBox, (LPSTR)szTitle);
                    926:         }
                    927: }
                    928: 
                    929: 
                    930: /*****************************************************************************
                    931:  * ResizeShow()
                    932:  *
                    933:  * purpose:   resize tiny window at bottom (showing font chars) in proportion
                    934:  *            to large window
                    935:  *
                    936:  * params:    none
                    937:  *
                    938:  * returns:   none
                    939:  *
                    940:  * side effects:
                    941:  *
                    942:  ****************************************************************************/
                    943: 
                    944: VOID
                    945: ResizeShow(
                    946:         VOID
                    947:         )
                    948: {
                    949:         INT    height;
                    950:         INT    nx;
                    951: 
                    952:     /* size message for hbox goes thru before hfont created. 06-Jul-1987. */
                    953:     if (!hFont)
                    954:         return;
                    955: 
                    956:     GetWindowRect(hBox, (LPRECT)&rectWin);
                    957:     kStuff = GetkStuff();               /* For check on second pass */
                    958: 
                    959: #if 0
                    960:     height = font.PixHeight + kStuff + 20;  /* 4 Height we want box */
                    961: #else
                    962:     height = font.PixHeight + GetSystemMetrics(SM_CYHSCROLL)
                    963:                             + GetSystemMetrics(SM_CYCAPTION)
                    964:                             + 4*GetSystemMetrics(SM_CYBORDER)/*20*/;     /* 4*/
                    965: #endif
                    966: 
                    967:      nx=GetSystemMetrics(SM_CXBORDER);
                    968:      MoveWindow(hFont,
                    969:                 rectWin.left +nx+4,
                    970:                 rectWin.bottom - (height + GetSystemMetrics(SM_CYBORDER)+2),
                    971:                 min(300, rectWin.right - rectWin.left-nx-nx),
                    972:                 height,
                    973:                 TRUE);
                    974:     if (!IsWindowVisible(hFont) && fLoaded)
                    975:         ShowWindow(hFont, SW_SHOW);
                    976: }
                    977: 
                    978: 
                    979: DWORD
                    980: GetkStuff(
                    981:         VOID
                    982:         )     /* Get size of menu, scrollbar etc. */
                    983: {
                    984:         RECT rect, rectWin;
                    985: 
                    986:     /* size message for hbox goes thru before hfont created. 06-Jul-1987. */
                    987:     if (!hFont)
                    988:         return 0;
                    989: 
                    990:     GetClientRect(hFont, (LPRECT)&rect);     /* How much do WE get? */
                    991:     GetWindowRect(hFont, (LPRECT)&rectWin);
                    992:     return (DWORD) (rectWin.bottom - rectWin.top) - (rect.bottom - rect.top);
                    993: }

unix.superglobalmegacorp.com

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