Annotation of mstools/samples/ntfonts/ntfonts.c, revision 1.1

1.1     ! root        1: /**************************************************************************\
        !             2: *  ntfonts.c -- Font enumeration and manipulation program for Win32/NT.
        !             3: *
        !             4: *  version 1.0
        !             5: *
        !             6: * design:  There is a main frame window (hwndMain) with a child toolbar,
        !             7: *  two child dialogs, and a child demonstration window.  All window handles
        !             8: *  are global and are accesible to all modules.  There is a module for each
        !             9: *  of the classes of windows.  Each module contains an initialization routine
        !            10: *  to register the class and create the window(s).  Each module also contains
        !            11: *  a window procedure for that class.  The two windows which list all of the
        !            12: *  fonts are also children of the main window, and they are hidden and shown
        !            13: *  as needed.
        !            14: *
        !            15: *  Communication between windows is via message passing.  The toolbar passes
        !            16: *  all of its command messages back to the main window.  Other windows pass
        !            17: *  information back and forth with the following USER defined messages:
        !            18: *  WMU_LFTODEMO, WMU_DEMOTOLF, & WMU_DEMOTOTM.  Rectangles fly on the screen
        !            19: *  (c.f. flyWinWin) to mirror message trafic, i.e. data flow.
        !            20: *
        !            21: \**************************************************************************/
        !            22: 
        !            23: #include <windows.h>
        !            24: #include "ntfonts.h"
        !            25: 
        !            26: 
        !            27: /* Misc. defines for size, color, and appearance of drawing. */
        !            28: #define GRIDCOLOR  PALETTEINDEX (6)
        !            29: #define TICKSPACE  20
        !            30: #define FWW_STEPS  40
        !            31: 
        !            32: 
        !            33: 
        !            34: char initString[] = "Please wait. Initializing data structures.";
        !            35: 
        !            36: 
        !            37: /**************************************************************************\
        !            38: *
        !            39: *  function:  WinMain()
        !            40: *
        !            41: *  input parameters:  c.f. generic sample
        !            42: *
        !            43: \**************************************************************************/
        !            44: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        !            45:                      LPSTR lpCmdLine, int nCmdShow)
        !            46: {
        !            47:     MSG    msg;
        !            48:     HANDLE haccel;
        !            49:     HWND   hwndInfo;
        !            50: 
        !            51: 
        !            52:     UNREFERENCED_PARAMETER( lpCmdLine );
        !            53:     UNREFERENCED_PARAMETER(  nCmdShow );
        !            54:     hInst = hInstance;
        !            55: 
        !            56: 
        !            57:     /* Check for previous instance.  If none, then register class. */
        !            58:     if (!hPrevInstance) {
        !            59:       WNDCLASS  wc;
        !            60: 
        !            61:       wc.style = NULL;
        !            62:       wc.lpfnWndProc = (WNDPROC)MainWndProc;
        !            63: 
        !            64:       wc.cbClsExtra = 0;
        !            65:       wc.cbWndExtra = 0;
        !            66:       wc.hInstance = hInstance;
        !            67:       wc.hIcon = LoadIcon(hInstance, "ntfontsIcon");
        !            68:       wc.hCursor = LoadCursor(NULL, IDC_ARROW);
        !            69:       wc.hbrBackground = NULL;
        !            70:       wc.lpszMenuName =  NULL;
        !            71:       wc.lpszClassName = "ntfonts";
        !            72: 
        !            73:       if (!RegisterClass(&wc)) return (FALSE);
        !            74: 
        !            75:     }  /* class registered o.k. */
        !            76: 
        !            77: 
        !            78:     /* Create the main window.  Return false if CreateWindow() fails */
        !            79:     hwndMain = CreateWindow(
        !            80:         "ntfonts",
        !            81:         "NT Fonts",
        !            82:         WS_OVERLAPPEDWINDOW,
        !            83:         CW_USEDEFAULT,
        !            84:         CW_USEDEFAULT,
        !            85:         CW_USEDEFAULT,
        !            86:         CW_USEDEFAULT,
        !            87:         NULL, NULL, hInst, NULL);
        !            88: 
        !            89:     if (!hwndMain) return (FALSE);
        !            90: 
        !            91: 
        !            92:     /* create temporary window to display while initialization completes */
        !            93:     hwndInfo = CreateWindow(
        !            94:         "EDIT",
        !            95:         initString,
        !            96:         WS_CHILD | WS_VISIBLE | ES_READONLY | ES_MULTILINE | ES_CENTER,
        !            97:         0,0,
        !            98:         GetSystemMetrics (SM_CXFULLSCREEN),
        !            99:         GetSystemMetrics (SM_CYFULLSCREEN),
        !           100:         hwndMain, NULL, hInst, NULL);
        !           101: 
        !           102:     /* make the main window visible to show the "please wait..." screen. */
        !           103:     ShowWindow(hwndMain, SW_SHOWMAXIMIZED);
        !           104:     UpdateWindow (hwndMain);
        !           105: 
        !           106: 
        !           107:     /* perform initialization for other windows...allfont is SLOW */
        !           108:     if (!initTB(hwndMain))       return FALSE;
        !           109:     if (!initDemo(hwndMain))     return FALSE;
        !           110:     if (!initDlg(hwndMain))      return FALSE;
        !           111:     if (!initAllFont(hwndMain))  return FALSE;
        !           112: 
        !           113: 
        !           114:     haccel = LoadAccelerators (hInst, "TBAccel");
        !           115: 
        !           116: 
        !           117:     /* get rid of the temporary "please wait..." window. */
        !           118:     DestroyWindow (hwndInfo);
        !           119: 
        !           120:     /* Loop getting messages and dispatching them. */
        !           121:     while (GetMessage(&msg,NULL, NULL, NULL)) {
        !           122:       if (!TranslateAccelerator(hwndMain, haccel, &msg))
        !           123:       if (!IsDialogMessage (hwndDlgTM, &msg))
        !           124:       if (!IsDialogMessage (hwndDlgLF, &msg)){
        !           125:         TranslateMessage(&msg);
        !           126:         DispatchMessage(&msg);
        !           127:       }
        !           128:     }
        !           129: 
        !           130:     return (msg.wParam);
        !           131: }
        !           132: 
        !           133: 
        !           134: 
        !           135: /**************************************************************************\
        !           136: *
        !           137: *  function:  MainWndProc()
        !           138: *
        !           139: *  input parameters:  normal window procedure parameters.
        !           140: *
        !           141: \**************************************************************************/
        !           142: LRESULT MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        !           143: {
        !           144: static HANDLE     hPenGrid;
        !           145: static LOGFONT    lf;
        !           146: static TEXTMETRIC tm;
        !           147: 
        !           148:   switch (message) {
        !           149: 
        !           150: 
        !           151:     /**********************************************************************\
        !           152:     *  WM_COMMAND
        !           153:     *
        !           154:     * The WM_COMMAND messages here are passed up from the toolbar.
        !           155:     *  Take whatever action is necesarry for the various buttons.
        !           156:     *  (Either showing/hiding enumeration windows, or moving information
        !           157:     *  in structures between different windows.)
        !           158:     \**********************************************************************/
        !           159:     case WM_COMMAND: {
        !           160: 
        !           161:       switch (LOWORD(wParam)) {
        !           162:         HWND hwndButton;
        !           163: 
        !           164:         case TBID_ENUM:
        !           165:           SetWindowPos (hwndDisplayFonts, NULL, 0,0,0,0,
        !           166:                         SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
        !           167:           SetFocus (hwndDisplayFonts);
        !           168:         break;
        !           169: 
        !           170:         case TBID_PRINT:
        !           171:           SetWindowPos (hwndPrinterFonts, NULL, 0,0,0,0,
        !           172:                         SWP_SHOWWINDOW | SWP_NOMOVE | SWP_NOSIZE);
        !           173:           SetFocus (hwndPrinterFonts);
        !           174:         break;
        !           175: 
        !           176:         case TBID_CREATE:
        !           177:           SendMessage (hwndDlgLF, WMU_LFTODEMO, 0, (LONG) &lf);
        !           178:           flyWinWin (hwndMain, hwndDlgLF, hwndDemo, FWW_STEPS);
        !           179:           SendMessage (hwndDemo , WMU_LFTODEMO, 0, (LONG) &lf);
        !           180:         break;
        !           181: 
        !           182:         case TBID_GETTM:
        !           183:           SendMessage (hwndDemo , WMU_DEMOTOTM, 0, (LONG) &tm);
        !           184:           flyWinWin (hwndMain, hwndDemo, hwndDlgTM, FWW_STEPS);
        !           185:           SendMessage (hwndDlgTM, WMU_DEMOTOTM, 0, (LONG) &tm);
        !           186:         break;
        !           187: 
        !           188: 
        !           189:         /* two checkboxes.  get new state and force repaint of demo window */
        !           190:         case TBID_CHKALLGLYPHS:
        !           191:           hwndButton = GetDlgItem(hwndTB, (int) LOWORD(wParam));
        !           192:           allglyphsGlobal = (BOOL) SendMessage (hwndButton, BM_GETCHECK, 0,0);
        !           193:           InvalidateRect (hwndDemo, NULL, TRUE);
        !           194:         break;
        !           195: 
        !           196:         case TBID_CHKMAPPERFLAGS:
        !           197:           hwndButton = GetDlgItem(hwndTB, (int) LOWORD(wParam));
        !           198:           mapperflagsGlobal = (BOOL) SendMessage (hwndButton, BM_GETCHECK, 0,0);
        !           199:           InvalidateRect (hwndDemo, NULL, TRUE);
        !           200:         break;
        !           201: 
        !           202:       } /* end switch */
        !           203:     } break;  /* end WM_COMMAND */
        !           204: 
        !           205: 
        !           206: 
        !           207: 
        !           208: 
        !           209:     /**********************************************************************\
        !           210:     *  WM_CREATE
        !           211:     *
        !           212:     * Create pens for drawing with later.
        !           213:     \**********************************************************************/
        !           214:     case WM_CREATE:
        !           215:         hPenGrid   = CreatePen (PS_SOLID, 1, GRIDCOLOR);
        !           216:     break;
        !           217: 
        !           218: 
        !           219:     /**********************************************************************\
        !           220:     *  WM_DESTROY
        !           221:     *
        !           222:     * Complement of the WM_CREATE message.  Delete the pens that were
        !           223:     *  created and then call postquitmessage.
        !           224:     \**********************************************************************/
        !           225:     case WM_DESTROY:
        !           226:       DeleteObject (hPenGrid);
        !           227:       PostQuitMessage(0);
        !           228:     break;
        !           229: 
        !           230: 
        !           231: 
        !           232:     /**********************************************************************\
        !           233:     *  WM_ERASEBKGND
        !           234:     *
        !           235:     \**********************************************************************/
        !           236:     case WM_ERASEBKGND: {
        !           237:       HDC hdc;
        !           238:       RECT rect;
        !           239:       int i;
        !           240: 
        !           241:       hdc = (HDC)wParam;
        !           242: 
        !           243:       SetViewportOrgEx (hdc, 0, TOOLBARHEIGHT, NULL);
        !           244:       GetClientRect (hwndMain, &rect);
        !           245:       FillRect (hdc, &rect, GetStockObject (BLACK_BRUSH));
        !           246: 
        !           247:       SelectObject(hdc, hPenGrid);
        !           248:       /* Draw vertical lines.  */
        !           249:       for (i = 0; i<= rect.right; i+=TICKSPACE){
        !           250:         MoveToEx (hdc, i, rect.top, NULL);
        !           251:         LineTo (hdc, i, rect.bottom);
        !           252:       }
        !           253: 
        !           254:       /* Draw horizontal lines.  */
        !           255:       for (i = 0; i<= rect.bottom; i+=TICKSPACE){
        !           256:         MoveToEx (hdc, rect.left,i, NULL);
        !           257:         LineTo (hdc, rect.right,i);
        !           258:       }
        !           259:     } return TRUE;
        !           260: 
        !           261: 
        !           262:     default:
        !           263:       return (DefWindowProc(hwnd, message, wParam, lParam));
        !           264:     }
        !           265:     return (NULL);
        !           266: }
        !           267: 
        !           268: 
        !           269: 
        !           270: 
        !           271: 
        !           272: 
        !           273: /**************************************************************************\
        !           274: *  function:  flyWinWin
        !           275: *
        !           276: * Send rectangles flying on the screen to indicate data flow.
        !           277: *
        !           278: *  input parameters:
        !           279: *   hwndMain - parent window in which other two exist (grandchildren o.k.)
        !           280: *   hwndFrom - rectangles originate here.
        !           281: *   hwndTo   - and travel here.
        !           282: *   steps    - number of steps to take.  Fewer is faster.
        !           283: *
        !           284: \**************************************************************************/
        !           285: VOID flyWinWin(HWND hwndMain, HWND hwndFrom, HWND hwndTo, int steps)
        !           286: {
        !           287: RECT rectFrom, rectTo;
        !           288: RECT rectI;
        !           289: HDC hdc;
        !           290: int i, iLeft, iTop, iRight, iBottom;
        !           291: 
        !           292:     /* retrieve the window rects in screen coordinates. */
        !           293:     GetWindowRect (hwndFrom, &rectFrom);
        !           294:     GetWindowRect (hwndTo, &rectTo);
        !           295: 
        !           296:     /* convert them to be relative to the parent window. */
        !           297:     ScreenToClient (hwndMain,(LPPOINT)&rectFrom.left);
        !           298:     ScreenToClient (hwndMain,(LPPOINT)&rectFrom.right);
        !           299:     ScreenToClient (hwndMain,(LPPOINT)&rectTo.left);
        !           300:     ScreenToClient (hwndMain,(LPPOINT)&rectTo.right);
        !           301: 
        !           302:     /* Get an HDC, set the ROP so that painting twice will restore to the
        !           303:      *  same state.  Then select in the NULL brush so that the Rectangle()
        !           304:      *  call will not fill in the interior.
        !           305:      */
        !           306:     hdc = GetDC (hwndMain);
        !           307:     SetROP2(hdc, R2_NOT);
        !           308:     SelectObject (hdc, GetStockObject (NULL_BRUSH));
        !           309: 
        !           310:     /* Compute the increment to change on each step.  Notice that round
        !           311:      *  off loss will cause the target window (hwndTo) to be "missed" if
        !           312:      *  the windows nearly allign on some edge, and there are a large number
        !           313:      *  of steps.
        !           314:      */
        !           315:     iLeft =   (rectTo.left   - rectFrom.left)   /steps;
        !           316:     iTop =    (rectTo.top    - rectFrom.top)    /steps;
        !           317:     iRight =  (rectTo.right  - rectFrom.right)  /steps;
        !           318:     iBottom = (rectTo.bottom - rectFrom.bottom) /steps;
        !           319: 
        !           320:     /* Draw the series of rectangles the first time. */
        !           321:     rectI = rectFrom;
        !           322:     for (i= 0; i<steps; i++) {
        !           323:       rectI.left += iLeft;
        !           324:       rectI.top += iTop;
        !           325:       rectI.right += iRight;
        !           326:       rectI.bottom += iBottom;
        !           327: 
        !           328:       Rectangle (hdc, rectI.left, rectI.top , rectI.right, rectI.bottom);
        !           329:     }
        !           330: 
        !           331:     /* start from the same place, and draw them again... this time erases. */
        !           332:     rectI = rectFrom;
        !           333:     for (i= 0; i< steps; i++) {
        !           334:       rectI.left += iLeft;
        !           335:       rectI.top += iTop;
        !           336:       rectI.right += iRight;
        !           337:       rectI.bottom += iBottom;
        !           338: 
        !           339:       Rectangle (hdc, rectI.left, rectI.top , rectI.right, rectI.bottom);
        !           340:     }
        !           341: 
        !           342:     ReleaseDC (hwndMain,hdc);
        !           343: }

unix.superglobalmegacorp.com

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