Annotation of mstools/samples/fontview/status.c, revision 1.1

1.1     ! root        1: #include "FirstAid.H"
        !             2: 
        !             3: #define NOMINMAX // we will get min/max from stdlib.h
        !             4: #include <windows.h>
        !             5: //#include <port1632.h>
        !             6: 
        !             7: #include <stdlib.h> // For 'abs'
        !             8: 
        !             9: //typedef LONG (APIENTRY *WNDPROC)(HWND, UINT, DWORD, LONG);
        !            10: 
        !            11: #define MAXSTATUS 10
        !            12: typedef struct _tagStatus {
        !            13:        HWND    hwnd;
        !            14:        INT     iMaxWidth, iMinWidth, iGiveWidth;
        !            15: } Status;
        !            16: Status  statusField[MAXSTATUS];
        !            17: 
        !            18: HWND    hwndStatus;
        !            19: INT    cntStatusField = 0;
        !            20: INT    dyStatus, cxStatusBorder, cyStatusBorder, cxFrame, cyFrame, dyField;
        !            21: HFONT   hfontStatus;
        !            22: TEXTMETRIC tmStatusFont;
        !            23: HBRUSH hbrBtnFace;
        !            24: 
        !            25: LONG APIENTRY StatusProc      (HWND, UINT, UINT, LONG);
        !            26: LONG APIENTRY StatusFieldProc (HWND, UINT, UINT, LONG);
        !            27: 
        !            28: BOOL InitStatusBar (HANDLE hInstance)
        !            29: {
        !            30:        WNDCLASS    wndclass;
        !            31: 
        !            32:        hbrBtnFace = CreateSolidBrush(GetSysColor(COLOR_BTNFACE));
        !            33: 
        !            34:        wndclass.style         = CS_HREDRAW | CS_VREDRAW;
        !            35:        wndclass.lpfnWndProc   = (WNDPROC)StatusProc;
        !            36:        wndclass.cbClsExtra    = 0;
        !            37:        wndclass.cbWndExtra    = 0;
        !            38:        wndclass.hInstance      = hInstance;
        !            39:        wndclass.hIcon     = NULL;
        !            40:        wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
        !            41:        wndclass.hbrBackground = hbrBtnFace;
        !            42:        wndclass.lpszMenuName  = NULL;
        !            43:        wndclass.lpszClassName = "SamplerStatus";
        !            44: 
        !            45:        if (!RegisterClass (&wndclass))
        !            46:                return FALSE;
        !            47: 
        !            48:        wndclass.style         = CS_HREDRAW | CS_VREDRAW;
        !            49:        wndclass.lpfnWndProc   = (WNDPROC)StatusFieldProc;
        !            50:        wndclass.cbClsExtra    = 0;
        !            51:        wndclass.cbWndExtra    = 0;
        !            52:        wndclass.hInstance      = hInstance;
        !            53:        wndclass.hIcon     = NULL;
        !            54:        wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW);
        !            55:        wndclass.hbrBackground = hbrBtnFace;
        !            56:        wndclass.lpszMenuName  = NULL;
        !            57:        wndclass.lpszClassName = "StatusField";
        !            58: 
        !            59:        if (!RegisterClass (&wndclass))
        !            60:                return FALSE;
        !            61: 
        !            62: }
        !            63: 
        !            64: BOOL CreateStatusBar (HWND hwnd, HANDLE hInst, INT iId)
        !            65: {
        !            66:        cxStatusBorder = GetSystemMetrics (SM_CXBORDER);
        !            67:        cyStatusBorder = GetSystemMetrics (SM_CYBORDER);
        !            68: 
        !            69: //OutputDebugString (__FILE__": Calling CreateWindow\n");
        !            70:        hwndStatus = CreateWindow ("SamplerStatus", "SamplerStatus",
        !            71:        WS_CHILD //| WS_CLIPSIBLINGS
        !            72:        | WS_BORDER | WS_VISIBLE,
        !            73:                0, 0, 0, 0,
        !            74:        hwnd, (HMENU)iId, hInst, NULL);
        !            75: 
        !            76:        if (!hwndStatus) {
        !            77:                return FALSE;
        !            78:        }
        !            79: //OutputDebugString (__FILE__": CreateWindow Succeeded\n");
        !            80:        return TRUE;
        !            81: }
        !            82: 
        !            83: int StatusBarHeight (HWND hwnd)
        !            84: {
        !            85:        RECT rect;
        !            86:        GetClientRect (hwndStatus, &rect);
        !            87:        return rect.bottom-rect.top;
        !            88: 
        !            89:        hwnd; // unreferenced
        !            90: }
        !            91: 
        !            92: BOOL AdjustStatusBar (HWND hwnd)
        !            93: {
        !            94:        RECT rect;
        !            95:        GetClientRect (hwnd, &rect);
        !            96:        MoveWindow (hwndStatus,
        !            97:                rect.left-cxStatusBorder,
        !            98:                rect.bottom - dyStatus + cyStatusBorder,
        !            99:                rect.right - rect.left + (cxStatusBorder*2),
        !           100:                dyStatus,
        !           101:        TRUE);
        !           102:        return TRUE;
        !           103: }
        !           104: 
        !           105: HWND AddStatusField (HANDLE hInst, INT iId, INT iMin, INT iMax, BOOL bNewGroup)
        !           106: {
        !           107:        LONG lStyle;
        !           108: 
        !           109:        if (cntStatusField >= MAXSTATUS) return (HWND)0; // No room left in our fixed array
        !           110: 
        !           111:        statusField[cntStatusField].hwnd = CreateWindow ("StatusField", "",
        !           112:        WS_CHILD //| WS_CLIPSIBLINGS
        !           113:        | WS_VISIBLE,
        !           114:                0, 0, 0, 0,
        !           115:        hwndStatus, (HMENU)iId, hInst, NULL);
        !           116: 
        !           117:        if (!statusField[cntStatusField].hwnd) return (HWND)0; // CreateWindow failed for some reason
        !           118: 
        !           119:        if (iMin < 0) {
        !           120:        statusField[cntStatusField].iMinWidth = tmStatusFont.tmAveCharWidth*abs(iMin);
        !           121:        } else {
        !           122:        statusField[cntStatusField].iMinWidth = iMin;
        !           123:        }
        !           124: 
        !           125:        if (iMax < 0) {
        !           126:        statusField[cntStatusField].iMaxWidth = tmStatusFont.tmAveCharWidth*abs(iMax);
        !           127:        } else {
        !           128:        statusField[cntStatusField].iMaxWidth = iMax;
        !           129:        }
        !           130: 
        !           131:        if (bNewGroup) {
        !           132:                lStyle = GetWindowLong (statusField[cntStatusField].hwnd, GWL_STYLE);
        !           133:                lStyle |= WS_GROUP;
        !           134:                SetWindowLong (statusField[cntStatusField].hwnd, GWL_STYLE, lStyle);
        !           135:        }
        !           136: 
        !           137:        return statusField[cntStatusField++].hwnd;
        !           138: }
        !           139: 
        !           140: BOOL DestroyStatusBar (void)
        !           141: {
        !           142:        return DeleteObject (hbrBtnFace);
        !           143: }
        !           144: 
        !           145: LONG APIENTRY StatusProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam)
        !           146: {
        !           147:        HDC hdc;
        !           148:        PAINTSTRUCT ps;
        !           149:        INT x, y, i;
        !           150:        INT wAvailWidth, wFlexWidth, cntFlexWidth, wNeedWidth, cntNeedWidth;
        !           151:        RECT    rect, border;
        !           152:        HBRUSH  hBrush;
        !           153: 
        !           154:        switch (msg) {
        !           155:                case WM_CREATE:
        !           156: #ifdef NOCREATEFONT // CreateFont is failing in NT
        !           157:                        hfontStatus = (HFONT)NULL;
        !           158: #else
        !           159:                        hfontStatus = CreateFont(16, 0, 0, 0, 0, 0, 0, 0,
        !           160:                                ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        !           161:                                DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, NULL);
        !           162:                        if (!hfontStatus) {
        !           163:                                MessageBox (GetFocus(), "Failed To Create Font", "StatusProc", MB_OK);
        !           164:                        }
        !           165: #endif
        !           166:                        hdc = GetDC (hwnd);
        !           167:                        SelectObject (hdc, hfontStatus);
        !           168:                        GetTextMetrics (hdc, &tmStatusFont);
        !           169:                        cxStatusBorder = GetSystemMetrics (SM_CXBORDER);
        !           170:                        cyStatusBorder = GetSystemMetrics (SM_CYBORDER);
        !           171:                        cxFrame = 3*cxStatusBorder;
        !           172:                        cyFrame = 3*cyStatusBorder;
        !           173:                        dyField = tmStatusFont.tmHeight + (2*cyStatusBorder);
        !           174:                        dyStatus = dyField + (2*cyFrame);
        !           175:                        ReleaseDC (hwnd, hdc);
        !           176:                        return DefWindowProc (hwnd, msg, wParam, lParam);
        !           177: 
        !           178:                case WM_SIZE:
        !           179:                if (cntStatusField) {
        !           180:                                GetClientRect (hwnd, &rect);
        !           181:                                wAvailWidth = rect.right - rect.left - (cxStatusBorder*8);
        !           182:                                wNeedWidth = 0;
        !           183:                                cntNeedWidth = 0;
        !           184:                                cntFlexWidth = 0;
        !           185: 
        !           186:                                /* First Pass: Dole out to fields that have a minimum need */
        !           187:                                for (i=0; i<cntStatusField; i++) {
        !           188:                                        statusField[i].iGiveWidth = 0; // Make sure all are initialized to 0
        !           189:                                        if (statusField[i].iMinWidth) {
        !           190:                                                /* (n, ?) */
        !           191:                                                statusField[i].iGiveWidth = statusField[i].iMinWidth;
        !           192:                                                wAvailWidth -= (statusField[i].iGiveWidth + cxStatusBorder*2);
        !           193:                                                if (GetWindowLong(statusField[i].hwnd, GWL_STYLE) & WS_GROUP) {
        !           194:                                                        wAvailWidth -= cxStatusBorder*4;
        !           195:                                                }
        !           196:                                        } else {
        !           197:                                                /* They didn't specify a minimum... don't give them anything yet */
        !           198:                                                /* (0, ?) */
        !           199:                                                statusField[i].iGiveWidth = 0;
        !           200:                                                //++cntFlexWidth;
        !           201:                                        }
        !           202: 
        !           203:                                        /* For those that have a minimum, but can grow to be as large as possible...*/
        !           204:                                        /* (n, 0) */
        !           205:                                        if ((statusField[i].iMinWidth >0) && (statusField[i].iMaxWidth ==0)) {
        !           206:                                                ++cntFlexWidth;
        !           207:                                        }
        !           208: 
        !           209:                                        /* For those that have a max that is greater then their min... */
        !           210:                                        /* Includes (0,n) and (n,>n) */
        !           211:                                        if (statusField[i].iMaxWidth > statusField[i].iGiveWidth) {
        !           212:                                                wNeedWidth += (statusField[i].iMaxWidth - statusField[i].iGiveWidth);
        !           213:                                                ++cntNeedWidth;
        !           214:                                        }
        !           215:                                }
        !           216: 
        !           217:                                /* Second Pass: Dole out to fields that have a stated maximum need */
        !           218:                                /* This will also hit those who had no minimum, but did have a maximum */
        !           219:                                /* It will still not give anything to those with no min, no max */
        !           220:                                if ((cntNeedWidth > 0) && (wAvailWidth > 0)) {
        !           221:                                        if (wNeedWidth > wAvailWidth) {
        !           222:                                                wNeedWidth = wAvailWidth;
        !           223:                                        }
        !           224:                                        wNeedWidth = wNeedWidth / cntNeedWidth;
        !           225:                                        for (i=0; i<cntStatusField; i++) {
        !           226:                                                if (statusField[i].iMaxWidth > statusField[i].iGiveWidth) {
        !           227:                                                        statusField[i].iGiveWidth += wNeedWidth;
        !           228:                                                        wAvailWidth -= (statusField[i].iGiveWidth + cxStatusBorder*2);
        !           229:                                                        if (GetWindowLong(statusField[i].hwnd, GWL_STYLE) & WS_GROUP) {
        !           230:                                                                wAvailWidth -= cxStatusBorder*4;
        !           231:                                                        }
        !           232:                                                }
        !           233:                                        }
        !           234:                                }
        !           235: 
        !           236:                                /* Third Pass: Dole out the remaining to fields that want all they can get */
        !           237:                                /* This includes those who had a minimum, but no maximum */
        !           238:                                if ((cntFlexWidth > 0) && (wAvailWidth > 0)) {
        !           239:                                        wFlexWidth = wAvailWidth / cntFlexWidth;
        !           240:                                        for (i=0; i<cntStatusField; i++) {
        !           241:                                                if (statusField[i].iMaxWidth==0) {
        !           242:                                                        statusField[i].iGiveWidth += wFlexWidth;
        !           243:                                                        wAvailWidth -= ((wFlexWidth - statusField[i].iMinWidth) + cxStatusBorder*2);
        !           244:                                                        if (GetWindowLong(statusField[i].hwnd, GWL_STYLE) & WS_GROUP) {
        !           245:                                                                wAvailWidth -= cxStatusBorder*4;
        !           246:                                                        }
        !           247:                                                }
        !           248:                                        }
        !           249:                                }
        !           250: 
        !           251:                                x = cxStatusBorder*4;
        !           252:                                y = rect.top + (2*cyStatusBorder);
        !           253:                                for (i=0; i<cntStatusField; i++) {
        !           254:                                        if (GetWindowLong (statusField[i].hwnd, GWL_STYLE) & WS_GROUP) {
        !           255:                                                x += (cxStatusBorder*4);
        !           256:                                        }
        !           257:                                        MoveWindow (statusField[i].hwnd, x, y, statusField[i].iGiveWidth, dyField, TRUE);
        !           258:                                        x += statusField[i].iGiveWidth + (cxStatusBorder*2);
        !           259:                                }
        !           260:                        }
        !           261:                        break;
        !           262: 
        !           263:                case WM_PAINT:
        !           264:                        hdc = BeginPaint (hwnd, &ps);
        !           265:                        GetClientRect (hwnd, &rect);
        !           266: 
        !           267:                        hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
        !           268:                        border = rect;
        !           269:                        border.bottom = border.top + cyStatusBorder;
        !           270:                        FillRect (hdc, &border, hBrush);
        !           271:                        DeleteObject (hBrush);
        !           272: 
        !           273:                        hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
        !           274:                        border = rect;
        !           275:                        border.top = border.bottom - cyStatusBorder;
        !           276:                        FillRect (hdc, &border, hBrush);
        !           277:                        DeleteObject (hBrush);
        !           278: 
        !           279:                        EndPaint (hwnd, &ps);
        !           280: 
        !           281:                        return DefWindowProc (hwnd, msg, wParam, lParam);
        !           282: 
        !           283:                default:
        !           284:                        return DefWindowProc (hwnd, msg, wParam, lParam);
        !           285:        }
        !           286:        return 0L;
        !           287: }
        !           288: 
        !           289: 
        !           290: 
        !           291: LONG APIENTRY StatusFieldProc (HWND hwnd, UINT msg, UINT wParam, LONG lParam)
        !           292: {
        !           293: static HFONT hFieldFont;
        !           294: 
        !           295:        HDC     hdc;
        !           296:        PAINTSTRUCT ps;
        !           297:        RECT    rect, border;
        !           298:        HBRUSH  hBrush;
        !           299:        WORD    edge = 1;
        !           300:        HFONT   hTmp;
        !           301:        char szText[80];
        !           302:        INT len;
        !           303: 
        !           304:        switch (msg) {
        !           305:                case WM_CREATE:
        !           306:                        hFieldFont = CreateFont(8, 0, 0, 0, 0, 0, 0, 0,
        !           307:                                ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
        !           308:                                DEFAULT_QUALITY, VARIABLE_PITCH | FF_SWISS, "Helv");
        !           309:                        return DefWindowProc (hwnd, msg, wParam, lParam);
        !           310: 
        !           311:                case WM_PAINT:
        !           312:                        hdc = BeginPaint (hwnd, &ps);
        !           313:                        GetClientRect (hwnd, &rect);
        !           314: 
        !           315:                        hBrush = CreateSolidBrush(GetSysColor(COLOR_BTNSHADOW));
        !           316:                        border = rect;
        !           317:                        border.bottom = border.top + cyStatusBorder;
        !           318:                        FillRect (hdc, &border, hBrush);
        !           319:                        border = rect;
        !           320:                        border.right = border.left + cxStatusBorder;
        !           321:                        FillRect (hdc, &border, hBrush);
        !           322:                        DeleteObject (hBrush);
        !           323: 
        !           324:                        hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
        !           325:                        border = rect;
        !           326:                        border.top = border.bottom - cyStatusBorder;
        !           327:                        FillRect (hdc, &border, hBrush);
        !           328:                        border = rect;
        !           329:                        border.left = border.right - cxStatusBorder;
        !           330:                        FillRect (hdc, &border, hBrush);
        !           331:                        DeleteObject (hBrush);
        !           332: 
        !           333:                        if (len = GetWindowText(hwnd, szText, sizeof (szText))) {
        !           334:                                hTmp = SelectObject(hdc, hfontStatus);
        !           335: 
        !           336:                                SetTextColor(hdc, GetSysColor(COLOR_BTNTEXT));
        !           337:                                SetBkColor(hdc, GetSysColor(COLOR_BTNFACE));
        !           338: 
        !           339:                                InflateRect (&rect, -(cxStatusBorder*2), -cyStatusBorder);
        !           340:                                ExtTextOut(hdc, rect.left, rect.top,
        !           341:                                        ETO_OPAQUE | ETO_CLIPPED,
        !           342:                                        &rect,
        !           343:                                        (LPSTR)szText,
        !           344:                                        len, NULL);
        !           345: 
        !           346:                                SelectObject (hdc, hTmp);
        !           347:                        }
        !           348: 
        !           349:                        EndPaint (hwnd, &ps);
        !           350:                        break;
        !           351: 
        !           352:                case WM_SETTEXT:
        !           353:                        InvalidateRect (hwnd, NULL, TRUE);
        !           354:                        return DefWindowProc (hwnd, msg, wParam, lParam);
        !           355: 
        !           356:                default:
        !           357:                        return DefWindowProc (hwnd, msg, wParam, lParam);
        !           358:        }
        !           359:        return 0L;
        !           360: }

unix.superglobalmegacorp.com

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