Annotation of mstools/samples/sdktools/fontedit/fontedit.c, revision 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.