Annotation of mstools/samples/sdktools/perfmon/utils.c, revision 1.1.1.1

1.1       root        1: /*
                      2: ==============================================================================
                      3: 
                      4:   Application:
                      5: 
                      6:             Microsoft Windows NT (TM) Performance Monitor
                      7: 
                      8:   File:
                      9:             utils.c -- miscellaneous utility routines.  
                     10: 
                     11:             This file contains miscellaneous utiltity routines, mostly 
                     12:             low-level windows helpers. These routines are not specific
                     13:             to the perfmon utillity.
                     14: 
                     15:   Copyright 1992, Microsoft Corporation. All Rights Reserved.
                     16:   Microsoft Confidential.
                     17: ==============================================================================
                     18: */
                     19: 
                     20: 
                     21: //==========================================================================//
                     22: //                                  Includes                                //
                     23: //==========================================================================//
                     24: 
                     25: 
                     26: 
                     27: #include <stdarg.h>  // For ANSI variable args. Dont use UNIX <varargs.h>
                     28: #include <stdlib.h>  // For itoa
                     29: #include <stdio.h>   // for vsprintf.
                     30: #include <string.h>  // for strtok
                     31: 
                     32: #include "perfmon.h"
                     33: #include "pmemory.h"        // for MemoryXXX (mallloc-type) routines
                     34: #include "utils.h"
                     35: #include "pmhelpid.h"       // IDs for WinHelp
                     36: 
                     37: //==========================================================================//
                     38: //                                  Constants                               //
                     39: //==========================================================================//
                     40: 
                     41: 
                     42: #define DOS_FILES                0x0000   // Ordinary files
                     43: #define DOS_READONLY             0x0001   // Read-only files
                     44: #define DOS_HIDDEN               0x0002   // Hidden files
                     45: #define DOS_SYSTEM               0x0004   // System files
                     46: #define DOS_SUBDIRECTORIES       0x0010   // Subdirectories
                     47: #define DOS_ARCHIVES             0x0020   // Archives
                     48: #define DOS_LIB_DIR              0x2000   // LB_DIR flag
                     49: #define DOS_DRIVES               0x4000   // Drives
                     50: #define DOS_EXCLUSIVE            0x8000   // Exclusive bit
                     51: #define DOS_DRIVES_DIRECTORIES   0xC010   // Find drives and directories only
                     52: 
                     53: 
                     54: #define WILD_ONE                 '?'
                     55: #define WILD_ANY                 '*'
                     56: 
                     57: 
                     58: 
                     59: 
                     60: //==========================================================================//
                     61: //                              Local Functions                             //
                     62: //==========================================================================//
                     63: 
                     64: 
                     65: 
                     66: void ClientRectToScreen (HWND hWnd,
                     67:                          LPRECT lpRect)
                     68: /*
                     69:    Effect:        Remaps lpRect from client coordinates to screen
                     70:                   coordinates. Analogous to ClientToScreen for rectangles.
                     71: 
                     72:    Note:          To convert a rectangle from the client coordinates of
                     73:                   Wnd1 to the client coordinates of Wnd2, call:
                     74: 
                     75:                         ClientRectToScreen (hWnd1, &rect) ;
                     76:                         ScreenRectToClient (hWnd2, &rect) ;
                     77: 
                     78:    See Also:      ClientToScreen (windows), ScreenRectToClient.
                     79: 
                     80:    Internals:     Since a rectangle is really only two points, let
                     81:                   windows do the work with ClientToScreen.
                     82: */
                     83:    {  /* ClientRectToScreen */
                     84:    POINT    pt1, pt2 ;
                     85: 
                     86:    pt1.x = lpRect->left ;
                     87:    pt1.y = lpRect->top ;
                     88: 
                     89:    pt2.x = lpRect->right ;
                     90:    pt2.y = lpRect->bottom ;
                     91: 
                     92:    ClientToScreen (hWnd, &pt1) ;
                     93:    ClientToScreen (hWnd, &pt2) ;
                     94: 
                     95:    lpRect->left = pt1.x ;
                     96:    lpRect->top = pt1.y ;
                     97: 
                     98:    lpRect->right = pt2.x ;
                     99:    lpRect->bottom = pt2.y ;
                    100:    }  // ClientRectToScreen
                    101: 
                    102: 
                    103: void ScreenRectToClient (HWND hWnd, LPRECT lpRect)
                    104: /*
                    105:    Effect:        Remaps lpRect from screen coordinates to client
                    106:                   coordinates. Analogous to ScreenToClient for rectangles.
                    107: 
                    108:    Note:          To convert a rectangle from the client coordinates of
                    109:                   Wnd1 to the client coordinates of Wnd2, call:
                    110: 
                    111:                         ClientRectToScreen (hWnd1, &rect) ;
                    112:                         ScreenRectToClient (hWnd2, &rect) ;
                    113: 
                    114:    See Also:      ScreenToClient (windows), ClientRectToScreen.
                    115: 
                    116:    Internals:     Since a rectangle is really only two points, let
                    117:                   windows do the work with ScreenToClient.
                    118: */
                    119:    {  // ScreenRectToClient
                    120:    POINT    pt1, pt2 ;
                    121: 
                    122:    pt1.x = lpRect->left ;
                    123:    pt1.y = lpRect->top ;
                    124: 
                    125:    pt2.x = lpRect->right ;
                    126:    pt2.y = lpRect->bottom ;
                    127: 
                    128:    ScreenToClient (hWnd, &pt1) ;
                    129:    ScreenToClient (hWnd, &pt2) ;
                    130: 
                    131:    lpRect->left = pt1.x ;
                    132:    lpRect->top = pt1.y ;
                    133: 
                    134:    lpRect->right = pt2.x ;
                    135:    lpRect->bottom = pt2.y ;
                    136:    }  // ScreenRectToClient
                    137: 
                    138: 
                    139: //==========================================================================//
                    140: //                             Exported Functions                           //
                    141: //==========================================================================//
                    142: 
                    143: 
                    144: void Line (HDC hDC,
                    145:            HPEN hPen,
                    146:            int x1, int y1,
                    147:            int x2, int y2)
                    148:    {  // Line
                    149:    HPEN           hPenPrevious ;
                    150: 
                    151:    if (hPen)
                    152:       hPenPrevious = SelectPen (hDC, hPen) ;
                    153:    MoveToEx (hDC, x1, y1, NULL) ;
                    154:    LineTo (hDC, x2, y2) ;
                    155:    if (hPen)
                    156:       SelectObject (hDC, hPenPrevious) ;
                    157:    }  // Line
                    158: 
                    159: #if 0
                    160: void HLine (HDC hDC,
                    161:             HPEN hPen,
                    162:             int x1, 
                    163:             int x2, 
                    164:             int y)
                    165:    {  // HLine
                    166:    Line (hDC, hPen, x1, y, x2, y) ;
                    167:    }
                    168: 
                    169: 
                    170: void VLine (HDC hDC,
                    171:             HPEN hPen,
                    172:             int x,
                    173:             int y1,
                    174:             int y2)
                    175:    {  // VLine
                    176:    Line (hDC, hPen, x, y1, x, y2) ;
                    177:    }  // VLine
                    178: #endif
                    179: 
                    180: #ifdef  KEEP_UTIL
                    181: void Fill (HDC hDC,
                    182:            DWORD rgbColor,
                    183:            LPRECT lpRect)
                    184:    {  // Fill
                    185:    HBRUSH         hBrush ;
                    186: 
                    187:    hBrush = CreateSolidBrush (rgbColor) ;
                    188: 
                    189:    FillRect (hDC, lpRect, hBrush) ;
                    190: 
                    191:    DeleteBrush (hBrush) ;
                    192:    }  // Fill
                    193: 
                    194: void ThreeDConvex (HDC hDC,
                    195:                int x1, int y1, 
                    196:                int x2, int y2)
                    197:    {  // ThreeDConvex
                    198:    HBRUSH         hBrushPrevious ;
                    199:    POINT          aPoints [8] ;
                    200:    DWORD          aCounts [2] ;
                    201:    HPEN           hPenPrevious ;
                    202: 
                    203: 
                    204:    //����������������������������Ŀ
                    205:    //� Draw Face                  �
                    206:    //������������������������������
                    207: 
                    208:    hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
                    209:    PatBlt (hDC, 
                    210:            x1 + ThreeDPad, y1 + ThreeDPad, 
                    211:            x2 - x1 - ThreeDPad, y2 - y1 - ThreeDPad, 
                    212:            PATCOPY) ;
                    213:    SelectBrush (hDC, hBrushPrevious) ;
                    214: 
                    215:    //����������������������������Ŀ
                    216:    //� Draw Highlight             �
                    217:    //������������������������������
                    218: 
                    219:    if (hPenHighlight)
                    220:       hPenPrevious = SelectPen (hDC, hPenHighlight) ;
                    221: 
                    222:    aPoints [0].x = x1 ;
                    223:    aPoints [0].y = y2 - 1 ;   // this works slightly diff. than Line ??
                    224:    aPoints [1].x = x1 ;
                    225:    aPoints [1].y = y1 ;
                    226:    aPoints [2].x = x2 ;
                    227:    aPoints [2].y = y1 ;
                    228: 
                    229:    aPoints [3].x = x1 + 1 ;
                    230:    aPoints [3].y = y2 - 1 ;
                    231:    aPoints [4].x = x1 + 1 ;
                    232:    aPoints [4].y = y1 + 1 ;
                    233:    aPoints [5].x = x2 - 1 ;
                    234:    aPoints [5].y = y1 + 1 ;
                    235: 
                    236:    aCounts [0] = 3 ;
                    237:    aCounts [1] = 3 ;
                    238: 
                    239:    PolyPolyline (hDC, aPoints, aCounts, 2) ;
                    240:    
                    241:    
                    242:    if (hPenHighlight)
                    243:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    244: 
                    245: //   HLine (hDC, hPenHighlight, x1, x2, y1) ;              // outside top line
                    246: //   HLine (hDC, hPenHighlight, x1 + 1, x2 - 1, y1 + 1) ;  // inside top line
                    247: //   VLine (hDC, hPenHighlight, x1, y1, y2) ;              // outside left line
                    248: //   VLine (hDC, hPenHighlight, x1 + 1, y1 + 1, y2 - 1) ;  // inside left line
                    249: 
                    250:    //����������������������������Ŀ
                    251:    //� Draw Shadow                �
                    252:    //������������������������������
                    253: 
                    254:    if (hPenShadow)
                    255:       hPenPrevious = SelectPen (hDC, hPenShadow) ;
                    256: 
                    257:    aPoints [0].x = x1 + 1 ;
                    258:    aPoints [0].y = y2 - 1 ;
                    259:    aPoints [1].x = x2 ;
                    260:    aPoints [1].y = y2 - 1 ;
                    261:    aPoints [2].x = x2 ;
                    262:    aPoints [2].y = y2 - 2 ;
                    263:    aPoints [3].x = x1 + 2 ;
                    264:    aPoints [3].y = y2 - 2 ;
                    265: 
                    266:    aPoints [4].x = x2 - 1 ;
                    267:    aPoints [4].y = y1 ;
                    268:    aPoints [5].x = x2 - 1 ;
                    269:    aPoints [5].y = y2 - 1;
                    270:    aPoints [6].x = x2 - 2 ;
                    271:    aPoints [6].y = y2 - 1 ;
                    272:    aPoints [7].x = x2 - 2 ;
                    273:    aPoints [7].y = y1 ;
                    274: 
                    275:    aCounts [0] = 4 ;
                    276:    aCounts [1] = 4 ;
                    277: 
                    278:    PolyPolyline (hDC, aPoints, aCounts, 2) ;
                    279:    
                    280:    
                    281:    if (hPenShadow)
                    282:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    283: 
                    284: //   HLine (hDC, hPenShadow, x1 + 1, x2, y2 - 1) ;   // outside bottom line
                    285: //   HLine (hDC, hPenShadow, x1 + 2, x2, y2 - 2) ;   // inside bottom line
                    286: //   VLine (hDC, hPenShadow, x2 - 1, y1 + 1, y2) ;   // outside right line
                    287: //   VLine (hDC, hPenShadow, x2 - 2, y1 + 2, y2) ;   // inside right line
                    288: 
                    289:    }  // ThreeDConvex
                    290: 
                    291: 
                    292: 
                    293: void ThreeDConcave (HDC hDC,
                    294:                     int x1, int y1, 
                    295:                     int x2, int y2,
                    296:                     BOOL bFace)
                    297:    {  // ThreeDConcave
                    298:    HBRUSH         hBrushPrevious ;
                    299:    POINT          aPoints [6] ;
                    300:    DWORD          aCounts [2] ;
                    301:    HPEN           hPenPrevious ;
                    302: 
                    303: 
                    304:    //����������������������������Ŀ
                    305:    //� Draw Face                  �
                    306:    //������������������������������
                    307: 
                    308:    if (bFace)
                    309:       {
                    310:       hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
                    311:       PatBlt (hDC, 
                    312:               x1 + ThreeDPad, y1 + ThreeDPad, 
                    313:               x2 - x1 - ThreeDPad, y2 - y1 - ThreeDPad, 
                    314:               PATCOPY) ;
                    315:       SelectBrush (hDC, hBrushPrevious) ;
                    316:       }
                    317: 
                    318:    //����������������������������Ŀ
                    319:    //� Draw Shadow                �
                    320:    //������������������������������
                    321: 
                    322: #if 1
                    323:    if (hPenShadow)
                    324:       hPenPrevious = SelectPen (hDC, hPenShadow) ;
                    325: 
                    326:    aPoints [0].x = x1 ;
                    327:    aPoints [0].y = y2 - 1 ;
                    328:    aPoints [1].x = x1 ;
                    329:    aPoints [1].y = y1 ;
                    330:    aPoints [2].x = x2 ;
                    331:    aPoints [2].y = y1 ;
                    332: 
                    333:    aPoints [3].x = x1 + 1 ;
                    334:    aPoints [3].y = y2 - 1 ;
                    335:    aPoints [4].x = x1 + 1 ;
                    336:    aPoints [4].y = y1 + 1 ;
                    337:    aPoints [5].x = x2 - 1 ;
                    338:    aPoints [5].y = y1 + 1 ;
                    339: 
                    340:    aCounts [0] = 3 ;
                    341:    aCounts [1] = 3 ;
                    342: 
                    343:    PolyPolyline (hDC, aPoints, aCounts, 2) ;
                    344:    
                    345:    if (hPenShadow)
                    346:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    347: 
                    348: #else
                    349:    HLine (hDC, hPenShadow, x1, x2, y1) ;              // outside top line
                    350:    HLine (hDC, hPenShadow, x1 + 1, x2 - 1, y1 + 1) ;  // inside top line
                    351:    VLine (hDC, hPenShadow, x1, y1, y2) ;              // outside left line
                    352:    VLine (hDC, hPenShadow, x1 + 1, y1 + 1, y2 - 1) ;  // inside left line
                    353: #endif
                    354: 
                    355:    //����������������������������Ŀ
                    356:    //� Draw Highlight             �
                    357:    //������������������������������
                    358: 
                    359: #if 1
                    360:    if (hPenHighlight)
                    361:       hPenPrevious = SelectPen (hDC, hPenHighlight) ;
                    362: 
                    363:    aPoints [0].x = x1 + 1 ;
                    364:    aPoints [0].y = y2 - 1 ;
                    365:    aPoints [1].x = x2 ;
                    366:    aPoints [1].y = y2 - 1 ;
                    367: 
                    368:    aPoints [2].x = x2 - 1 ;
                    369:    aPoints [2].y = y2 - 1 ;
                    370:    aPoints [3].x = x2 - 1 ;
                    371:    aPoints [3].y = y1 ;
                    372: 
                    373:    aCounts [0] = 2 ;
                    374:    aCounts [1] = 2 ;
                    375: 
                    376:    PolyPolyline (hDC, aPoints, aCounts, 2) ;
                    377:    
                    378:    if (hPenHighlight)
                    379:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    380: 
                    381: #else
                    382:    HLine (hDC, hPenHighlight, x1 + 1, x2, y2 - 1) ;   // outside bottom line
                    383:    VLine (hDC, hPenHighlight, x2 - 1, y1 + 1, y2) ;   // outside right line
                    384: #endif   
                    385:    }  // ThreeDConcave
                    386: #endif // KEEP_UTIL
                    387: 
                    388:      
                    389: void ThreeDConvex1 (HDC hDC,
                    390:                     int x1, int y1, 
                    391:                     int x2, int y2)
                    392:    {  // ThreeDConvex1
                    393:    HBRUSH         hBrushPrevious ;
                    394:    POINT          aPoints [6] ;
                    395:    DWORD          aCounts [2] ;
                    396:    HPEN           hPenPrevious ;
                    397: 
                    398: 
                    399:    //����������������������������Ŀ
                    400:    //� Draw Face                  �
                    401:    //������������������������������
                    402: #if 1
                    403:    hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
                    404:    PatBlt (hDC, 
                    405:            x1 + 1, y1 + 1, 
                    406:            x2 - x1 - 1, y2 - y1 - 1, 
                    407:            PATCOPY) ;
                    408:    SelectBrush (hDC, hBrushPrevious) ;
                    409: 
                    410:    //����������������������������Ŀ
                    411:    //� Draw Highlight             �
                    412:    //������������������������������
                    413: 
                    414:    if (hPenHighlight)
                    415:       hPenPrevious = SelectPen (hDC, hPenHighlight) ;
                    416: 
                    417:    aPoints [0].x = x1 ;
                    418:    aPoints [0].y = y2 - 1 ;
                    419:    aPoints [1].x = x1 ;
                    420:    aPoints [1].y = y1 ;
                    421:    aPoints [2].x = x2 ;
                    422:    aPoints [2].y = y1 ;
                    423: 
                    424:    Polyline (hDC, aPoints, 3) ;
                    425:    
                    426:    if (hPenHighlight)
                    427:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    428: 
                    429: #else
                    430:    HLine (hDC, hPenHighlight, x1, x2, y1) ;              // outside top line
                    431:    VLine (hDC, hPenHighlight, x1, y1, y2) ;              // outside left line
                    432: #endif
                    433: 
                    434:    //����������������������������Ŀ
                    435:    //� Draw Shadow                �
                    436:    //������������������������������
                    437: 
                    438: #if 1
                    439:    if (hPenShadow)
                    440:       hPenPrevious = SelectPen (hDC, hPenShadow) ;
                    441: 
                    442:    aPoints [0].x = x1 + 1 ;
                    443:    aPoints [0].y = y2 - 1 ;
                    444:    aPoints [1].x = x2 ;
                    445:    aPoints [1].y = y2 - 1 ;
                    446: 
                    447:    aPoints [2].x = x2 - 1 ;
                    448:    aPoints [2].y = y2 - 1 ;
                    449:    aPoints [3].x = x2 - 1 ;
                    450:    aPoints [3].y = y1 ;
                    451: 
                    452:    aCounts [0] = 2 ;
                    453:    aCounts [1] = 2 ;
                    454: 
                    455:    PolyPolyline (hDC, aPoints, aCounts, 2) ;
                    456:    
                    457:    if (hPenShadow)
                    458:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    459: #else
                    460:    HLine (hDC, hPenShadow, x1 + 1, x2, y2 - 1) ;   // outside bottom line
                    461:    VLine (hDC, hPenShadow, x2 - 1, y1 + 1, y2) ;   // outside right line
                    462: #endif
                    463: 
                    464:    }  // ThreeDConvex1
                    465: 
                    466: 
                    467: 
                    468: void ThreeDConcave1 (HDC hDC,
                    469:                      int x1, int y1, 
                    470:                      int x2, int y2)
                    471:    {  // ThreeDConcave1
                    472:    HBRUSH         hBrushPrevious ;
                    473:    POINT          aPoints [6] ;
                    474:    DWORD          aCounts [2] ;
                    475:    HPEN           hPenPrevious ;
                    476: 
                    477: 
                    478:    //����������������������������Ŀ
                    479:    //� Draw Face                  �
                    480:    //������������������������������
                    481: 
                    482:    hBrushPrevious = SelectBrush (hDC, hBrushFace) ;
                    483:    PatBlt (hDC, 
                    484:            x1 + 1, y1 + 1, 
                    485:            x2 - x1 - 1, y2 - y1 - 1, 
                    486:            PATCOPY) ;
                    487:    SelectBrush (hDC, hBrushPrevious) ;
                    488: 
                    489:    //����������������������������Ŀ
                    490:    //� Draw Shadow                �
                    491:    //������������������������������
                    492: 
                    493: #if 1
                    494:    if (hPenShadow)
                    495:       hPenPrevious = SelectPen (hDC, hPenShadow) ;
                    496: 
                    497:    aPoints [0].x = x1 ;
                    498:    aPoints [0].y = y2 - 1 ;
                    499:    aPoints [1].x = x1 ;
                    500:    aPoints [1].y = y1 ;
                    501:    aPoints [2].x = x2 ;
                    502:    aPoints [2].y = y1 ;
                    503: 
                    504:    Polyline (hDC, aPoints, 3) ;
                    505:    
                    506:    if (hPenShadow)
                    507:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    508: #else
                    509:    HLine (hDC, hPenShadow, x1, x2, y1) ;              // outside top line
                    510:    VLine (hDC, hPenShadow, x1, y1, y2) ;              // outside left line
                    511: #endif
                    512: 
                    513:    //����������������������������Ŀ
                    514:    //� Draw Highlight             �
                    515:    //������������������������������
                    516: #if 1
                    517:    if (hPenHighlight)
                    518:       hPenPrevious = SelectPen (hDC, hPenHighlight) ;
                    519: 
                    520:    aPoints [0].x = x1 + 1 ;
                    521:    aPoints [0].y = y2 - 1 ;
                    522:    aPoints [1].x = x2 ;
                    523:    aPoints [1].y = y2 - 1 ;
                    524: 
                    525:    aPoints [2].x = x2 - 1 ;
                    526:    aPoints [2].y = y2 - 2 ;
                    527:    aPoints [3].x = x2 - 1 ;
                    528:    aPoints [3].y = y1 ;
                    529: 
                    530:    aCounts [0] = 2 ;
                    531:    aCounts [1] = 2 ;
                    532: 
                    533:    PolyPolyline (hDC, aPoints, aCounts, 2) ;
                    534:    
                    535:    if (hPenHighlight)
                    536:       hPenPrevious = SelectPen (hDC, hPenPrevious) ;
                    537: #else
                    538:    HLine (hDC, hPenHighlight, x1 + 1, x2, y2 - 1) ;   // outside bottom line
                    539:    VLine (hDC, hPenHighlight, x2 - 1, y1 + 1, y2) ;   // outside right line
                    540: #endif
                    541:    
                    542:    }  // ThreeDConcave1
                    543: 
                    544: 
                    545: int TextWidth (HDC hDC, LPTSTR lpszText)
                    546:    {
                    547:    SIZE           size ;
                    548: 
                    549:    if (!lpszText)
                    550:       return (0) ;
                    551: 
                    552:    GetTextExtentPoint (hDC, lpszText, lstrlen (lpszText), &size) ;
                    553:    return  (size.cx) ;
                    554:    }
                    555: 
                    556: 
                    557: int _cdecl DlgErrorBox (HWND hDlg, UINT id, ...)
                    558:    {
                    559:    TCHAR          szMessageFmt [FilePathLen + 1] ;
                    560:    TCHAR          szBuffer [FilePathLen * 2] ;
                    561:    va_list        vaList ;
                    562:    int            NumOfChar ;
                    563:    TCHAR          szApplication [WindowCaptionLen] ;
                    564: 
                    565:    NumOfChar = StringLoad (id, szMessageFmt) ;
                    566: 
                    567:    if (NumOfChar)
                    568:       {
                    569:       va_start (vaList, id) ;
                    570:       wvsprintf (szBuffer, szMessageFmt, vaList) ;
                    571:       va_end (vaList) ;
                    572: 
                    573:       StringLoad (IDS_APPNAME, szApplication) ;
                    574: 
                    575:       MessageBox (hDlg, szBuffer, szApplication,
                    576:          MB_OK | MB_ICONSTOP | MB_TASKMODAL) ;
                    577:       }
                    578: 
                    579:    return (0) ;
                    580:    }
                    581: 
                    582: 
                    583: 
                    584: 
                    585: 
                    586: 
                    587: int FontHeight (HDC hDC, 
                    588:                  BOOL bIncludeLeading)
                    589:    {  // FontHeight
                    590:    TEXTMETRIC     tm ;
                    591: 
                    592:    GetTextMetrics (hDC, &tm) ;
                    593:    if (bIncludeLeading)
                    594:       return (tm.tmHeight + tm.tmExternalLeading) ;
                    595:    else
                    596:       return (tm.tmHeight) ;
                    597:    }  // FontHeight
                    598: 
                    599: 
                    600: 
                    601: int TextAvgWidth (HDC hDC,
                    602:                   int iNumChars)
                    603:    {
                    604:    TEXTMETRIC     tm ;
                    605:    int            xAvgWidth ;
                    606: 
                    607:    GetTextMetrics (hDC, &tm) ;
                    608: 
                    609:    xAvgWidth = iNumChars * tm.tmAveCharWidth ;
                    610: 
                    611:    // add 10% slop
                    612:    return (MulDiv (xAvgWidth, 11, 10)) ;   
                    613:    }
                    614: 
                    615: 
                    616: void WindowCenter (HWND hWnd)
                    617: /*
                    618:    Effect:        Center the window hWnd in the center of the screen.
                    619:                   Physically update the windows appearance as well.
                    620: 
                    621:    Globals:       xScreenWidth, yScreenHeight.
                    622: */
                    623:    {  // WindowCenter
                    624:    RECT           rectWindow ;
                    625:    int            xWindowWidth, yWindowHeight ;
                    626: 
                    627:    GetWindowRect (hWnd, &rectWindow) ;
                    628:    xWindowWidth = rectWindow.right - rectWindow.left ;
                    629:    yWindowHeight = rectWindow.bottom - rectWindow.top ;
                    630: 
                    631:    MoveWindow (hWnd,
                    632:                (xScreenWidth - xWindowWidth) / 2,
                    633:                (yScreenHeight - yWindowHeight) / 2,
                    634:                xWindowWidth,
                    635:                yWindowHeight,
                    636:                TRUE) ;
                    637:    }  // WindowCenter
                    638: 
                    639: 
                    640: 
                    641: BOOL DialogMove (HDLG hDlg,
                    642:                  WORD wControlID,
                    643:                  int xPos, 
                    644:                  int yPos,
                    645:                  int xWidth,
                    646:                  int yHeight)
                    647: /*
                    648:    Effect:        Move the control identified by wControlID in the dialog  
                    649:                   hDlg to the new position (xPos, yPos), and resize to
                    650:                   (xWidth, yHeight). If any of these values are NOCHANGE, retain
                    651:                   the current value.
                    652: 
                    653:    Examples:      DialogMove (hDlg, IDD_FOO, 10, 20, NOCHANGE, NOCHANGE)
                    654:                      moves control but does not resize it
                    655: 
                    656:                   DialogMove (hDlg, IDD_FOO, NOCHANGE, NOCHANGE, 100, NOCHANGE)
                    657:                      sets width of control to 100
                    658: */                     
                    659:    {  // DialogMove
                    660:    HWND        hWndControl ;
                    661:    RECT        rectControl ;
                    662: 
                    663:    hWndControl = DialogControl (hDlg, wControlID) ;
                    664:    if (!hWndControl)
                    665:       return (FALSE) ;
                    666:    GetWindowRect (hWndControl, &rectControl) ;
                    667:    ScreenRectToClient (hDlg, &rectControl) ;
                    668: 
                    669:    MoveWindow (hWndControl,
                    670:                (xPos == NOCHANGE) ? rectControl.left : xPos,
                    671:                (yPos == NOCHANGE) ? rectControl.top : yPos,
                    672:                (xWidth == NOCHANGE) ? rectControl.right - rectControl.left : xWidth,
                    673:                (yHeight == NOCHANGE) ? rectControl.bottom - rectControl.top : yHeight,
                    674:                TRUE) ;
                    675: 
                    676:    return (TRUE) ;
                    677:    }  // DialogMove
                    678: 
                    679: 
                    680: int DialogWidth (HDLG hDlg, 
                    681:                  WORD wControlID)
                    682:    {
                    683:    HWND           hWndControl ;
                    684:    RECT           rectControl ;
                    685: 
                    686:    hWndControl = DialogControl (hDlg, wControlID) ;
                    687:    if (!hWndControl)
                    688:       return (0) ;
                    689: 
                    690:    GetWindowRect (hWndControl, &rectControl) ;
                    691:    return (rectControl.right - rectControl.left) ;
                    692:    }
                    693:    
                    694: 
                    695: int DialogHeight (HDLG hDlg, 
                    696:                   WORD wControlID)
                    697:    {
                    698:    HWND           hWndControl ;
                    699:    RECT           rectControl ;
                    700: 
                    701:    hWndControl = DialogControl (hDlg, wControlID) ;
                    702:    if (!hWndControl)
                    703:       return (0) ;
                    704: 
                    705:    GetWindowRect (hWndControl, &rectControl) ;
                    706:    return (rectControl.bottom - rectControl.top) ;
                    707:    }
                    708:    
                    709: 
                    710: int DialogXPos (HDLG hDlg,
                    711:                 WORD wControlID)
                    712:    {  // DialogXPos
                    713:    HWND           hWndControl ;
                    714:    RECT           rectControl ;
                    715: 
                    716:    hWndControl = DialogControl (hDlg, wControlID) ;
                    717:    if (!hWndControl)
                    718:       return (0) ;
                    719: 
                    720:    GetWindowRect (hWndControl, &rectControl) ;
                    721:    ScreenRectToClient (hDlg, &rectControl) ;
                    722: 
                    723:    return  (rectControl.left) ;
                    724:    }  // DialogXPos
                    725: 
                    726: 
                    727: int DialogYPos (HDLG hDlg,
                    728:                 WORD wControlID)
                    729:    {  // DialogYPos
                    730:    HWND           hWndControl ;
                    731:    RECT           rectControl ;
                    732: 
                    733:    hWndControl = DialogControl (hDlg, wControlID) ;
                    734:    if (!hWndControl)
                    735:       return (0) ;
                    736: 
                    737:    GetWindowRect (hWndControl, &rectControl) ;
                    738:    ScreenRectToClient (hDlg, &rectControl) ;
                    739: 
                    740:    return  (rectControl.top) ;
                    741:    }  // DialogYPos
                    742: 
                    743: 
                    744: void DialogEnable (HDLG hDlg,
                    745:                    WORD wID,
                    746:                    BOOL bEnable)
                    747: /*
                    748:    Effect:        Enable or disable (based on bEnable) the control 
                    749:                   identified by wID in dialog hDlg.
                    750: 
                    751:    See Also:      DialogShow.
                    752: */
                    753:    {  // DialogEnable
                    754:    HCONTROL       hControl ;
                    755: 
                    756:    hControl = GetDlgItem (hDlg, wID) ;
                    757:    if (hControl)
                    758:       EnableWindow (hControl, bEnable) ;
                    759:    }  // DialogEnable
                    760: 
                    761: 
                    762: void DialogShow (HDLG hDlg,
                    763:                  WORD wID,
                    764:                  BOOL bShow)
                    765:    {  // DialogShow
                    766:    HCONTROL       hControl ;
                    767: 
                    768:    hControl = GetDlgItem (hDlg, wID) ;
                    769:    if (hControl)
                    770:       ShowWindow (hControl, bShow ? SW_SHOW : SW_HIDE) ;
                    771:    }  // DialogShow
                    772: 
                    773: 
                    774: 
                    775: 
                    776: 
                    777: 
                    778: BOOL _cdecl DialogSetText (HDLG hDlg,
                    779:                            WORD wControlID,
                    780:                            WORD wStringID,
                    781:                            ...)
                    782:    {  // DialogSetText
                    783:    TCHAR           szFormat [ControlStringLen] ;
                    784:    TCHAR           szText [ControlStringLen] ;
                    785:    va_list         vaList ;
                    786: 
                    787:    if (LoadString (hInstance, wStringID,
                    788:                    szFormat, ControlStringLen - 1))
                    789:       {
                    790:       va_start (vaList, wStringID) ;
                    791:       wvsprintf (szText, szFormat, vaList) ;
                    792:       va_end (vaList) ;
                    793: 
                    794:       SetDlgItemText (hDlg, wControlID, szText) ;
                    795:       return (TRUE) ;
                    796:       }  // if
                    797:    else
                    798:       return (FALSE) ;
                    799:    }  // DialogSetText
                    800: 
                    801: 
                    802: BOOL _cdecl DialogSetString (HDLG hDlg,
                    803:                              WORD wControlID,
                    804:                              LPTSTR lpszFormat,
                    805:                              ...)
                    806:    {  // DialogSetString
                    807:    TCHAR          szText [ControlStringLen] ;
                    808:    va_list        vaList ;
                    809: 
                    810:    va_start (vaList, lpszFormat) ;
                    811:    wvsprintf (szText, lpszFormat, vaList) ;
                    812:    va_end (vaList) ;
                    813: 
                    814:    SetDlgItemText (hDlg, wControlID, szText) ;
                    815:    return (TRUE) ;
                    816:    }  // DialogSetString
                    817: 
                    818: 
                    819: 
                    820: LPTSTR LongToCommaString (LONG lNumber,
                    821:                           LPTSTR lpszText)
                    822:    {  // LongToCommaString
                    823:    BOOL           bNegative ;
                    824:    TCHAR          szTemp1 [40] ;
                    825:    TCHAR          szTemp2 [40] ;
                    826:    LPTSTR         lpsz1 ;
                    827:    LPTSTR         lpsz2 ;
                    828:    int            i ;
                    829:    int            iDigit ;
                    830: 
                    831:    // 1. Convert the number to a reversed string.
                    832:    lpsz1 = szTemp1 ;
                    833:    bNegative = (lNumber < 0) ;
                    834:    lNumber = labs (lNumber) ;
                    835: 
                    836:    if (lNumber)
                    837:       while (lNumber)
                    838:          {
                    839:          iDigit = (int) (lNumber % 10L) ;
                    840:          lNumber /= 10L ;
                    841:          *lpsz1++ = (TCHAR) (TEXT('0') + iDigit) ;
                    842:          }
                    843:    else
                    844:       *lpsz1++ = TEXT('0') ;
                    845:    *lpsz1++ = TEXT('\0') ;
                    846: 
                    847: 
                    848:    // 2. reverse the string and add commas
                    849:    lpsz1 = szTemp1 + lstrlen (szTemp1) - 1 ;
                    850:    lpsz2 = szTemp2 ;
                    851: 
                    852:    if (bNegative)
                    853:       *lpsz2++ = TEXT('-') ;
                    854: 
                    855:    for (i = lstrlen (szTemp1) - 1;
                    856:         i >= 0 ;
                    857:         i--)
                    858:       {  // for
                    859:       *lpsz2++ = *lpsz1-- ;
                    860:       if (i && !(i % 3))
                    861:          *lpsz2++ = TEXT(',') ;
                    862:       }  // for
                    863:    *lpsz2++ = TEXT('\0') ;
                    864: 
                    865:    return (lstrcpy (lpszText, szTemp2)) ;
                    866:    }  // LongToCommaString
                    867: 
                    868: 
                    869: 
                    870: BOOL MenuSetPopup (HWND hWnd,
                    871:                    int iPosition,
                    872:                    WORD  wControlID,
                    873:                    LPTSTR lpszResourceID)
                    874:    {
                    875:    HMENU          hMenuMain ;
                    876:    HMENU          hMenuPopup ;
                    877:    TCHAR          szTopChoice [MenuStringLen + 1] ;
                    878: 
                    879:    hMenuMain = GetMenu (hWnd) ;
                    880:    hMenuPopup = LoadMenu (hInstance, lpszResourceID) ;
                    881: 
                    882:    if (!hMenuMain || !hMenuPopup)
                    883:       return (FALSE) ;
                    884: 
                    885:    StringLoad (wControlID, szTopChoice) ;
                    886:    return (ModifyMenu (hMenuMain, iPosition, MF_BYPOSITION | MF_POPUP,
                    887:                        (UINT) hMenuPopup, szTopChoice)) ;
                    888:    }               
                    889:          
                    890: 
                    891:    
                    892: LPTSTR FileCombine (LPTSTR lpszFileSpec,
                    893:                     LPTSTR lpszFileDirectory,
                    894:                     LPTSTR lpszFileName)
                    895:    {  // FileCombine
                    896: 
                    897:    int      stringLen ;
                    898:    TCHAR    DIRECTORY_DELIMITER[2] ;
                    899: 
                    900:    DIRECTORY_DELIMITER[0] = TEXT('\\') ;
                    901:    DIRECTORY_DELIMITER[1] = TEXT('\0') ;
                    902: 
                    903:    lstrcpy (lpszFileSpec, lpszFileDirectory) ;
                    904: 
                    905:    stringLen = lstrlen (lpszFileSpec) ;
                    906:    if (stringLen > 0 &&
                    907:        lpszFileSpec [stringLen - 1] != DIRECTORY_DELIMITER [0])
                    908:       lstrcat (lpszFileSpec, DIRECTORY_DELIMITER) ;
                    909: 
                    910:    lstrcat (lpszFileSpec, lpszFileName) ;
                    911: 
                    912:    return (lpszFileSpec) ;
                    913:    }  // FileCombine
                    914: 
                    915: // This routine extract the filename portion from a given full-path filename
                    916: LPTSTR ExtractFileName (LPTSTR pFileSpec)
                    917:    {
                    918:    LPTSTR   pFileName = NULL ;
                    919:    TCHAR    DIRECTORY_DELIMITER1 = TEXT('\\') ;
                    920:    TCHAR    DIRECTORY_DELIMITER2 = TEXT(':') ;
                    921: 
                    922:    if (pFileSpec)
                    923:       {
                    924:       pFileName = pFileSpec + lstrlen (pFileSpec) ;
                    925: 
                    926:       while (*pFileName != DIRECTORY_DELIMITER1 &&
                    927:          *pFileName != DIRECTORY_DELIMITER2)
                    928:          {
                    929:          if (pFileName == pFileSpec)
                    930:             {
                    931:             // done when no directory delimiter is found
                    932:             break ;
                    933:             }
                    934:          pFileName-- ;
                    935:          }
                    936:       
                    937:       if (*pFileName == DIRECTORY_DELIMITER1 ||
                    938:          *pFileName == DIRECTORY_DELIMITER2)
                    939:          {
                    940:          // directory delimiter found, point the 
                    941:          // filename right after it
                    942:          pFileName++ ;
                    943:          }
                    944:       }
                    945:    return pFileName ;
                    946:    }  // ExtractFileName
                    947: 
                    948: int CBAddInt (HWND hWndCB,
                    949:               int iValue)
                    950:    {  // CBAddInt
                    951:    TCHAR       szValue [ShortTextLen + 1] ;
                    952:    CHAR        szCharValue [ShortTextLen + 1] ;
                    953: 
                    954:    itoa (iValue, (LPSTR)szCharValue, 10) ;
                    955: #ifdef UNICODE
                    956:    mbstowcs (szValue, (LPSTR)szCharValue, strlen((LPSTR)szCharValue)+1) ;
                    957:    return (CBAdd (hWndCB, szValue)) ;
                    958: #else
                    959:    return (CBAdd (hWndCB, szCharValue)) ;
                    960: #endif
                    961: 
                    962:    }  // CBAddInt
                    963: 
                    964: void DialogSetInterval (HDLG hDlg,
                    965:                         WORD wControlID,
                    966:                         int  IntervalMSec)
                    967:    {
                    968:    TCHAR          szValue [MiscTextLen] ;
                    969: 
                    970:    TSPRINTF (szValue, TEXT("%3.3f"),
                    971:             (FLOAT)(IntervalMSec) / (FLOAT)1000.0) ;
                    972: 
                    973:    SetDlgItemText (hDlg, wControlID, szValue) ;
                    974:    }
                    975: 
                    976: void DialogSetFloat (HDLG hDlg,
                    977:                      WORD wControlID,
                    978:                      FLOAT eValue)
                    979:    {
                    980:    TCHAR          szValue [40] ;
                    981:    FLOAT          tempValue = eValue ;
                    982: 
                    983:    if (tempValue < (FLOAT) 0.0)
                    984:       {
                    985:       tempValue = - tempValue ;
                    986:       }
                    987: 
                    988:    if (tempValue < (FLOAT) 1.0E+8)
                    989:       {
                    990:       TSPRINTF (szValue, TEXT("%1.4f"), eValue) ;
                    991:       }
                    992:    else
                    993:       {
                    994:       TSPRINTF (szValue, TEXT("%14.6e"), eValue) ;
                    995:       }
                    996: 
                    997:    SetDlgItemText (hDlg, wControlID, szValue) ;
                    998:    }
                    999: 
                   1000: 
                   1001: FLOAT DialogFloat (HDLG hDlg, 
                   1002:                    WORD wControlID,
                   1003:                    BOOL *pbOK)
                   1004: /*
                   1005:    Effect:        Return a floating point representation of the string
                   1006:                   value found in the control wControlID of hDlg.
                   1007: 
                   1008:    Internals:     We use sscanf instead of atof becuase atof returns a 
                   1009:                   double. This may or may not be the right thing to do.
                   1010: */
                   1011:    {  // DialogFloat
                   1012:    TCHAR          szValue [ShortTextLen+1] ;
                   1013:    FLOAT          eValue ;
                   1014:    int            iNumScanned ;
                   1015: 
                   1016:    DialogText (hDlg, wControlID, szValue) ;   
                   1017:    iNumScanned = swscanf (szValue, TEXT("%e"), &eValue) ;
                   1018: 
                   1019:    if (pbOK)
                   1020:       *pbOK = (iNumScanned == 1) ;
                   1021: 
                   1022:    return (eValue) ;
                   1023:    }  // DialogFloat
                   1024: 
                   1025: 
                   1026: 
                   1027: LPTSTR StringAllocate (LPTSTR lpszText1)
                   1028:    {  // StringAllocate
                   1029:    LPTSTR         lpszText2 ;
                   1030: 
                   1031:    if (!lpszText1)
                   1032:       return (NULL) ;
                   1033: 
                   1034:    if (lstrlen (lpszText1) == 0)
                   1035:       return (NULL) ;
                   1036: 
                   1037:    lpszText2 = MemoryAllocate ((lstrlen (lpszText1)+1) * sizeof (TCHAR)) ;
                   1038:    if (lpszText2)
                   1039:       lstrcpy (lpszText2, lpszText1) ;
                   1040: 
                   1041:    return  (lpszText2) ;
                   1042:    }  // StringAllocate
                   1043: 
                   1044: 
                   1045: 
                   1046: int DivRound (int iNumerator, int iDenominator)
                   1047: /*
                   1048:    Effect:        Return the quotient (iNumerator / iDenominator).
                   1049:                   Round the quotient to the nearest integer.
                   1050:                   This function is similar to normal integer division (/),
                   1051:                   but normal division always rounds down.
                   1052: 
                   1053:    Note:          Surely there must already be a runtime version of this,
                   1054:                   but I couldn't find it. 
                   1055: 
                   1056:    Note:          This function originally used the runtime div function
                   1057:                   instead of (/ and %), but the div runtime function is
                   1058:                   now broken (build 265).   
                   1059: */
                   1060:    {  // DivRound
                   1061:    int            iQuotient ;
                   1062:    int            iRemainder ;
                   1063: 
                   1064: 
                   1065:    iQuotient = iNumerator / iDenominator ;
                   1066:    iRemainder = iNumerator % iDenominator ;
                   1067: 
                   1068:    if (iRemainder >= (iDenominator / 2))
                   1069:       iQuotient++ ;
                   1070: 
                   1071:    return (iQuotient) ;
                   1072:    }
                   1073: 
                   1074: 
                   1075: BOOL MenuEnableItem (HMENU hMenu,
                   1076:                      WORD wID,
                   1077:                      BOOL bEnable)
                   1078: /*
                   1079:    Effect:        Enable or disable, depending on bEnable, the menu item
                   1080:                   associated with id wID in the menu hMenu.
                   1081: 
                   1082:                   Any disabled menu items are displayed grayed out.
                   1083: 
                   1084:    See Also:      EnableMenuItem (windows).
                   1085: */
                   1086:    {  // MenuEnableItem
                   1087:    return (EnableMenuItem (hMenu, wID,
                   1088:                            bEnable ?
                   1089:                               (MF_ENABLED | MF_BYCOMMAND) :
                   1090:                               (MF_GRAYED | MF_BYCOMMAND))) ;
                   1091:    }  // MenuEnableItem
                   1092: 
                   1093: 
                   1094: int BitmapWidth (HBITMAP hBitmap)
                   1095:    {  // BitmapWidth
                   1096:    BITMAP  bm ;
                   1097: 
                   1098:    GetObject (hBitmap, sizeof (BITMAP), (LPSTR) &bm) ;
                   1099:    return (bm.bmWidth) ;
                   1100:    }  // BitmapWidth
                   1101: 
                   1102: 
                   1103: int BitmapHeight (HBITMAP hBitmap)
                   1104:    {  // BitmapHeight
                   1105:    BITMAP  bm ;
                   1106: 
                   1107:    GetObject (hBitmap, sizeof (BITMAP), (LPSTR) &bm) ;
                   1108:    return (bm.bmHeight) ;
                   1109:    }  // BitmapHeight
                   1110: 
                   1111: 
                   1112: 
                   1113: int WindowHeight (HWND hWnd)
                   1114:    {  // WindowHeight
                   1115:    RECT           rectWindow ;
                   1116: 
                   1117:    GetWindowRect (hWnd, &rectWindow) ;
                   1118:    return (rectWindow.bottom - rectWindow.top) ;
                   1119:    }  // WindowHeight
                   1120: 
                   1121: 
                   1122: 
                   1123: int WindowWidth (HWND hWnd)
                   1124:    {  // WindowWidth
                   1125:    RECT           rectWindow ;
                   1126: 
                   1127:    GetWindowRect (hWnd, &rectWindow) ;
                   1128:    return (rectWindow.right - rectWindow.left) ;
                   1129:    }  // WindowWidth
                   1130: 
                   1131: 
                   1132: 
                   1133: void WindowResize (HWND hWnd,
                   1134:                    int xWidth,
                   1135:                    int yHeight)
                   1136: /*
                   1137:    Effect:        Change the size of the window hWnd, leaving the
                   1138:                   starting position intact.  Redraw the window.
                   1139: 
                   1140:                   If either xWidth or yHeight is NULL, keep the
                   1141:                   corresponding dimension unchanged.
                   1142: 
                   1143:    Internals:     Since hWnd may be a child of another parent, we need
                   1144:                   to scale the MoveWindow arguments to be in the client
                   1145:                   coordinates of the parent.
                   1146:             
                   1147: */
                   1148:    {  // WindowResize
                   1149:    RECT           rectWindow ;
                   1150:    HWND           hWndParent ;
                   1151: 
                   1152:    GetWindowRect (hWnd, &rectWindow) ;
                   1153:    hWndParent = WindowParent (hWnd) ;
                   1154: 
                   1155:    if (hWndParent)
                   1156:       ScreenRectToClient (hWndParent, &rectWindow) ;
                   1157:    
                   1158:    MoveWindow (hWnd,
                   1159:                rectWindow.left,
                   1160:                rectWindow.top,
                   1161:                xWidth ? xWidth : rectWindow.right - rectWindow.left,
                   1162:                yHeight ? yHeight : rectWindow.bottom - rectWindow.top,
                   1163:                TRUE) ;
                   1164:    }  // WindowResize
                   1165: 
                   1166: 
                   1167: 
                   1168: 
                   1169: void WindowSetTopmost (HWND hWnd, BOOL bTopmost)
                   1170: /*
                   1171:    Effect:        Set or clear the "topmost" attribute of hWnd. If a window
                   1172:                   is "topmost", it remains ontop of other windows, even ones
                   1173:                   that have the focus.
                   1174: */
                   1175:    {
                   1176:    SetWindowPos (hWnd, bTopmost ? HWND_TOPMOST : HWND_NOTOPMOST,
                   1177:                  0, 0, 0, 0,
                   1178:                  SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE) ;
                   1179:    }
                   1180: 
                   1181: 
                   1182: void WindowEnableTitle (HWND hWnd, BOOL bTitle)
                   1183:    {
                   1184:    DWORD          dwStyle ;
                   1185: 
                   1186: 
                   1187:    dwStyle = WindowStyle (hWnd) ;
                   1188:    
                   1189:    if (bTitle)
                   1190:       dwStyle = WS_TILEDWINDOW | dwStyle ;
                   1191:    else
                   1192:       dwStyle = 
                   1193:          dwStyle & 
                   1194:          ~ (WS_DLGFRAME | WS_SYSMENU | WS_MINIMIZEBOX | WS_MAXIMIZEBOX) ;
                   1195: 
                   1196:    if (!bTitle)
                   1197:       SetMenu (hWnd, NULL) ;
                   1198: 
                   1199:    WindowSetStyle (hWnd, dwStyle) ;
                   1200:    SetWindowPos (hWnd, NULL, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE |
                   1201:                  SWP_NOZORDER | SWP_FRAMECHANGED );
                   1202:    }
                   1203: 
                   1204: // removing the following routines since LINK32 is not doing that for us
                   1205: #ifdef  KEEP_UTIL
                   1206: int MessageBoxResource (HWND hWndParent,
                   1207:                         WORD wTextID,
                   1208:                         WORD wTitleID,
                   1209:                         UINT uiStyle)
                   1210: /*
                   1211:    Effect:        Just like MessageBox, but takes the title and format
                   1212:                   strings from the resoure. In addition, the format string
                   1213:                   is used as a printf style format, combined with the 
                   1214:                   additional arguments.
                   1215: */
                   1216:    {  // MessageBoxResource
                   1217:    TCHAR          szText [MessageLen + 1] ;
                   1218:    TCHAR          szCaption [WindowCaptionLen + 1] ;
                   1219: 
                   1220:    StringLoad (wTextID, szText) ;
                   1221:    StringLoad (wTitleID, szCaption) ;
                   1222: 
                   1223:    return (MessageBox (hWndParent, szText, szCaption, uiStyle)) ;
                   1224:    }  // MessageBoxResource
                   1225: 
                   1226: 
                   1227: #define WndProcKey   TEXT("OLDWNDPROC")
                   1228: 
                   1229: FARPROC WindowSetWndProc (HWND hWnd,
                   1230:                           HANDLE hInstance,
                   1231:                           FARPROC lpfnNewWndProc)
                   1232: /*
                   1233:    Effect:     Replace the window procedure of hWnd with lpfnNewWndProc.
                   1234:                Return the existing window procedure.
                   1235: 
                   1236:    Note:       For proper subclassing, NewWndProc should pass all
                   1237:                unhandled messages to the original wndproc.
                   1238: 
                   1239:    Called By:  WindowSubclass, WindowUnsubclass.
                   1240: */
                   1241:    {  // WindowSetWndProc
                   1242:    FARPROC     lpfnNewProcInstance ;
                   1243:    FARPROC     lpfnOldProc ;
                   1244: 
                   1245:    lpfnOldProc = (FARPROC) GetWindowLong (hWnd, GWL_WNDPROC) ;
                   1246:    lpfnNewProcInstance = MakeProcInstance (lpfnNewWndProc, hInstance) ;
                   1247:    SetWindowLong (hWnd, GWL_WNDPROC, (long) lpfnNewProcInstance) ;
                   1248: 
                   1249:    return (lpfnOldProc) ;
                   1250:    }  // WindowSetWndProc
                   1251: 
                   1252: WNDPROC WindowGetOriginalWndProc (HWND hWnd)
                   1253: /*
                   1254:    Effect:        Return a far pointer to the "original" wndproc for
                   1255:                   hWnd.
                   1256: 
                   1257:    Assert:        WindowSetOriginalProc was already called on this hWnd.
                   1258: 
                   1259:    See Also:      WindowSetOriginalWndProc.
                   1260: */
                   1261:    {  // WindowGetOriginalWndProc
                   1262:    return (WNDPROC) GetProp (hWnd, WndProcKey) ;
                   1263:    }  // WindowGetOriginalWndProc
                   1264: 
                   1265: 
                   1266: void WindowSetOriginalWndProc (HWND hWnd,
                   1267:                                FARPROC lpfnWndProc)
                   1268: /*
                   1269:    Effect:        Save away a far pointer to the "original" wndproc for
                   1270:                   hWnd.
                   1271: 
                   1272:    See Also:      WindowGetOriginalProc.
                   1273: */
                   1274:    {  // WindowSetOriginalProc
                   1275:    SetProp (hWnd, WndProcKey, (LPSTR) lpfnWndProc) ;
                   1276:    }  // WindowSetOriginalProc
                   1277: 
                   1278: 
                   1279: void WindowSubclass (HWND hWnd,
                   1280:                      HANDLE hInstance,
                   1281:                      FARPROC lpfnNewWndProc)
                   1282: /*
                   1283:    Effect:        Replace the wndproc for hWnd with lpfnNewWndProc.
                   1284:                   Save away a pointer to the original procedure.
                   1285: 
                   1286:    See Also:      WindowUnsubclass.
                   1287: */
                   1288:    {  // WindowSubclass
                   1289:    FARPROC     lpfnOldWndProc ;
                   1290: 
                   1291:    lpfnOldWndProc = WindowSetWndProc (hWnd, hInstance, lpfnNewWndProc) ;
                   1292:    WindowSetOriginalWndProc (hWnd, lpfnOldWndProc) ;
                   1293:    }  // WindowSubclass
                   1294: 
                   1295: 
                   1296: LONG WindowCallOriginalWndProc (HWND hWnd,
                   1297:                                 UINT msg,
                   1298:                                 WPARAM wParam,
                   1299:                                 LPARAM lParam)
                   1300:    {
                   1301:    WNDPROC        lpfnOriginalWndProc ;
                   1302: 
                   1303:    lpfnOriginalWndProc = WindowGetOriginalWndProc (hWnd) ;
                   1304:    if (lpfnOriginalWndProc)
                   1305:       return ((LONG) CallWindowProc (lpfnOriginalWndProc,
                   1306:                                      hWnd, msg, wParam, lParam)) ;
                   1307:    else return (FALSE) ;
                   1308:    }
                   1309: 
                   1310: 
                   1311: 
                   1312: LRESULT APIENTRY FocusCtlWndProc (HWND hWnd,
                   1313:                                   UINT wMsg,
                   1314:                                   WPARAM wParam,
                   1315:                                   LPARAM lParam)
                   1316:    {  // FocusCtlWndProc
                   1317:    BOOL           bCallDefProc ;
                   1318:    LRESULT        lReturnValue ;
                   1319: 
                   1320: 
                   1321:    bCallDefProc = TRUE ;
                   1322:    lReturnValue = 0L ;
                   1323: 
                   1324:    switch (wMsg)
                   1325:       {  // switch
                   1326:       case WM_SETFOCUS:
                   1327:          SendMessage (WindowParent (hWnd), 
                   1328:                       WM_DLGSETFOCUS, WindowID (hWnd), 0) ;
                   1329:          break ;
                   1330: 
                   1331: 
                   1332:       case WM_KILLFOCUS:
                   1333:          SendMessage (WindowParent (hWnd), 
                   1334:                       WM_DLGKILLFOCUS, WindowID (hWnd), 0) ;
                   1335:          break ;
                   1336: 
                   1337:       default:
                   1338:          bCallDefProc = TRUE ;
                   1339:       }  // switch
                   1340: 
                   1341: 
                   1342:    if (bCallDefProc)
                   1343:       lReturnValue = WindowCallOriginalWndProc (hWnd, wMsg, wParam, lParam) ;
                   1344: 
                   1345:    return (lReturnValue);
                   1346:    }  // FocusWndProc
                   1347: 
                   1348: 
                   1349: 
                   1350: BOOL DlgFocus (HDLG hDlg, WORD wControlID)
                   1351:    {  // DlgFocus
                   1352:    HWND           hWndControl ;
                   1353: 
                   1354:    hWndControl = DialogControl (hDlg, wControlID) ;
                   1355:    if (!hWndControl)
                   1356:       return (FALSE) ;
                   1357: 
                   1358:    WindowSubclass (hWndControl, hInstance, (FARPROC) FocusCtlWndProc) ;
                   1359:    return (TRUE) ;
                   1360:    }  // DlgFocus
                   1361: 
                   1362: 
                   1363: BOOL DeviceNumColors (HDC hDC)
                   1364:    {  // DeviceNumColors
                   1365:    int            nPlanes ;
                   1366:    int            nBitsPixel ;
                   1367: 
                   1368:    nPlanes = GetDeviceCaps (hDC, PLANES) ;
                   1369:    nBitsPixel = GetDeviceCaps (hDC, BITSPIXEL) ;
                   1370: 
                   1371:    return (1 << (nPlanes * nBitsPixel)) ;
                   1372:    }  // DeviceNumColors
                   1373: 
                   1374: 
                   1375: void DrawBitmap (HDC hDC,
                   1376:                  HBITMAP hBitmap,
                   1377:                  int xPos,
                   1378:                  int yPos,
                   1379:                  LONG  lROPCode)
                   1380:    {  // DrawBitmap
                   1381:    BITMAP  bm ;
                   1382:    HDC     hDCMemory ;
                   1383: 
                   1384:    hDCMemory = CreateCompatibleDC (hDC) ;
                   1385:    SelectObject (hDCMemory, hBitmap) ;
                   1386: 
                   1387:    GetObject (hBitmap, sizeof (BITMAP), (LPSTR) &bm) ;
                   1388: 
                   1389:    BitBlt (hDC,                     // DC for Destination surface
                   1390:            xPos, yPos,              // location in destination surface
                   1391:            bm.bmWidth, bm.bmHeight, // dimension of bitmap
                   1392:            hDCMemory,               // DC for Source surface
                   1393:            0, 0,                    // location in source surface
                   1394:            lROPCode) ;              // ROP code
                   1395: 
                   1396:    DeleteDC (hDCMemory) ;
                   1397:    }  // DrawBitmap
                   1398: 
                   1399: 
                   1400: #endif  // KEEP_UTIL
                   1401: 
                   1402: #ifdef PERFMON_DEBUG
                   1403: 
                   1404: #define MikeBufferSize         256
                   1405: 
                   1406: 
                   1407: int _cdecl mike (TCHAR *szFormat, ...)
                   1408: /*
                   1409:    Note:          This function returns a value so that it can more easily
                   1410:                   be used in conditional expressions.
                   1411: */
                   1412:    {  // mike
                   1413:    TCHAR          szBuffer [MikeBufferSize] ;
                   1414:    va_list        vaList ;
                   1415: 
                   1416:    va_start (vaList, szFormat) ;
                   1417:    wvsprintf (szBuffer, szFormat, vaList) ;
                   1418:    va_end (vaList) ;
                   1419: 
                   1420:    MessageBox (NULL, szBuffer, TEXT("Debug"), MB_OK | MB_TASKMODAL) ;
                   1421:    return (0) ;
                   1422:    }  // mike
                   1423: 
                   1424: 
                   1425: 
                   1426: int _cdecl mike1 (TCHAR *szFormat, ...)
                   1427: /*
                   1428:    Note:          This function returns a value so that it can more easily
                   1429:                   be used in conditional expressions.
                   1430: */
                   1431:    {  //  mike1
                   1432:    TCHAR           szBuffer [MikeBufferSize] ;
                   1433:    va_list        vaList ;
                   1434:    HDC            hDC ;
                   1435:    RECT           rect ;
                   1436:   
                   1437:    va_start (vaList, szFormat) ;
                   1438:    wvsprintf (szBuffer, szFormat, vaList) ;
                   1439:    va_end (vaList) ;
                   1440: 
                   1441:    rect.left = 0 ;
                   1442:    rect.right = xScreenWidth ;
                   1443:    rect.top = 0 ;
                   1444:    rect.bottom = 20 ;
                   1445: 
                   1446:    hDC = CreateScreenDC () ;
                   1447:    ExtTextOut (hDC, 0, 0, ETO_OPAQUE, &rect, 
                   1448:                szBuffer, lstrlen (szBuffer), NULL) ;
                   1449:    DeleteDC (hDC) ;
                   1450: 
                   1451:    return (0) ;
                   1452:    }  // mike1
                   1453: 
                   1454: int _cdecl mike2 (TCHAR *szFormat, ...)
                   1455: /*
                   1456:    Note:          This function returns a value so that it can more easily
                   1457:                   be used in conditional expressions.
                   1458: */
                   1459:    {  //  mike2
                   1460:    TCHAR           szBuffer [MikeBufferSize] ;
                   1461:    va_list        vaList ;
                   1462:   
                   1463:    va_start (vaList, szFormat) ;
                   1464:    wvsprintf (szBuffer, szFormat, vaList) ;
                   1465:    va_end (vaList) ;
                   1466: 
                   1467:    OutputDebugString (szBuffer) ;
                   1468: 
                   1469:    return (0) ;
                   1470:    }  // mike2
                   1471: #endif      // PERFMON_DEBUG
                   1472: 
                   1473: 
                   1474: 
                   1475: int inttok (LPSTR lpszText, LPSTR lpszDelimiters)
                   1476:    {  // inttok
                   1477: 
                   1478:    // Inttok only works with LPSTRs because of the atoi & strtok
                   1479:    
                   1480:    LPSTR   lpszToken ;
                   1481: 
                   1482:    lpszToken = strtok (lpszText, lpszDelimiters) ;
                   1483: 
                   1484:    if (lpszToken)
                   1485:       return (atoi (lpszToken)) ;
                   1486:    else
                   1487:       return (0) ;
                   1488:    }  // inttok
                   1489: 
                   1490: 
                   1491: void WindowPlacementToString (PWINDOWPLACEMENT pWP, 
                   1492:                               LPTSTR lpszText)
                   1493:    {
                   1494:    TSPRINTF (lpszText, TEXT("%d %d %d %d %d %d %d %d %d"),
                   1495:             pWP->showCmd, 
                   1496:             pWP->ptMinPosition.x,
                   1497:             pWP->ptMinPosition.y,
                   1498:             pWP->ptMaxPosition.x,
                   1499:             pWP->ptMaxPosition.y,
                   1500:             pWP->rcNormalPosition.left,
                   1501:             pWP->rcNormalPosition.top,
                   1502:             pWP->rcNormalPosition.right,
                   1503:             pWP->rcNormalPosition.bottom) ;
                   1504:    }
                   1505: 
                   1506: 
                   1507: void StringToWindowPlacement (LPTSTR lpszText,
                   1508:                               PWINDOWPLACEMENT pWP)
                   1509:    {  // StringToWindowPlacement
                   1510:    CHAR  SpaceStr[2];
                   1511:    CHAR  LocalText[TEMP_BUF_LEN];  
                   1512:       
                   1513: 
                   1514:    SpaceStr[0] = ' ' ;
                   1515:    SpaceStr[1] = '\0' ;
                   1516:    
                   1517: #ifdef UNICODE
                   1518:    // convert the unicode string to char string
                   1519:    // so we could use inttok
                   1520:    wcstombs (LocalText, lpszText, sizeof(LocalText)) ;
                   1521: #else
                   1522:    strcpy (LocalText, lpszText) ;
                   1523: #endif
                   1524: 
                   1525:    pWP->length = sizeof (WINDOWPLACEMENT) ;
                   1526:    pWP->flags = 0 ;
                   1527:    pWP->showCmd = inttok (LocalText, SpaceStr) ;
                   1528:    pWP->ptMinPosition.x = inttok (NULL, SpaceStr) ;
                   1529:    pWP->ptMinPosition.y = inttok (NULL, SpaceStr) ;
                   1530:    pWP->ptMaxPosition.x = inttok (NULL, SpaceStr) ;
                   1531:    pWP->ptMaxPosition.y = inttok (NULL, SpaceStr) ;
                   1532:    pWP->rcNormalPosition.left = inttok (NULL, SpaceStr) ;
                   1533:    pWP->rcNormalPosition.top = inttok (NULL, SpaceStr) ;
                   1534:    pWP->rcNormalPosition.right = inttok (NULL, SpaceStr) ;
                   1535:    pWP->rcNormalPosition.bottom = inttok (NULL, SpaceStr) ;
                   1536:    }  // StringToWindowPlacement
                   1537: 
                   1538: 
                   1539: 
                   1540: int LogFontHeight (HDC hDC,
                   1541:                    int iPointSize)
                   1542: /*
                   1543:    Effect:        Return the appropriate pixel height for the lfHeight
                   1544:                   field of the LOGFONT structure for the requested point
                   1545:                   size. This size depends on the number of pixels per
                   1546:                   logical inch of the current display context, hDC.
                   1547: 
                   1548:    Called By:     Any function which wants to create a particular
                   1549:                   point-height font.
                   1550: */
                   1551:    {  // LogFontHeight
                   1552:    return (-MulDiv (iPointSize, GetDeviceCaps (hDC, LOGPIXELSY), 72)) ;
                   1553:    }  // LogFontHeight
                   1554: 
                   1555: 
                   1556: // this routine converts the input menu id into help id.
                   1557: DWORD MenuIDToHelpID (DWORD MenuID)
                   1558:    {
                   1559:    DWORD HelpID = 0 ;
                   1560: 
                   1561:    if (MenuID >= IDM_FIRSTMENUID && MenuID <= IDM_LASTMENUID)
                   1562:       {
                   1563:       // only special cases...
                   1564:       if (MenuID >= IDM_OPTIONSREFRESHNOWCHART &&
                   1565:           MenuID <= IDM_OPTIONSREFRESHNOWREPORT)
                   1566:          {
                   1567:          HelpID = HC_PM_MENU_OPTIONSREFRESHNOW ;
                   1568:          }
                   1569:       else
                   1570:          {
                   1571:          HelpID = MenuID - MENUIDTOHELPID ;
                   1572:          }
                   1573: #ifndef ADVANCED_PERFMON
                   1574:       // need to convert these 2 IDs for Perf. Meter
                   1575:       if (HelpID == HC_PM_MENU_HELPABOUT)
                   1576:          {
                   1577:          HelpID = HC_NTPM_MENU_HELPABOUT ;
                   1578:          }
                   1579:       else if (HelpID == HC_PM_MENU_FILEEXIT)
                   1580:          {
                   1581:          HelpID = HC_NTPM_MENU_FILEEXIT ;
                   1582:          }
                   1583: #endif
                   1584:       }
                   1585: 
                   1586:    return (HelpID) ;
                   1587:    }
                   1588: 
                   1589: 

unix.superglobalmegacorp.com

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