Annotation of os232sdk/toolkt20/c/samples/wmchar/wmchar.c, revision 1.1

1.1     ! root        1: /***************************************************************************\
        !             2: * wmchar.c -- Displays WM_CHAR messages
        !             3: *
        !             4: * Created by Microsoft, IBM Corporation 1990
        !             5: *
        !             6: *      DISCLAIMER OF WARRANTIES.  The following [enclosed] code is 
        !             7: *      sample code created by Microsoft Corporation and/or IBM 
        !             8: *      Corporation. This sample code is not part of any standard 
        !             9: *      Microsoft or IBM product and is provided to you solely for 
        !            10: *      the purpose of assisting you in the development of your 
        !            11: *      applications.  The code is provided "AS IS", without 
        !            12: *      warranty of any kind.  Neither Microsoft nor IBM shall be 
        !            13: *      liable for any damages arising out of your use of the sample 
        !            14: *      code, even if they have been advised of the possibility of 
        !            15: *      such damages.
        !            16: *
        !            17: \***************************************************************************/
        !            18: 
        !            19: 
        !            20: #define INCL_WIN
        !            21: #define INCL_GPILCIDS
        !            22: #include <os2.h>
        !            23: #include <string.h>
        !            24: #include <stdio.h>
        !            25: #include "wmchar.h"
        !            26: 
        !            27: 
        !            28: #define max2(a, b)  ((a) > (b) ? (a) : (b))
        !            29: #define min2(a, b)  ((a) < (b) ? (a) : (b))
        !            30: 
        !            31: 
        !            32: /* display dependent values */
        !            33: SHORT gcyChar;
        !            34: SHORT gcxAveChar;
        !            35: SHORT gcxMaxChar;
        !            36: SHORT gcxMargin;
        !            37: 
        !            38: /* program globals */
        !            39: USHORT gcMessages = 0;      /* also the "number" of the most recent message */
        !            40: CHAR gszNull[] = "  --";    /* denotes an empty field */
        !            41: BOOL gfKeyUps = FALSE;
        !            42: 
        !            43: 
        !            44: /* char messages are stored in a circular buffer */
        !            45: typedef struct _CHMSG {     /* cm */
        !            46:     USHORT usKC;
        !            47:     UCHAR uchRep;
        !            48:     UCHAR uchScan;
        !            49:     USHORT ch;
        !            50:     USHORT usVK;
        !            51: } CHMSG;
        !            52: 
        !            53: #define CBUFFERELTS 20
        !            54: 
        !            55: CHMSG gacm[CBUFFERELTS];
        !            56: SHORT gicmStart = 0;
        !            57: 
        !            58: 
        !            59: /* display field attributes are stored in an array */
        !            60: typedef struct _MSGFIELD {  /* mf */
        !            61:     BOOL fDisplay;          /* TRUE if field is currently being displayed */
        !            62:     SHORT cxWidth;          /* field width, initially chars, then pixels */
        !            63:     CHAR *szHeading;        /* field heading */
        !            64: } MSGFIELD;
        !            65: 
        !            66: #define INUMBER         0
        !            67: #define IVIRTUALKEY     1
        !            68: #define ICHAR           2
        !            69: #define ISCANCODE       3
        !            70: #define IREPEAT         4
        !            71: #define IFLAGS          5
        !            72: 
        !            73: MSGFIELD gamf[CDISPLAYFIELDS] = {
        !            74:     TRUE,   7, " #",
        !            75:     TRUE,  15, "VK_ Value",
        !            76:     TRUE,  14, "Char",
        !            77:     FALSE, 10, "Scan",
        !            78:     FALSE, 8,  "Rep",
        !            79:     TRUE,  0,  "KC_ Flags"      /* variable width, so it's last */
        !            80: };
        !            81: 
        !            82: SHORT gcxMargin = 3;
        !            83: 
        !            84: 
        !            85: /* char flag strings */
        !            86: CHAR *gachFlags[] = {
        !            87:     "char",
        !            88:     "virtualkey",
        !            89:     "scancode",
        !            90:     "shift",
        !            91:     "ctrl",
        !            92:     "alt",
        !            93:     "keyup",
        !            94:     "prevdown",
        !            95:     "lonekey",
        !            96:     "deadkey",
        !            97:     "composite",
        !            98:     "invalidcomp",
        !            99:     "toggle",
        !           100:     "invalidchar",
        !           101:     "dbcsrsrvd1",
        !           102:     "dbcsrsrvd2"
        !           103: };
        !           104: 
        !           105: /* virtual key strings */
        !           106: CHAR *gachVK[] = {
        !           107:     gszNull,
        !           108:     "button1",
        !           109:     "button2",
        !           110:     "button3",
        !           111:     "break",
        !           112:     "backspace",
        !           113:     "tab",
        !           114:     "backtab",
        !           115:     "newline",
        !           116:     "shift",
        !           117:     "ctrl",
        !           118:     "alt",
        !           119:     "altgraf",
        !           120:     "pause",
        !           121:     "capslock",
        !           122:     "esc",
        !           123:     "space",
        !           124:     "pageup",
        !           125:     "pagedown",
        !           126:     "end",
        !           127:     "home",
        !           128:     "left",
        !           129:     "up",
        !           130:     "right",
        !           131:     "down",
        !           132:     "printscrn",
        !           133:     "insert",
        !           134:     "delete",
        !           135:     "scrllock",
        !           136:     "numlock",
        !           137:     "enter",
        !           138:     "sysrq",
        !           139:     "f1",
        !           140:     "f2",
        !           141:     "f3",
        !           142:     "f4",
        !           143:     "f5",
        !           144:     "f6",
        !           145:     "f7",
        !           146:     "f8",
        !           147:     "f9",
        !           148:     "f10",
        !           149:     "f11",
        !           150:     "f12",
        !           151:     "f13",
        !           152:     "f14",
        !           153:     "f15",
        !           154:     "f16",
        !           155:     "f17",
        !           156:     "f18",
        !           157:     "f19",
        !           158:     "f20",
        !           159:     "f21",
        !           160:     "f22",
        !           161:     "f23",
        !           162:     "f24"
        !           163: };
        !           164: 
        !           165: 
        !           166: 
        !           167: /***************************************************************************\
        !           168: * DrawText
        !           169: *
        !           170: * This function displays a text string.
        !           171: *
        !           172: * Parameters:
        !           173: *   hps:        presentation space
        !           174: *   cx, cy:     point to begin drawing
        !           175: *   sz:         string to draw
        !           176: *   iColor:     text color
        !           177: *   fExtent:    whether to calc extent or not
        !           178: *
        !           179: * Returns:
        !           180: *   x position of end of painted string if fExtent == TRUE
        !           181: \***************************************************************************/
        !           182: 
        !           183: SHORT DrawText(
        !           184:     HPS hps,
        !           185:     SHORT cx,
        !           186:     SHORT cy,
        !           187:     CHAR *sz,
        !           188:     LONG iColor,
        !           189:     BOOL fExtent)
        !           190: {
        !           191:     RECTL rcl;
        !           192:     SHORT cch;
        !           193: 
        !           194:     cch = strlen(sz);
        !           195: 
        !           196:     rcl.xLeft = cx;
        !           197:     rcl.xRight = cx + cch * gcxMaxChar;     /* hack */
        !           198:     rcl.yBottom = cy;
        !           199:     rcl.yTop = cy + gcyChar;
        !           200: 
        !           201:     WinDrawText(hps, cch, (PCH)sz, (PRECTL)&rcl, iColor, SYSCLR_WINDOW, 0);
        !           202: 
        !           203:     if (fExtent) {
        !           204:         WinDrawText(hps, cch, (PCH)sz, (PRECTL)&rcl, iColor,
        !           205:                     SYSCLR_WINDOW, DT_QUERYEXTENT);
        !           206:         return (SHORT)rcl.xRight;
        !           207:     }
        !           208: 
        !           209:     return 0;
        !           210: }
        !           211: 
        !           212: 
        !           213: 
        !           214: /***************************************************************************\
        !           215: * FormatHexChar
        !           216: *
        !           217: * This function formats an unsigned hex number into a string.  It is needed
        !           218: * to get around shortcomings of sprintf().
        !           219: *
        !           220: * Parameters:
        !           221: *   uch:    number to format
        !           222: *   sz:     string to get number
        !           223: \***************************************************************************/
        !           224: 
        !           225: VOID FormatHexChar(
        !           226:     USHORT uch,
        !           227:     CHAR *sz)
        !           228: {
        !           229:     sprintf(sz, "0x%2x", uch);
        !           230: 
        !           231:     /* patch up hex byte display */
        !           232:     if (strlen(sz) > 4) {
        !           233:         /* remove sign extension of byte */
        !           234:         sz[2] = sz[4];
        !           235:         sz[3] = sz[5];
        !           236:         sz[4] = 0;
        !           237:     } else if (sz[2] == ' ') {
        !           238:         /* fill in blank with 0 */
        !           239:         sz[2] = '0';
        !           240:     }
        !           241: }
        !           242: 
        !           243: 
        !           244: 
        !           245: /***************************************************************************\
        !           246: * DrawMessage
        !           247: *
        !           248: * This function draws a single message line.
        !           249: *
        !           250: * Parameters:
        !           251: *   hps:        presentation space
        !           252: *   iMessage:   message number to display
        !           253: *   pcm:        pointer to message structure
        !           254: *   cy:         y position of message
        !           255: \***************************************************************************/
        !           256: 
        !           257: VOID DrawMessage(
        !           258:     HPS hps,
        !           259:     SHORT iMessage,
        !           260:     CHMSG *pcm,
        !           261:     SHORT cy)
        !           262: {
        !           263:     CHAR sz[16];
        !           264:     USHORT fsFlags;
        !           265:     SHORT i;
        !           266:     SHORT cx;
        !           267: 
        !           268:     cx = gcxMargin;
        !           269: 
        !           270:     if (gamf[INUMBER].fDisplay) {
        !           271:         /* draw message number */
        !           272:         sprintf(sz, "%u.", iMessage);
        !           273:         DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
        !           274:         cx += gamf[INUMBER].cxWidth;
        !           275:     }
        !           276: 
        !           277:     if (gamf[IVIRTUALKEY].fDisplay) {
        !           278:         /* draw virtual key code */
        !           279:         DrawText(hps, cx, cy, gachVK[pcm->usVK], SYSCLR_WINDOWTEXT,
        !           280:                  FALSE);
        !           281:         cx += gamf[IVIRTUALKEY].cxWidth;
        !           282:     }
        !           283: 
        !           284:     if (gamf[ICHAR].fDisplay) {
        !           285:         /* draw character */
        !           286:         if ((CHAR)pcm->ch) {
        !           287:             FormatHexChar(pcm->ch, sz);
        !           288:             DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
        !           289:             sprintf(sz, "'%c'", (CHAR)pcm->ch);
        !           290:             DrawText(hps, cx + 7 * gcxAveChar, cy, sz, SYSCLR_WINDOWTEXT,
        !           291:                      FALSE);
        !           292:         } else {
        !           293:             DrawText(hps, cx, cy, gszNull, SYSCLR_WINDOWTEXT, FALSE);
        !           294:         }
        !           295:         cx += gamf[ICHAR].cxWidth;
        !           296:     }
        !           297: 
        !           298:     if (gamf[ISCANCODE].fDisplay) {
        !           299:         if (pcm->uchScan) {
        !           300:             FormatHexChar(pcm->uchScan, sz);
        !           301:             DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
        !           302:         } else {
        !           303:             DrawText(hps, cx, cy, gszNull, SYSCLR_WINDOWTEXT, FALSE);
        !           304:         }
        !           305:         cx += gamf[ISCANCODE].cxWidth;
        !           306:     }
        !           307: 
        !           308:     if (gamf[IREPEAT].fDisplay) {
        !           309:         sprintf(sz, "%u", pcm->uchRep);
        !           310:         DrawText(hps, cx, cy, sz, SYSCLR_WINDOWTEXT, FALSE);
        !           311:         cx += gamf[IREPEAT].cxWidth;
        !           312:     }
        !           313: 
        !           314:     if (gamf[IFLAGS].fDisplay) {
        !           315:         /* draw KC_ flags */
        !           316:         fsFlags = pcm->usKC;
        !           317:         for (i = 0; i < 16; i++) {
        !           318:             if (fsFlags & 1) {
        !           319:                 switch (i) {
        !           320:                 case 0:
        !           321:                     if (gamf[ICHAR].fDisplay)
        !           322:                         goto DF_PRINTIT;
        !           323:                     break;
        !           324:                 case 1:
        !           325:                     if (gamf[IVIRTUALKEY].fDisplay)
        !           326:                         goto DF_PRINTIT;
        !           327:                     break;
        !           328:                 case 2:
        !           329:                     if (gamf[ISCANCODE].fDisplay)
        !           330:                         goto DF_PRINTIT;
        !           331:                     break;
        !           332:                 default:
        !           333: DF_PRINTIT:
        !           334:                     cx = DrawText(hps, cx, cy, gachFlags[i], SYSCLR_WINDOWTEXT, TRUE);
        !           335:                     cx += gcxAveChar;
        !           336:                 }
        !           337:             }
        !           338:             fsFlags >>= 1;
        !           339:         }
        !           340:         cx += gamf[IFLAGS].cxWidth;
        !           341:     }
        !           342: }
        !           343: 
        !           344: 
        !           345: 
        !           346: /***************************************************************************\
        !           347: * PaintClient
        !           348: *
        !           349: * This function paints a client window.
        !           350: *
        !           351: * Parameters:
        !           352: *   hwnd:   window handle
        !           353: \***************************************************************************/
        !           354: 
        !           355: VOID PaintClient(
        !           356:     HWND hwnd)
        !           357: {
        !           358:     HPS hps;
        !           359:     RECTL rcl;
        !           360:     SHORT iMessage;
        !           361:     SHORT yBottom;
        !           362:     SHORT cx;
        !           363:     SHORT i;
        !           364: 
        !           365:     hps = WinBeginPaint(hwnd, (HPS)NULL, (PRECTL)&rcl);
        !           366: 
        !           367:     /* clear invalidated region */
        !           368:     WinFillRect(hps, (PRECTL)&rcl, SYSCLR_WINDOW);
        !           369: 
        !           370:     /* get y position to start drawing */
        !           371:     WinQueryWindowRect(hwnd, (PRECTL)&rcl);
        !           372:     yBottom = (SHORT)(rcl.yTop - gcyChar - gcyChar / 2);
        !           373: 
        !           374:     /* draw headings */
        !           375:     cx = gcxMargin;
        !           376:     for (i = 0; i < CDISPLAYFIELDS; i++) {
        !           377:         if (gamf[i].fDisplay) {
        !           378:             DrawText(hps, cx, yBottom, gamf[i].szHeading,
        !           379:                     SYSCLR_WINDOWSTATICTEXT, FALSE);
        !           380:             cx += gamf[i].cxWidth;
        !           381:         }
        !           382:     }
        !           383: 
        !           384:     /* draw each entry */
        !           385:     i = gicmStart;
        !           386:     iMessage = gcMessages;
        !           387:     yBottom -= (gcyChar + gcyChar / 2);
        !           388:     do {
        !           389:         if (!iMessage || yBottom < -gcyChar)
        !           390:             break;
        !           391: 
        !           392:         DrawMessage(hps, iMessage, &gacm[i], yBottom);
        !           393: 
        !           394:         i = (i + 1) % CBUFFERELTS;
        !           395:         iMessage--;
        !           396:         yBottom -= gcyChar;
        !           397: 
        !           398:     } while (i != gicmStart);
        !           399: 
        !           400:     WinEndPaint(hps);
        !           401: }
        !           402: 
        !           403: 
        !           404: 
        !           405: /***************************************************************************\
        !           406: * NewMessage
        !           407: *
        !           408: * This function adds a new WM_CHAR message to the list.
        !           409: *
        !           410: * Parameters:
        !           411: *   hwnd:       window handle
        !           412: *   mp1, mp2:
        !           413: *   usKC:      key flags
        !           414: *   usVK:      virtual key code
        !           415: *   ch:        char;
        !           416: \***************************************************************************/
        !           417: 
        !           418: VOID NewMessage(
        !           419:     HWND hwnd,
        !           420:     MPARAM mp1,
        !           421:     MPARAM mp2)
        !           422: {
        !           423:     RECTL rclScroll, rclUpdate;
        !           424:     HPS hps;
        !           425: 
        !           426:     /* overwrite oldest entry */
        !           427:     if (gicmStart)
        !           428:         gicmStart--;
        !           429:     else
        !           430:         gicmStart = CBUFFERELTS - 1;
        !           431: 
        !           432:     gacm[gicmStart].usKC = SHORT1FROMMP(mp1);
        !           433:     gacm[gicmStart].uchRep = CHAR3FROMMP(mp1);
        !           434:     gacm[gicmStart].uchScan = CHAR4FROMMP(mp1);
        !           435:     gacm[gicmStart].ch = SHORT1FROMMP(mp2);
        !           436:     gacm[gicmStart].usVK = SHORT2FROMMP(mp2);
        !           437: 
        !           438:     gcMessages++;
        !           439: 
        !           440:     /* scroll and update intelligently */
        !           441:     WinQueryWindowRect(hwnd, (PRECTL)&rclScroll);
        !           442:     rclScroll.yTop -= 2 * gcyChar;
        !           443:     rclScroll.yBottom = max2(0L, rclScroll.yTop - (LONG)(CBUFFERELTS * gcyChar));
        !           444: 
        !           445:     WinScrollWindow(hwnd, 0, -gcyChar, (PRECTL)&rclScroll, (PRECTL)&rclScroll,
        !           446:                     NULL, &rclUpdate, 0);
        !           447: 
        !           448:     hps = WinGetPS(hwnd);
        !           449:     WinFillRect(hps, (PRECTL)&rclUpdate, SYSCLR_WINDOW);
        !           450:     DrawMessage( hps
        !           451:               , gcMessages
        !           452:               , &gacm[gicmStart]
        !           453:               , (SHORT)rclScroll.yTop - gcyChar );
        !           454:     WinReleasePS(hps);
        !           455: }
        !           456: 
        !           457: 
        !           458: 
        !           459: /***************************************************************************\
        !           460: * CheckMenuItem
        !           461: *
        !           462: * This function sets the check state of a menu item.
        !           463: *
        !           464: * Parameters:
        !           465: *   hwnd:   frame window
        !           466: *   id:     menu id
        !           467: *   fCheck: check state
        !           468: \***************************************************************************/
        !           469: 
        !           470: VOID CheckMenuItem(
        !           471:     HWND hwndFrame,
        !           472:     SHORT id,
        !           473:     BOOL fCheck)
        !           474: {
        !           475:     HWND hwndMenu;
        !           476: 
        !           477:     /* toggle menu checkmark */
        !           478:     hwndMenu = WinWindowFromID(hwndFrame, FID_MENU);
        !           479:     WinSendMsg(hwndMenu, MM_SETITEMATTR, MPFROM2SHORT(id, TRUE),
        !           480:                MPFROM2SHORT(MIA_CHECKED, fCheck ? MIA_CHECKED : 0));
        !           481: }
        !           482: 
        !           483: 
        !           484: 
        !           485: /***************************************************************************\
        !           486: * MenuCommand
        !           487: *
        !           488: * This function processes WM_COMMAND messages.
        !           489: *
        !           490: * Parameters:
        !           491: *   hwnd:   client window handle
        !           492: *   id:     command identifier
        !           493: \***************************************************************************/
        !           494: 
        !           495: VOID MenuCommand(
        !           496:     HWND hwnd,
        !           497:     SHORT id)
        !           498: {
        !           499:     BOOL *pfDisplay;
        !           500:     HWND hwndFrame;
        !           501: 
        !           502:     if (id == IDM_CLEAR) {
        !           503: 
        !           504:         /* clear current messages */
        !           505:         gcMessages = 0;
        !           506:         WinInvalidateRect(hwnd, NULL, FALSE);
        !           507: 
        !           508:     } else if (id == IDM_KEYUPS) {
        !           509: 
        !           510:         /* toggle logging keyups */
        !           511:         gfKeyUps = !gfKeyUps;
        !           512:         hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE);
        !           513:         CheckMenuItem(hwndFrame, IDM_KEYUPS, gfKeyUps);
        !           514: 
        !           515:     } else if (id >= IDM_DISPLAYFIRST && id <= IDM_DISPLAYLAST) {
        !           516: 
        !           517:         /* toggle display field */
        !           518:         pfDisplay = &(gamf[id - IDM_DISPLAYFIRST].fDisplay);
        !           519:         *pfDisplay = !*pfDisplay;
        !           520:         hwndFrame = WinQueryWindow(hwnd, QW_PARENT, FALSE);
        !           521:         CheckMenuItem(hwndFrame, id, *pfDisplay);
        !           522: 
        !           523:         /* repaint in new format */
        !           524:         WinInvalidateRect(hwnd, NULL, FALSE);
        !           525:     }
        !           526: }
        !           527: 
        !           528: 
        !           529: 
        !           530: /***************************************************************************\
        !           531: * MainWndProc
        !           532: *
        !           533: * This is the window procedure for the main client window.
        !           534: \***************************************************************************/
        !           535: 
        !           536: MRESULT EXPENTRY MainWndProc(
        !           537:     HWND hwnd,
        !           538:     USHORT msg,
        !           539:     MPARAM mp1,
        !           540:     MPARAM mp2)
        !           541: {
        !           542:     switch (msg) {
        !           543: 
        !           544:     case WM_PAINT:
        !           545:         PaintClient(hwnd);
        !           546:         break;
        !           547: 
        !           548:     case WM_COMMAND:
        !           549:         MenuCommand(hwnd, SHORT1FROMMP(mp1));
        !           550:         break;
        !           551: 
        !           552:     case WM_CHAR:
        !           553:         if (gfKeyUps || !(KC_KEYUP & SHORT1FROMMP(mp1))) {
        !           554: 
        !           555:             /* add new message to list */
        !           556:             NewMessage(hwnd, mp1, mp2);
        !           557:         }
        !           558:         break;
        !           559: 
        !           560:     default:
        !           561:         return WinDefWindowProc(hwnd, msg, mp1, mp2);
        !           562:     }
        !           563: 
        !           564:     return (MRESULT)0;
        !           565: }
        !           566: 
        !           567: 
        !           568: 
        !           569: /***************************************************************************\
        !           570: * CheckMenus
        !           571: *
        !           572: * This function sets menu check marks according to their current internal
        !           573: * state.
        !           574: *
        !           575: * Parameters:
        !           576: *   hwndFrame:  main app window handle
        !           577: \***************************************************************************/
        !           578: 
        !           579: VOID CheckMenus(
        !           580:     HWND hwndFrame)
        !           581: {
        !           582:     SHORT id;
        !           583: 
        !           584:     CheckMenuItem(hwndFrame, IDM_KEYUPS, gfKeyUps);
        !           585: 
        !           586:     for (id = IDM_DISPLAYFIRST; id <= IDM_DISPLAYLAST; id++) {
        !           587:         CheckMenuItem(hwndFrame, id, gamf[id - IDM_DISPLAYFIRST].fDisplay);
        !           588:     }
        !           589: }
        !           590: 
        !           591: 
        !           592: 
        !           593: /***************************************************************************\
        !           594: * RegisterSwitchEntry
        !           595: *
        !           596: * This function registers the app with the switch list.
        !           597: *
        !           598: * Parameters:
        !           599: *   hwndFrame:  main app window handle
        !           600: \***************************************************************************/
        !           601: 
        !           602: VOID RegisterSwitchEntry(
        !           603:     HWND hwndFrame)
        !           604: {
        !           605:     PID pid;
        !           606:     TID tid;
        !           607:     SWCNTRL swc;
        !           608: 
        !           609:     WinQueryWindowProcess(hwndFrame, (PPID)&pid, (PTID)&tid);
        !           610:     WinQueryWindowText(hwndFrame, MAXNAMEL, (PSZ)swc.szSwtitle);
        !           611:     swc.hwnd = hwndFrame;
        !           612:     swc.hwndIcon = (ULONG)NULL;
        !           613:     swc.hprog = (HPROGRAM)NULL;
        !           614:     swc.idProcess = pid;
        !           615:     swc.idSession = NULL;
        !           616:     swc.uchVisibility = SWL_VISIBLE;
        !           617:     swc.fbJump = SWL_JUMPABLE;
        !           618:     WinAddSwitchEntry((PSWCNTRL)&swc);
        !           619: }
        !           620: 
        !           621: 
        !           622: 
        !           623: /***************************************************************************\
        !           624: * GetDisplayValues
        !           625: *
        !           626: * This function sets display dependent global variables.
        !           627: \***************************************************************************/
        !           628: 
        !           629: VOID GetDisplayValues(VOID)
        !           630: {
        !           631:     HPS hps;
        !           632:     FONTMETRICS fm;
        !           633:     SHORT i;
        !           634: 
        !           635:     hps = WinGetPS(HWND_DESKTOP);
        !           636:     GpiQueryFontMetrics(hps, (ULONG)sizeof(FONTMETRICS), (PFONTMETRICS)&fm);
        !           637:     WinReleasePS(hps);
        !           638: 
        !           639:     gcyChar = (SHORT)(fm.lMaxBaselineExt + fm.lExternalLeading);
        !           640:     gcxAveChar = (SHORT)fm.lAveCharWidth;
        !           641:     gcxMaxChar = (SHORT)fm.lMaxCharInc;
        !           642: 
        !           643:     /* adjust display widths for this font */
        !           644:     gcxMargin *= gcxAveChar;
        !           645:     for (i = 0; i < CDISPLAYFIELDS; i++) {
        !           646:         gamf[i].cxWidth *= gcxAveChar;
        !           647:     }
        !           648: }
        !           649: 
        !           650: 
        !           651: 
        !           652: /***************************************************************************\
        !           653: * main
        !           654: *
        !           655: * This is the main procedure for the app.
        !           656: \***************************************************************************/
        !           657: 
        !           658: VOID cdecl main(VOID)
        !           659: {
        !           660:     HAB hab;
        !           661:     HMQ hmq;
        !           662:     QMSG qmsg;
        !           663:     ULONG ulCreate;
        !           664:     HWND hwndFrame;
        !           665:     HWND hwndClient;
        !           666:     static CHAR szApp[] = "Char Messages";
        !           667: 
        !           668:     /* init app */
        !           669:     hab = WinInitialize(NULL);
        !           670:     hmq = WinCreateMsgQueue(hab, 0);
        !           671:     GetDisplayValues();
        !           672: 
        !           673:     /* create main window */
        !           674:     WinRegisterClass(hab, szApp, MainWndProc, 0L, 0);
        !           675:     ulCreate = FCF_TITLEBAR | FCF_SYSMENU | FCF_MINMAX | FCF_SIZEBORDER |
        !           676:                FCF_MENU | FCF_SHELLPOSITION | FCF_ICON;
        !           677:     hwndFrame = WinCreateStdWindow(HWND_DESKTOP, WS_VISIBLE, &ulCreate,
        !           678:                                     szApp, szApp, 0L, NULL, ID_RESOURCES,
        !           679:                                     &hwndClient);
        !           680: 
        !           681:     /* register with switch list */
        !           682:     RegisterSwitchEntry(hwndFrame);
        !           683: 
        !           684:     /* initialize menu */
        !           685:     CheckMenus(hwndFrame);
        !           686: 
        !           687:     /* message loop */
        !           688:     while (WinGetMsg(hab, &qmsg, NULL, 0, 0))
        !           689:         WinDispatchMsg(hab, &qmsg);
        !           690: 
        !           691:     /* clean up */
        !           692:     WinDestroyWindow(hwndFrame);
        !           693:     WinDestroyMsgQueue(hmq);
        !           694:     WinTerminate(hab);
        !           695: }

unix.superglobalmegacorp.com

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