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

1.1       root        1: 
                      2: /******************************************************************************\
                      3: *       This is a part of the Microsoft Source Code Samples. 
                      4: *       Copyright (C) 1993 Microsoft Corporation.
                      5: *       All rights reserved. 
                      6: *       This source code is only intended as a supplement to 
                      7: *       Microsoft Development Tools and/or WinHelp documentation.
                      8: *       See these sources for detailed information regarding the 
                      9: *       Microsoft samples programs.
                     10: \******************************************************************************/
                     11: 
                     12: /**************************************************************************\
                     13: *  ttfonts.c -- Font enumeration and manipulation program for Win32/NT.
                     14: *
                     15: * design:  There is a main frame window (hwndMain) with a child toolbar,
                     16: *  two child dialogs, and a child demonstration window.  All window handles
                     17: *  are global and are accesible to all modules.  There is a module for each
                     18: *  of the classes of windows.  Each module contains an initialization routine
                     19: *  to register the class and create the window(s).  Each module also contains
                     20: *  a window procedure for that class.  The two windows which list all of the
                     21: *  fonts are also children of the main window, and they are hidden and shown
                     22: *  as needed.
                     23: *
                     24: *  Communication between windows is via message passing.  The toolbar passes
                     25: *  all of its command messages back to the main window.  Other windows pass
                     26: *  information back and forth with the following USER defined messages:
                     27: *  WMU_LFTODEMO, WMU_DEMOTOLF, WMU_DEMOTOTM...  Rectangles fly on the screen
                     28: *  (c.f. flyWinWin) to mirror message trafic, i.e. data flow.
                     29: *
                     30: \**************************************************************************/
                     31: #define UNICODE
                     32: 
                     33: #include <windows.h>
                     34: #include "ttfonts.h"
                     35: 
                     36: 
                     37: /* Misc. defines for size, color, and appearance of drawing. */
                     38: #define GRIDCOLOR  PALETTEINDEX (6)
                     39: #define TICKSPACE  20
                     40: #define FWW_STEPS  40
                     41: 
                     42: 
                     43: 
                     44: TCHAR initString[] = TEXT("Please wait. Initializing data structures.");
                     45: TCHAR szHelpPathName[] = TEXT("ttfonts.HLP");
                     46: 
                     47: 
                     48: 
                     49: /**************************************************************************\
                     50: *
                     51: *  function:  WinMain()
                     52: *
                     53: *  input parameters:  c.f. generic sample
                     54: *
                     55: \**************************************************************************/
                     56: int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     57:                      LPSTR lpCmdLine, int nCmdShow)
                     58: {
                     59:     MSG    msg;
                     60:     HWND   hwndInfo;
                     61:     CLIENTCREATESTRUCT clientcreate;
                     62:     RECT   clientRect;
                     63:     HANDLE haccel;
                     64: 
                     65: 
                     66:     UNREFERENCED_PARAMETER( lpCmdLine );
                     67:     UNREFERENCED_PARAMETER(  nCmdShow );
                     68:     hInst = hInstance;
                     69: 
                     70: 
                     71:     /* Check for previous instance.  If none, then register class. */
                     72:     if (!hPrevInstance) {
                     73:       WNDCLASS  wc;
                     74: 
                     75:       wc.style = 0;
                     76:       wc.lpfnWndProc = (WNDPROC)MainWndProc;
                     77: 
                     78:       wc.cbClsExtra = 0;
                     79:       wc.cbWndExtra = 0;
                     80:       wc.hInstance = hInstance;
                     81:       wc.hIcon = LoadIcon(hInstance, TEXT("ttfontsIcon"));
                     82:       wc.hCursor = LoadCursor(NULL, IDC_ARROW);
                     83:       wc.hbrBackground = NULL;
                     84:       wc.lpszMenuName =  TEXT("ttfontsMenu");
                     85:       wc.lpszClassName = TEXT("ttfonts");
                     86: 
                     87:       if (!RegisterClass(&wc)) return (FALSE);
                     88: 
                     89:     }  /* class registered o.k. */
                     90: 
                     91: 
                     92:     /* Create the main window.  Return false if CreateWindow() fails */
                     93:     hwndMain = CreateWindow(
                     94:         TEXT("ttfonts"),
                     95:         TEXT("TTFonts"),
                     96:         WS_OVERLAPPEDWINDOW,
                     97:         CW_USEDEFAULT,
                     98:         CW_USEDEFAULT,
                     99:         CW_USEDEFAULT,
                    100:         CW_USEDEFAULT,
                    101:         NULL, NULL, hInst, NULL);
                    102: 
                    103:     if (!hwndMain) return (FALSE);
                    104: 
                    105: 
                    106:     /* create temporary window to display while initialization completes */
                    107:     hwndInfo = CreateWindow(
                    108:         TEXT("EDIT"),
                    109:         initString,
                    110:         WS_CHILD | WS_VISIBLE | ES_READONLY | ES_MULTILINE | ES_CENTER,
                    111:         0,0,
                    112:         GetSystemMetrics (SM_CXFULLSCREEN),
                    113:         GetSystemMetrics (SM_CYFULLSCREEN),
                    114:         hwndMain, NULL, hInst, NULL);
                    115: 
                    116:     ShowWindow(hwndMain, SW_SHOWMAXIMIZED);
                    117:     UpdateWindow(hwndInfo);
                    118: 
                    119:     /* create the MDI "client" window. Invisible initially. */
                    120:     clientcreate.hWindowMenu  = NULL;  /* don't add window names to menu */
                    121:     clientcreate.idFirstChild = 1;
                    122:     GetClientRect (hwndMain, &clientRect);
                    123:     clientRect.top += TOOLBARHEIGHT;
                    124:     hwndClient = CreateWindow(
                    125:         TEXT("MDICLIENT"),
                    126:         NULL,
                    127:         WS_CHILD | WS_CLIPCHILDREN | MDIS_ALLCHILDSTYLES,
                    128:         0, clientRect.top,
                    129:         clientRect.right, clientRect.bottom - clientRect.top,
                    130:         hwndMain, NULL, hInst, (LPVOID)&clientcreate);
                    131:     if (!hwndClient) return (FALSE);
                    132: 
                    133: 
                    134: 
                    135:     /* perform initialization for other windows...allfont is SLOW */
                    136:     if (!initTB(hwndMain))         return FALSE;
                    137:     if (!initDisplay(hwndClient))     return FALSE;
                    138:     if (!initDlg(hwndClient))      return FALSE;
                    139:     if (!initAllFont(hwndClient))  return FALSE;
                    140: 
                    141: 
                    142:     SendMessage (hwndMain, WM_COMMAND, IDM_ARRANGE,0);
                    143: 
                    144:     /* Load the accelerator table that provides clipboard support. */
                    145:     haccel = LoadAccelerators (hInst, TEXT("ttfontsAccel"));
                    146: 
                    147:     /* get rid of the temporary "please wait..." window. */
                    148:     DestroyWindow (hwndInfo);
                    149:     ShowWindow(hwndClient, SW_SHOW);
                    150: 
                    151:     /* Loop getting messages and dispatching them. */
                    152:     while (GetMessage(&msg,NULL, 0,0)) {
                    153:       if (!TranslateAccelerator(hwndMain, haccel, &msg))
                    154:       if (!IsDialogMessage (hwndDlgTM, &msg))
                    155:       if (!IsDialogMessage (hwndDlgOLTM, &msg))
                    156:       if (!IsDialogMessage (hwndDlgLF, &msg))
                    157:       if (!IsDialogMessage (hwndDlgFD, &msg)){
                    158:         TranslateMessage(&msg);
                    159:         DispatchMessage(&msg);
                    160:       }
                    161:     }
                    162: 
                    163:     return (msg.wParam);
                    164: }
                    165: 
                    166: 
                    167: 
                    168: /**************************************************************************\
                    169: *
                    170: *  function:  MainWndProc()
                    171: *
                    172: *  input parameters:  normal window procedure parameters.
                    173: *
                    174: \**************************************************************************/
                    175: LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    176: {
                    177: static HANDLE     hPenGrid;
                    178: static LOGFONT    lf;
                    179: static TEXTMETRIC tm;
                    180: 
                    181:   switch (message) {
                    182: 
                    183: 
                    184:     /**********************************************************************\
                    185:     *  WM_COMMAND
                    186:     *
                    187:     * The WM_COMMAND messages here are passed up from the toolbar.
                    188:     *  Take whatever action is necesarry for the various buttons.
                    189:     *  (Either showing/hiding enumeration windows, or moving information
                    190:     *  in structures between different windows.)
                    191:     \**********************************************************************/
                    192:     case WM_COMMAND: {
                    193: 
                    194:       switch (LOWORD(wParam)) {
                    195:         HDC hdcDemo;
                    196: 
                    197:         case TBID_ENUM:
                    198:           ShowWindow(hwndDisplayFonts, SW_SHOWMAXIMIZED);
                    199:         break;
                    200: 
                    201:         case TBID_PRINT:
                    202:           ShowWindow(hwndPrinterFonts, SW_SHOWMAXIMIZED);
                    203:         break;
                    204: 
                    205:         /* Send the LOGFONT dialog a message to fill in a LOGFONT structure,
                    206:          *  then pass that structure along to the DEMO window.
                    207:          */
                    208:         case TBID_CREATE:
                    209:           SendMessage (hwndDlgLF, WMU_LFTODEMO, 0, (LONG) &lf);
                    210:           flyWinWin (hwndMain, hwndDlgLF, hwndDisplay, FWW_STEPS);
                    211:           SendMessage (hwndDisplay , WMU_NEWFONT, 0, (LONG) &lf);
                    212:         break;
                    213: 
                    214: 
                    215:         /* Same exchange as LOGFONT for the TEXTMETRIC structure.
                    216:          *  However, for the OUTLINETEXTMETRIC stucture,
                    217:          *  send the DEMO window a message asking for an HDC with the
                    218:          *  current font selected into it.  Pass that HDC along to the
                    219:          *  OUTLINETEXTMETRIC dialog so that it can query the structure,
                    220:          *  and display the values.
                    221:          */
                    222:         case TBID_GETTM:
                    223: 
                    224:           SendMessage (hwndDisplay , WMU_DEMOTOTM, 0, (LONG) &tm);
                    225:           flyWinWin (hwndMain, hwndDisplay, hwndDlgTM, FWW_STEPS);
                    226:           SendMessage (hwndDlgTM, WMU_DEMOTOTM, 0, (LONG) &tm);
                    227: 
                    228:           hdcDemo = (HDC) SendMessage (hwndDisplay , WMU_DEMOGETDC, 0, 0);
                    229:           flyWinWin (hwndMain, hwndDisplay, hwndDlgOLTM, FWW_STEPS);
                    230:           SendMessage (hwndDlgOLTM, WMU_DEMOTOOLTM, 0, (LPARAM) hdcDemo);
                    231:           SendMessage (hwndDisplay , WMU_DEMORELEASEDC, 0, (LPARAM) hdcDemo);
                    232: 
                    233:         break;
                    234: 
                    235: 
                    236:         /* Send message down to hwndDlgFD w/ HDC from hwndDisplay.
                    237:          *  hwndDlgFD will parse its params, and call GetFontData().
                    238:          */
                    239:         case TBID_GETFONTDATA:
                    240: 
                    241:           hdcDemo = (HDC) SendMessage (hwndDisplay , WMU_DEMOGETDC, 0, 0);
                    242:           flyWinWin (hwndMain, hwndDisplay, hwndDlgFD, FWW_STEPS);
                    243:           SendMessage (hwndDlgFD, WMU_GETFONTDATA, 0, (LPARAM) hdcDemo);
                    244:           SendMessage (hwndDisplay , WMU_DEMORELEASEDC, 0, (LPARAM) hdcDemo);
                    245: 
                    246:         break;
                    247: 
                    248: 
                    249:         /* Send message to display window to fill in LOGFONT, then
                    250:          *  send that LOGFONT data back to the logfont dialog.
                    251:          */
                    252:         case IDM_GETOBJECT:
                    253:           flyWinWin (hwndMain, hwndDisplay, hwndDlgLF, FWW_STEPS);
                    254:           SendMessage (hwndDisplay , WMU_DEMOTOLF, 0, (LPARAM) &lf);
                    255:           SendMessage (hwndDlgLF , WMU_DEMOTOLF, 0, (LPARAM) &lf);
                    256:         break;
                    257: 
                    258:         /******************************************************************\
                    259:         *  WM_COMMAND, IDM_*_FONT
                    260:         *
                    261:         * Send the display window the proper message for it to use one
                    262:         *  of the GetStockObject() fonts.  Then send this window a message
                    263:         *  to "getobject" so that the logfont will be copied from the
                    264:         *  display window to the logfont dialog.
                    265:         \******************************************************************/
                    266:         case IDM_ANSI_FIXED_FONT    :
                    267:           SendMessage (hwndDisplay , WMU_HFONTTODEMO, 0,
                    268:                        (LPARAM) GetStockObject(ANSI_FIXED_FONT));
                    269:           SendMessage (hwnd, WM_COMMAND, IDM_GETOBJECT, 0);
                    270:         break;
                    271:         case IDM_ANSI_VAR_FONT      :
                    272:           SendMessage (hwndDisplay , WMU_HFONTTODEMO, 0,
                    273:                        (LPARAM) GetStockObject(ANSI_VAR_FONT));
                    274:           SendMessage (hwnd, WM_COMMAND, IDM_GETOBJECT, 0);
                    275:         break;
                    276:         case IDM_DEVICE_DEFAULT_FONT:
                    277:           SendMessage (hwndDisplay , WMU_HFONTTODEMO, 0,
                    278:                        (LPARAM) GetStockObject(DEVICE_DEFAULT_FONT));
                    279:           SendMessage (hwnd, WM_COMMAND, IDM_GETOBJECT, 0);
                    280:         break;
                    281:         case IDM_OEM_FIXED_FONT     :
                    282:           SendMessage (hwndDisplay , WMU_HFONTTODEMO, 0,
                    283:                        (LPARAM) GetStockObject(OEM_FIXED_FONT));
                    284:           SendMessage (hwnd, WM_COMMAND, IDM_GETOBJECT, 0);
                    285:         break;
                    286:         case IDM_SYSTEM_FIXED_FONT  :
                    287:           SendMessage (hwndDisplay , WMU_HFONTTODEMO, 0,
                    288:                        (LPARAM) GetStockObject(SYSTEM_FIXED_FONT));
                    289:           SendMessage (hwnd, WM_COMMAND, IDM_GETOBJECT, 0);
                    290:         break;
                    291:         case IDM_SYSTEM_FONT        :
                    292:           SendMessage (hwndDisplay , WMU_HFONTTODEMO, 0,
                    293:                        (LPARAM) GetStockObject(SYSTEM_FONT));
                    294:           SendMessage (hwnd, WM_COMMAND, IDM_GETOBJECT, 0);
                    295:         break;
                    296: 
                    297: 
                    298: 
                    299:         /******************************************************************\
                    300:         *  WM_COMMAND, IDM_CHOOSEFONT
                    301:         *
                    302:         * Get the LOGFONT from the dialog, initialize the CHOOSEFONT struct,
                    303:         *  put up the ChooseFont() dialog, take the resulting LOGFONT and put
                    304:         *  it back in the dialog.  Force a createfont message.
                    305:         \******************************************************************/
                    306:         case IDM_CHOOSEFONT: {
                    307:           CHOOSEFONT   chf;
                    308: 
                    309:           /* fill a log font ahead of time to init the common dialog */
                    310:           SendMessage (hwndDlgLF , WMU_LFTODEMO, 0, (LPARAM) &lf);
                    311: 
                    312:           chf.lStructSize = sizeof(CHOOSEFONT);
                    313:           chf.hwndOwner = hwnd;
                    314:           chf.hDC = NULL;
                    315:           chf.lpLogFont = &lf;
                    316:           chf.iPointSize = 0;
                    317:           chf.Flags = CF_SCREENFONTS | CF_INITTOLOGFONTSTRUCT;
                    318:           // chf.Flags |= CF_EFFECTS; // no support for COLOR yet in TTFONTS.
                    319:           chf.rgbColors = RGB(0,0,0);
                    320:           chf.lCustData = 0;
                    321:           chf.lpfnHook = NULL;
                    322:           chf.lpTemplateName = NULL;
                    323:           chf.hInstance = hInst;
                    324:           chf.lpszStyle = NULL;
                    325:           chf.nFontType = SIMULATED_FONTTYPE;
                    326:           chf.nSizeMin = 0;
                    327:           chf.nSizeMax = 0;
                    328: 
                    329:           if( ChooseFont( &chf ) != FALSE ) {
                    330:             /* flyWinWin from client to dlgLF since we don't have hwnd
                    331:              *  for the common dialog, and since it is not a child window.
                    332:              */
                    333:             flyWinWin (hwndMain, hwndClient, hwndDlgLF, FWW_STEPS);
                    334:             SendMessage (hwndDlgLF , WMU_DEMOTOLF, 0, (LPARAM) chf.lpLogFont);
                    335:             SendMessage (hwnd, WM_COMMAND, TBID_CREATE, 0);
                    336:           }
                    337:         } break;
                    338: 
                    339: 
                    340: 
                    341: 
                    342:         /* Simply send message to display window, and it does all work. */
                    343:         case IDM_PRINT:
                    344:           SendMessage (hwndDisplay , WMU_PRINT, 0, 0);
                    345:         break;
                    346: 
                    347: 
                    348:         /* No printer, disable menu and button. */
                    349:         case IDU_NOPRINTER:
                    350:           EnableMenuItem (GetMenu(hwnd), TBID_PRINT, MF_GRAYED);
                    351:           EnableMenuItem (GetMenu(hwnd), IDM_PRINT , MF_GRAYED);
                    352:           SendMessage (hwndTB , WM_COMMAND, IDU_NOPRINTER, 0);
                    353:         break;
                    354: 
                    355: 
                    356:         case IDM_HELP:
                    357:           WinHelp( hwnd, szHelpPathName, HELP_INDEX, (DWORD) NULL );
                    358:         break;
                    359: 
                    360: 
                    361:         case IDM_ABOUT:
                    362:           DialogBox (hInst, TEXT("aboutBox"), hwnd, (DLGPROC) About);
                    363:         break;
                    364: 
                    365: 
                    366: 
                    367:         /******************************************************************\
                    368:         *  WM_COMMAND, IDM_FLYWINWIN
                    369:         *
                    370:         * Check menu on and off.  Query state in FlyWinWin() function.
                    371:         \******************************************************************/
                    372:         case IDM_FLYWINWIN:
                    373:           if (GetMenuState (GetMenu (hwnd),IDM_FLYWINWIN, MF_BYCOMMAND)
                    374:                 == MF_CHECKED) {
                    375:             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED);
                    376:           } else {
                    377:             CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED);
                    378:           }
                    379:         break;
                    380: 
                    381: 
                    382:         /******************************************************************\
                    383:         *  WM_COMMAND, IDM_MODE*
                    384:         *
                    385:         * manage mutually exclusive menu.
                    386:         *  inform the window that it has a new mode.
                    387:         *  invalidate window to force repaint.
                    388:         *  Special case MODEALL to check that it is o.k. first.
                    389:         \******************************************************************/
                    390:         case IDM_MODEALL    :
                    391:           if (!SendMessage (hwndDisplay, WMU_NEWMODEALL, 0,0)) {
                    392:             return 0;
                    393:           }
                    394:           CheckMenuItem(GetMenu (hwnd), IDM_MODEHELLO  , MF_UNCHECKED);
                    395:           CheckMenuItem(GetMenu (hwnd), IDM_MODETMRANGE, MF_UNCHECKED);
                    396:           CheckMenuItem(GetMenu (hwnd), IDM_MODEALL    , MF_CHECKED);
                    397:           InvalidateRect (hwndDisplay, NULL, TRUE);
                    398:         return 0;
                    399: 
                    400:         case IDM_MODEHELLO  :
                    401:           CheckMenuItem(GetMenu (hwnd), IDM_MODEHELLO  , MF_CHECKED);
                    402:           CheckMenuItem(GetMenu (hwnd), IDM_MODETMRANGE, MF_UNCHECKED);
                    403:           CheckMenuItem(GetMenu (hwnd), IDM_MODEALL    , MF_UNCHECKED);
                    404:           SendMessage (hwndDisplay, WMU_NEWMODEHELLO, 0,0);
                    405:           InvalidateRect (hwndDisplay, NULL, TRUE);
                    406:         return 0;
                    407: 
                    408:         case IDM_MODETMRANGE:
                    409:           CheckMenuItem(GetMenu (hwnd), IDM_MODEHELLO  , MF_UNCHECKED);
                    410:           CheckMenuItem(GetMenu (hwnd), IDM_MODETMRANGE, MF_CHECKED);
                    411:           CheckMenuItem(GetMenu (hwnd), IDM_MODEALL    , MF_UNCHECKED);
                    412:           SendMessage (hwndDisplay, WMU_NEWMODETMRANGE, 0,0);
                    413:           InvalidateRect (hwndDisplay, NULL, TRUE);
                    414:         return 0;
                    415: 
                    416: 
                    417: 
                    418:         /******************************************************************\
                    419:         *  WM_COMMAND, IDM_*
                    420:         *
                    421:         * misc. MDI responsibilities.  hwndClient does real work.
                    422:         \******************************************************************/
                    423:         case IDM_CASCADE: SendMessage (hwndClient, WM_MDICASCADE, 0,0); break;
                    424:         case IDM_TILE:    SendMessage (hwndClient, WM_MDITILE, 0,0); break;
                    425:         case IDM_ARRANGE:
                    426:           ShowWindow(hwndDisplayFonts, SW_SHOWMINIMIZED);
                    427:           ShowWindow(hwndPrinterFonts, SW_SHOWMINIMIZED);
                    428:           ShowWindow(hwndDlgOLTM, SW_SHOWMINIMIZED);
                    429:           ShowWindow(hwndDlgFD, SW_SHOWMINIMIZED);
                    430:           ShowWindow(hwndDlgTM, SW_RESTORE);
                    431:           SetWindowPos (hwndDlgTM, HWND_TOP,
                    432:               CHILDLEFT(0), CHILDTOP, 0,0, SWP_NOSIZE);
                    433:           ShowWindow(hwndDlgLF, SW_RESTORE);
                    434:           SetWindowPos (hwndDlgLF, HWND_TOP,
                    435:               CHILDLEFT(1), CHILDTOP, 0,0, SWP_NOSIZE);
                    436:           ShowWindow(hwndDisplay, SW_RESTORE);
                    437:           SetWindowPos (hwndDisplay, HWND_TOP,
                    438:               CHILDLEFT(2), CHILDTOP,
                    439:               GetSystemMetrics (SM_CXFULLSCREEN)/3 - 10,
                    440:               GetSystemMetrics (SM_CYFULLSCREEN)/3, 0);
                    441:           SendMessage (hwndClient, WM_MDIICONARRANGE, 0,0);
                    442:         break;
                    443: 
                    444: 
                    445: 
                    446: 
                    447:       } /* end switch */
                    448:     } break;  /* end WM_COMMAND */
                    449: 
                    450: 
                    451: 
                    452: 
                    453: 
                    454:     /**********************************************************************\
                    455:     *  WM_CREATE
                    456:     *
                    457:     * Create pens for drawing with later.
                    458:     \**********************************************************************/
                    459:     case WM_CREATE:
                    460:       hPenGrid   = CreatePen (PS_SOLID, 1, GRIDCOLOR);
                    461:       CheckMenuItem (GetMenu (hwnd), IDM_FLYWINWIN, MF_BYCOMMAND | MF_CHECKED);
                    462:       CheckMenuItem (GetMenu (hwnd), IDM_MODEHELLO, MF_BYCOMMAND | MF_CHECKED);
                    463:       gDisplaymode = IDM_MODEHELLO;
                    464:     break;
                    465: 
                    466: 
                    467:     /**********************************************************************\
                    468:     *  WM_DESTROY
                    469:     *
                    470:     * Complement of the WM_CREATE message.  Delete the pens that were
                    471:     *  created and then call postquitmessage.
                    472:     \**********************************************************************/
                    473:     case WM_DESTROY:
                    474:       DeleteObject (hPenGrid);
                    475:       WinHelp( hwnd, szHelpPathName, (UINT) HELP_QUIT, (DWORD) NULL );
                    476:       PostQuitMessage(0);
                    477:     break;
                    478: 
                    479: 
                    480: 
                    481:     /**********************************************************************\
                    482:     *  WM_SIZE
                    483:     *
                    484:     * When the frame is sized, then change the size of the MDI client.
                    485:     \**********************************************************************/
                    486:     case WM_SIZE: {
                    487: 
                    488:       RECT r;
                    489:       GetClientRect (hwnd, &r);
                    490:       r.top += TOOLBARHEIGHT;
                    491:       SetWindowPos (hwndClient, HWND_BOTTOM,
                    492:                     r.left, r.top, r.right, r.bottom - r.top, 0);
                    493:       return TRUE;
                    494: 
                    495:     } break;
                    496: 
                    497: 
                    498:     default: break;
                    499:     } /* end switch */
                    500: 
                    501:   return (DefFrameProc(hwnd, hwndClient, message, wParam, lParam));
                    502: }
                    503: 
                    504: 
                    505: 
                    506: /***************************************************************************\
                    507: *    FUNCTION: About
                    508: \***************************************************************************/
                    509: LRESULT CALLBACK About(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
                    510: {
                    511:   if ((message == WM_COMMAND) && (LOWORD(wParam) == IDOK)) {
                    512:     EndDialog (hwnd, TRUE);
                    513:     return TRUE;
                    514:   }
                    515:   if ((message == WM_SYSCOMMAND) && (wParam == SC_CLOSE)) {
                    516:     EndDialog (hwnd, TRUE);
                    517:     return TRUE;
                    518:   }
                    519:   return FALSE;
                    520: }
                    521: 
                    522: 
                    523: 
                    524: 
                    525: 
                    526: /**************************************************************************\
                    527: *  function:  flyWinWin
                    528: *
                    529: * Send rectangles flying on the screen to indicate data flow.
                    530: *
                    531: *  input parameters:
                    532: *   handParent - parent window in which other two exist (grandchildren o.k.)
                    533: *   hwndFrom - rectangles originate here.
                    534: *   hwndTo   - and travel here.
                    535: *   steps    - number of steps to take.  Fewer is faster.
                    536: *
                    537: \**************************************************************************/
                    538: VOID flyWinWin(HWND handParent, HWND hwndFrom, HWND hwndTo, int steps)
                    539: {
                    540: RECT rectFrom, rectTo;
                    541: RECT rectI;
                    542: HDC hdc;
                    543: int i, iLeft, iTop, iRight, iBottom;
                    544: 
                    545:     /* The menu bar contains a checked/unchecked item which stores the
                    546:      *  state of the user's preference on whether this "information flow"
                    547:      *  should be done or not.  If unchecked, then return before doing
                    548:      *  anything.
                    549:      */
                    550:     if (GetMenuState (GetMenu (hwndMain),IDM_FLYWINWIN, MF_BYCOMMAND)
                    551:                 != MF_CHECKED) return;
                    552: 
                    553: 
                    554:     /* retrieve the window rects in screen coordinates. */
                    555:     GetWindowRect (hwndFrom, &rectFrom);
                    556:     GetWindowRect (hwndTo, &rectTo);
                    557: 
                    558:     /* convert them to be relative to the parent window. */
                    559:     ScreenToClient (handParent,(LPPOINT)&rectFrom.left);
                    560:     ScreenToClient (handParent,(LPPOINT)&rectFrom.right);
                    561:     ScreenToClient (handParent,(LPPOINT)&rectTo.left);
                    562:     ScreenToClient (handParent,(LPPOINT)&rectTo.right);
                    563: 
                    564:     /* Get an HDC, set the ROP so that painting twice will restore to the
                    565:      *  same state.  Then select in the NULL brush so that the Rectangle()
                    566:      *  call will not fill in the interior.
                    567:      */
                    568:     hdc = GetDC (handParent);
                    569:     SetROP2(hdc, R2_NOT);
                    570:     SelectObject (hdc, GetStockObject (NULL_BRUSH));
                    571: 
                    572:     /* Compute the increment to change on each step.  Notice that round
                    573:      *  off loss will cause the target window (hwndTo) to be "missed" if
                    574:      *  the windows nearly allign on some edge, and there are a large number
                    575:      *  of steps.
                    576:      */
                    577:     iLeft =   (rectTo.left   - rectFrom.left)   /steps;
                    578:     iTop =    (rectTo.top    - rectFrom.top)    /steps;
                    579:     iRight =  (rectTo.right  - rectFrom.right)  /steps;
                    580:     iBottom = (rectTo.bottom - rectFrom.bottom) /steps;
                    581: 
                    582:     /* Draw the series of rectangles the first time. */
                    583:     rectI = rectFrom;
                    584:     for (i= 0; i<steps; i++) {
                    585:       rectI.left += iLeft;
                    586:       rectI.top += iTop;
                    587:       rectI.right += iRight;
                    588:       rectI.bottom += iBottom;
                    589: 
                    590:       Rectangle (hdc, rectI.left, rectI.top , rectI.right, rectI.bottom);
                    591:     }
                    592: 
                    593:     /* start from the same place, and draw them again... this time erases. */
                    594:     rectI = rectFrom;
                    595:     for (i= 0; i< steps; i++) {
                    596:       rectI.left += iLeft;
                    597:       rectI.top += iTop;
                    598:       rectI.right += iRight;
                    599:       rectI.bottom += iBottom;
                    600: 
                    601:       Rectangle (hdc, rectI.left, rectI.top , rectI.right, rectI.bottom);
                    602:     }
                    603: 
                    604:     ReleaseDC (handParent,hdc);
                    605: }

unix.superglobalmegacorp.com

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