Annotation of mstools/samples/sdktools/ddespy/testsubs.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * TESTSUBS.C
        !             3:  *
        !             4:  *   String formatting class, window procedure and helper functions
        !             5:  */
        !             6: 
        !             7: #include <windows.h>
        !             8: #include <windowsx.h>
        !             9: #include <stdio.h>
        !            10: #include <string.h>
        !            11: #include "ddespy.h"
        !            12: #include "globals.h"
        !            13: 
        !            14: #define OFF2P(psw, off)  ((char *)psw + off)
        !            15: #define BOUND(n, min, max) ((n) < (min) ? (min) : ((n) > (max) ? (max) : n))
        !            16: 
        !            17: INT cyChar;                     /* Height of a line */
        !            18: INT cxChar;
        !            19: INT cyDescent;
        !            20: 
        !            21: 
        !            22: /***************************** Public  Function ****************************\
        !            23: * BOOL InitTestSubs( )
        !            24: *
        !            25: * This routine MUST be called before using anything in this file.  Registers
        !            26: * window classes, loads brushes, etc.  Returns TRUE if successful, FALSE
        !            27: * otherwise.
        !            28: *
        !            29: \***************************************************************************/
        !            30: 
        !            31: BOOL InitTestSubs()
        !            32: {
        !            33:     WNDCLASS cls;
        !            34: 
        !            35:     cls.style =         0;
        !            36:     cls.lpfnWndProc =   (WNDPROC)StrWndProc;
        !            37:     cls.cbClsExtra =    0;
        !            38:     cls.cbWndExtra =    sizeof(HANDLE);
        !            39:     cls.hInstance =     hInst;
        !            40:     cls.hIcon =         NULL;
        !            41:     cls.hCursor =       LoadCursor(NULL, IDC_ARROW);
        !            42:     cls.hbrBackground = (HBRUSH)COLOR_WINDOW;
        !            43:     cls.lpszMenuName =  NULL;
        !            44:     cls.lpszClassName = RefString(IDS_STRINGCLASS);
        !            45: 
        !            46:     if (!RegisterClass((WNDCLASS FAR * ) & cls))
        !            47:         return(FALSE);
        !            48: 
        !            49:     return(TRUE);
        !            50: }
        !            51: 
        !            52: 
        !            53: VOID CloseTestSubs(
        !            54: HANDLE hInst)
        !            55: {
        !            56:     UnregisterClass(RefString(IDS_STRINGCLASS), hInst);
        !            57: }
        !            58: 
        !            59: 
        !            60: 
        !            61: VOID NextLine( STRWND *psw)
        !            62: {
        !            63:     psw->offBottomLine += psw->cchLine;
        !            64:     if (psw->offBottomLine == psw->offBufferMax)
        !            65:         psw->offBottomLine = psw->offBuffer;
        !            66:     psw->offOutput = psw->offBottomLine;
        !            67:     *OFF2P(psw, psw->offOutput) = '\0';
        !            68: }
        !            69: 
        !            70: 
        !            71: /***************************** Public  Function ****************************\
        !            72: * VOID DrawString(hwnd, sz)
        !            73: *
        !            74: * This routine prints a string in the specified StringWindow class window.
        !            75: * sz is a NEAR pointer to a zero-terminated string, which can be produced
        !            76: * with wsprintf().
        !            77: \***************************************************************************/
        !            78: 
        !            79: VOID DrawString( HWND hwnd, CHAR *sz)
        !            80: {
        !            81:     register STRWND *psw;
        !            82:     INT cLines = 1;
        !            83:     HANDLE hpsw;
        !            84: 
        !            85:     hpsw = (HANDLE)GetWindowLong(hwnd, 0);
        !            86:     psw = (STRWND *)LocalLock(hpsw);
        !            87: 
        !            88:     NextLine(psw);
        !            89:     while (*sz) {
        !            90:         switch (*sz) {
        !            91:         case '\r':
        !            92:             break;
        !            93: 
        !            94:         case '\n':
        !            95:             *OFF2P(psw, psw->offOutput++) = '\0';
        !            96:             NextLine(psw);
        !            97:             cLines++;
        !            98:             break;
        !            99: 
        !           100:         default:
        !           101:             *OFF2P(psw, psw->offOutput++) = *sz;
        !           102:         }
        !           103:         sz++;
        !           104:     }
        !           105:     *OFF2P(psw, psw->offOutput++) = '\0';
        !           106:     LocalUnlock(hpsw);
        !           107: 
        !           108:     ScrollWindow(hwnd, 0, -((cyChar + cyDescent) * cLines), (LPRECT)NULL,
        !           109:             (LPRECT)NULL);
        !           110:     UpdateWindow(hwnd);
        !           111: }
        !           112: 
        !           113: /***************************** Public  Function ****************************\
        !           114: * "StringWindow" window class
        !           115: *
        !           116: * Windows of the "StringWindow" window class are simple scrolling text output
        !           117: * windows that are refreshed properly as windows are rearranged.  A text buffer
        !           118: * is maintained to store the characters as they are drawn.
        !           119: *
        !           120: * When creating a StringWindow window, lpCreateParams is actually a UINT
        !           121: * containing the dimensions of the text buffer to be created, if 0L, then
        !           122: * a 80 by 25 buffer is created.
        !           123: *
        !           124: \***************************************************************************/
        !           125: 
        !           126: LONG  CALLBACK StrWndProc(HWND hwnd, UINT msg, WPARAM wParam, UINT lParam)
        !           127: {
        !           128:     HANDLE hpsw;
        !           129:     PAINTSTRUCT ps;
        !           130:     RECT rc;
        !           131: 
        !           132:     switch (msg) {
        !           133:     case WM_CREATE:
        !           134:         cyChar = 14;
        !           135:         cxChar = 8;
        !           136:         cyDescent = 2;
        !           137:         if (*(PUINT)lParam     == 0L) {
        !           138:             *(PUINT)lParam     = MAKELONG(80, 50);
        !           139:         }
        !           140:         if (!StrWndCreate(hwnd, LOWORD(*(PUINT)lParam), HIWORD(*(PUINT)lParam)))
        !           141:             return(TRUE);
        !           142:         break;
        !           143: 
        !           144:     case WM_SIZE:
        !           145:         InvalidateRect(hwnd, NULL, TRUE);
        !           146:         break;
        !           147: 
        !           148:     case WM_DESTROY:
        !           149:         if ((hpsw = (HANDLE)GetWindowLong(hwnd, 0)) != NULL)
        !           150:             LocalFree(hpsw);
        !           151:         break;
        !           152: 
        !           153:     case WM_ERASEBKGND:
        !           154:         GetClientRect(hwnd, (LPRECT) &rc);
        !           155:         FillRect((HDC) wParam, (LPRECT) &rc, GetStockObject(WHITE_BRUSH));
        !           156:         break;
        !           157: 
        !           158:     case WM_VSCROLL:
        !           159:         scroll(hwnd, GET_WM_VSCROLL_CODE(wParam, lParam),
        !           160:                 GET_WM_VSCROLL_POS(wParam, lParam), SB_VERT);
        !           161:         break;
        !           162: 
        !           163:     case WM_HSCROLL:
        !           164:         scroll(hwnd, GET_WM_HSCROLL_CODE(wParam, lParam),
        !           165:                 GET_WM_HSCROLL_POS(wParam, lParam), SB_HORZ);
        !           166:         break;
        !           167: 
        !           168:     case WM_PAINT:
        !           169:         BeginPaint(hwnd, &ps);
        !           170:         PaintStrWnd(hwnd, &ps);
        !           171:         EndPaint(hwnd, &ps);
        !           172:         break;
        !           173: 
        !           174:     default:
        !           175:         return(DefWindowProc(hwnd, msg, wParam, lParam));
        !           176:         break;
        !           177:     }
        !           178:     return(0L);
        !           179: }
        !           180: 
        !           181: 
        !           182: 
        !           183: VOID scroll(HWND hwnd, UINT msg, UINT sliderpos, UINT style)
        !           184: {
        !           185:     RECT rc;
        !           186:     INT iPos;
        !           187:     INT dn;
        !           188:     HANDLE hpsw;
        !           189:     register STRWND *psw;
        !           190: 
        !           191:     GetClientRect(hwnd, (LPRECT) &rc);
        !           192:     iPos = GetScrollPos(hwnd, style);
        !           193:     hpsw = (HANDLE)GetWindowLong(hwnd, 0);
        !           194:     psw = (STRWND *)LocalLock(hpsw);
        !           195: 
        !           196:     switch (msg) {
        !           197:     case SB_LINEDOWN:
        !           198:         dn =  1;
        !           199:         break;
        !           200: 
        !           201:     case SB_LINEUP:
        !           202:         dn = -1;
        !           203:         break;
        !           204: 
        !           205:     case SB_PAGEDOWN:
        !           206:         if (style == SB_VERT) {
        !           207:             dn = rc.bottom / (cyChar + cyDescent);
        !           208:         } else {
        !           209:             dn = rc.right / cxChar;
        !           210:         }
        !           211:         break;
        !           212: 
        !           213:     case SB_PAGEUP:
        !           214:         if (style == SB_VERT) {
        !           215:             dn = -rc.bottom / (cyChar + cyDescent);
        !           216:         } else {
        !           217:             dn = -rc.right / cxChar;
        !           218:         }
        !           219:         break;
        !           220: 
        !           221:     case SB_THUMBTRACK:
        !           222:     case SB_THUMBPOSITION:
        !           223:         dn = sliderpos-iPos;
        !           224:         break;
        !           225: 
        !           226:     default:
        !           227:         dn = 0;
        !           228:     }
        !           229:     if (style == SB_VERT) {
        !           230:         if (dn = BOUND (iPos + dn, 0, psw->cLine) - iPos) {
        !           231:             psw->cBottomLine -= dn;
        !           232:             ScrollWindow (hwnd, 0, -dn * (cyChar + cyDescent), NULL, NULL);
        !           233:             SetScrollPos (hwnd, SB_VERT, iPos + dn, TRUE);
        !           234:         }
        !           235:     } else /* style == SB_HORZ */ {
        !           236:         if (dn = BOUND (iPos + dn, 0, psw->cchLine) - iPos) {
        !           237:             psw->cLeftChar += dn;
        !           238:             ScrollWindow (hwnd, -dn * cxChar, 0, NULL, NULL);
        !           239:             SetScrollPos (hwnd, SB_HORZ, iPos + dn, TRUE);
        !           240:         }
        !           241:     }
        !           242:     LocalUnlock(hpsw);
        !           243: }
        !           244: 
        !           245: 
        !           246: 
        !           247: BOOL StrWndCreate(HWND hwnd, INT cchLine, INT cLine)
        !           248: {
        !           249:     register INT off;
        !           250:     STRWND *psw;
        !           251:     HANDLE hpsw;
        !           252: 
        !           253:     if ((hpsw = LocalAlloc(LMEM_MOVEABLE, sizeof(STRWND) + cchLine * cLine)) == NULL)
        !           254:         return(FALSE);
        !           255:     SetWindowLong(hwnd, 0, (UINT)hpsw);
        !           256: 
        !           257: 
        !           258:     psw = (STRWND *)LocalLock(hpsw);
        !           259:     psw->cchLine       = cchLine;
        !           260:     psw->cLine         = cLine;
        !           261:     off                = sizeof(STRWND);
        !           262:     psw->offBuffer     = off;
        !           263:     psw->offBufferMax  = off + cchLine * cLine;
        !           264:     psw->offBottomLine = off;
        !           265:     psw->offOutput     = off;
        !           266:     psw->cBottomLine   = 0;
        !           267:     psw->cLeftChar     = 0;
        !           268: 
        !           269:     ClearScreen(psw);
        !           270: 
        !           271:     SetScrollRange(hwnd, SB_VERT, 0, cLine, FALSE);
        !           272:     SetScrollPos(hwnd, SB_VERT, cLine, TRUE);
        !           273:     SetScrollRange(hwnd, SB_HORZ, 0, cchLine, TRUE);
        !           274:     LocalUnlock(hpsw);
        !           275:     return(TRUE);
        !           276: }
        !           277: 
        !           278: 
        !           279: VOID ClearScreen(register STRWND *psw)
        !           280: {
        !           281:     register INT off;
        !           282:     /*
        !           283:      * Make all the lines empty
        !           284:      */
        !           285:     off = psw->offBuffer;
        !           286:     while (off < psw->offBufferMax) {
        !           287:         *OFF2P(psw, off) = '\0';
        !           288:         off += psw->cchLine;
        !           289:     }
        !           290: }
        !           291: 
        !           292: 
        !           293: 
        !           294: 
        !           295: VOID PaintStrWnd( HWND hwnd, LPPAINTSTRUCT pps)
        !           296: {
        !           297:     register STRWND *psw;
        !           298:     register INT off;
        !           299:     INT x;
        !           300:     INT y;
        !           301:     RECT rc, rcOut;
        !           302:     HANDLE hpsw;
        !           303: 
        !           304: 
        !           305:     SelectObject(pps->hdc, GetStockObject(ANSI_FIXED_FONT));
        !           306:     hpsw = (HANDLE)GetWindowLong(hwnd, 0);
        !           307:     psw = (STRWND *)LocalLock(hpsw);
        !           308: 
        !           309:     GetClientRect(hwnd, (LPRECT)&rc);
        !           310:     if (!pps->fErase)
        !           311:         FillRect(pps->hdc, (LPRECT)&rc, GetStockObject(WHITE_BRUSH));
        !           312: 
        !           313:     x = rc.left - cxChar * psw->cLeftChar;
        !           314:     y = rc.bottom - cyDescent + (cyChar + cyDescent) * psw->cBottomLine;
        !           315:     off = psw->offBottomLine;
        !           316: 
        !           317:     if (&pps->rcPaint != NULL)
        !           318:         IntersectRect((LPRECT)&rc, (LPRECT)&rc, &pps->rcPaint);
        !           319: 
        !           320:     do {
        !           321:         if (y <= rc.top - cyDescent)
        !           322:             break;
        !           323:         if (y - cyChar <= rc.bottom) {
        !           324:             rcOut.left = x;
        !           325:             rcOut.bottom = y + cyDescent;
        !           326:             rcOut.right = 1000;
        !           327:             rcOut.top = y - cyChar;
        !           328:             DrawText(pps->hdc, (LPSTR)OFF2P(psw, off), -1, (LPRECT)&rcOut,
        !           329:                     DT_LEFT | DT_VCENTER | DT_NOCLIP | DT_EXPANDTABS |
        !           330:                     DT_EXTERNALLEADING | DT_NOPREFIX | DT_TABSTOP | 0x0400);
        !           331:         }
        !           332:         y -= cyChar + cyDescent;
        !           333:         /*
        !           334:          * Back up to previous line
        !           335:          */
        !           336:         if (off == psw->offBuffer)
        !           337:             off = psw->offBufferMax;
        !           338:         off -= psw->cchLine;
        !           339:     } while (off != psw->offBottomLine);
        !           340:     LocalUnlock(hpsw);
        !           341: }
        !           342: 

unix.superglobalmegacorp.com

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