Annotation of mstools/ole20/samples/outline/heading.c, revision 1.1

1.1     ! root        1: /*************************************************************************
        !             2: ** 
        !             3: **    OLE 2 Sample Code
        !             4: **    
        !             5: **    heading.c
        !             6: **    
        !             7: **    This file contains functions and support for OutlineDoc's row and
        !             8: **    column headings.
        !             9: **    
        !            10: **    (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
        !            11: **
        !            12: *************************************************************************/
        !            13: 
        !            14: #include "outline.h"
        !            15: 
        !            16: extern LPOUTLINEAPP g_lpApp;
        !            17: 
        !            18: 
        !            19: BOOL Heading_Create(LPHEADING lphead, HWND hWndParent, HINSTANCE hInst)
        !            20: {
        !            21:        HDC                     hDC;
        !            22:        TEXTMETRIC  tm;
        !            23: 
        !            24:        if (!lphead || !hWndParent || !hInst)
        !            25:                return FALSE;
        !            26: 
        !            27:        hDC = GetDC(hWndParent);
        !            28:        if (!hDC)
        !            29:                return FALSE;
        !            30: 
        !            31:        if (!GetTextMetrics(hDC, (TEXTMETRIC FAR*)&tm))
        !            32:                return FALSE;
        !            33:        lphead->m_colhead.m_uHeight = tm.tmHeight;
        !            34:        lphead->m_rowhead.m_uWidth = 4 * tm.tmAveCharWidth;
        !            35:        lphead->m_fShow = TRUE;
        !            36:        
        !            37:        ReleaseDC(hWndParent, hDC);
        !            38: 
        !            39:        lphead->m_hfont = CreateFont(
        !            40:                        tm.tmHeight,
        !            41:                        0,0,0,0,0,0,0,0,
        !            42:                        OUT_TT_PRECIS,          // use TrueType
        !            43:                        CLIP_DEFAULT_PRECIS,
        !            44:                        DEFAULT_QUALITY,
        !            45:                        DEFAULT_PITCH | FF_DONTCARE,
        !            46:                        HEADING_FONT
        !            47:        );
        !            48: 
        !            49:        if (!lphead->m_hfont)
        !            50:                return FALSE;
        !            51:        
        !            52:        lphead->m_colhead.m_hWnd = CreateWindow(
        !            53:                        "listbox", 
        !            54:                        "Column Heading",
        !            55:                        WS_VISIBLE | WS_CHILD | WS_DISABLED | LBS_OWNERDRAWVARIABLE |
        !            56:                                        LBS_NOINTEGRALHEIGHT,
        !            57:                        0,0,0,0,                // any values
        !            58:                        hWndParent,
        !            59:                        (HMENU)IDC_COLHEADING,
        !            60:                        hInst,
        !            61:                        NULL);
        !            62: 
        !            63:        if (!lphead->m_colhead.m_hWnd)
        !            64:                return FALSE;
        !            65:                
        !            66:        // add a dummy line to get WM_DRAWITEM message
        !            67:        SendMessage(lphead->m_colhead.m_hWnd, LB_ADDSTRING, 0, 
        !            68:                        MAKELPARAM(lphead->m_colhead.m_uHeight,0));
        !            69: 
        !            70:        lphead->m_rowhead.m_hWnd = CreateWindow(
        !            71:                        "listbox", 
        !            72:                        "Row Heading",
        !            73:                        WS_VISIBLE | WS_CHILD | WS_DISABLED | LBS_OWNERDRAWVARIABLE,
        !            74:                        0,0,0,0,                // any values
        !            75:                        hWndParent,
        !            76:                        (HMENU)IDC_ROWHEADING,
        !            77:                        hInst,
        !            78:                        NULL);
        !            79: 
        !            80:        if (!lphead->m_rowhead.m_hWnd)
        !            81:                return FALSE;
        !            82:        
        !            83:        SendMessage(lphead->m_rowhead.m_hWnd, LB_ADDSTRING, 0, 
        !            84:                        MAKELPARAM(lphead->m_colhead.m_uHeight,0));
        !            85: 
        !            86:        lphead->m_rowhead.m_WndProc = 
        !            87:                        (FARPROC) GetWindowLong(lphead->m_rowhead.m_hWnd, GWL_WNDPROC );
        !            88:     SetWindowLong(lphead->m_rowhead.m_hWnd, GWL_WNDPROC, 
        !            89:                        (LONG) RowHeadWndProc);
        !            90: 
        !            91:        lphead->m_hwndButton = CreateWindow(
        !            92:                        "button", 
        !            93:                        NULL,
        !            94:                        WS_VISIBLE | WS_CHILD,
        !            95:                        0,0,0,0,                // any values
        !            96:                        hWndParent,
        !            97:                        (HMENU)IDC_BUTTON,
        !            98:                        hInst,
        !            99:                        NULL);
        !           100:                        
        !           101:        if (!lphead->m_hwndButton)
        !           102:                return FALSE;
        !           103: 
        !           104:        return TRUE;
        !           105: }
        !           106: 
        !           107: 
        !           108: void Heading_Destroy(LPHEADING lphead)
        !           109: {
        !           110:        if (!lphead) 
        !           111:                return;
        !           112: 
        !           113:        if (IsWindow(lphead->m_colhead.m_hWnd)) {
        !           114:                DestroyWindow(lphead->m_colhead.m_hWnd);
        !           115:                lphead->m_colhead.m_hWnd = NULL;
        !           116:        }
        !           117:        if (IsWindow(lphead->m_rowhead.m_hWnd)) {
        !           118:                DestroyWindow(lphead->m_rowhead.m_hWnd);
        !           119:                lphead->m_rowhead.m_hWnd = NULL;
        !           120:        }
        !           121:        if (IsWindow(lphead->m_hwndButton)) {
        !           122:                DestroyWindow(lphead->m_hwndButton);
        !           123:                lphead->m_hwndButton = NULL;
        !           124:        }
        !           125: #ifdef WIN32
        !           126:        if (GetObjectType(lphead->m_hfont)) {
        !           127: #else
        !           128:        if (IsGDIObject(lphead->m_hfont)) {
        !           129: #endif
        !           130:                DeleteObject(lphead->m_hfont);
        !           131:                lphead->m_hfont = NULL;
        !           132:        }
        !           133:        
        !           134: }
        !           135: 
        !           136: 
        !           137: void Heading_Move(LPHEADING lphead, HWND hwndDoc, LPSCALEFACTOR lpscale)
        !           138: {
        !           139:        int nOffsetX;
        !           140:        int nOffsetY;
        !           141:        RECT rcDoc;
        !           142:        
        !           143:        if (!lphead || !hwndDoc || !lpscale)
        !           144:                return;
        !           145:        
        !           146:        if (!lphead->m_fShow)
        !           147:                return;
        !           148:        
        !           149:        nOffsetX = (int) Heading_RH_GetWidth(lphead, lpscale);
        !           150:        nOffsetY = (int) Heading_CH_GetHeight(lphead, lpscale);
        !           151:        GetClientRect(hwndDoc, (LPRECT)&rcDoc);
        !           152: 
        !           153:        MoveWindow(lphead->m_hwndButton, 0, 0, nOffsetX, nOffsetY, TRUE);
        !           154:        
        !           155:        MoveWindow(
        !           156:                        lphead->m_colhead.m_hWnd, 
        !           157:                        nOffsetX, 0, 
        !           158:                        rcDoc.right-rcDoc.left-nOffsetX, nOffsetY, 
        !           159:                        TRUE
        !           160:        );
        !           161: 
        !           162:        MoveWindow(lphead->m_rowhead.m_hWnd, 0, nOffsetY, nOffsetX,
        !           163:                        rcDoc.bottom-rcDoc.top-nOffsetY, TRUE);
        !           164: }
        !           165: 
        !           166: 
        !           167: void Heading_Show(LPHEADING lphead, BOOL fShow)
        !           168: {
        !           169:        int nCmdShow;
        !           170:        
        !           171:        if (!lphead)
        !           172:                return;
        !           173:        
        !           174:        lphead->m_fShow = fShow;
        !           175:        nCmdShow = fShow ? SW_SHOW : SW_HIDE;
        !           176:        
        !           177:        ShowWindow(lphead->m_hwndButton, nCmdShow);
        !           178:        ShowWindow(lphead->m_colhead.m_hWnd, nCmdShow);
        !           179:        ShowWindow(lphead->m_rowhead.m_hWnd, nCmdShow);
        !           180: }
        !           181: 
        !           182: 
        !           183: void Heading_ReScale(LPHEADING lphead, LPSCALEFACTOR lpscale)
        !           184: {
        !           185:        UINT uHeight;
        !           186:        
        !           187:        if (!lphead || !lpscale)
        !           188:                return;
        !           189: 
        !           190:        // Row heading is scaled with the LineList_Rescale. So, only
        !           191:        // Column heading needed to be scaled here.
        !           192:        uHeight = (UINT)(lphead->m_colhead.m_uHeight * lpscale->dwSyN / 
        !           193:                        lpscale->dwSyD);
        !           194:        SendMessage(lphead->m_colhead.m_hWnd, LB_SETITEMHEIGHT, 0,
        !           195:                        MAKELPARAM(uHeight, 0));
        !           196: }
        !           197: 
        !           198: 
        !           199: void Heading_CH_Draw(LPHEADING lphead, LPDRAWITEMSTRUCT lpdis, LPRECT lprcScreen, LPRECT lprcObject)
        !           200: {
        !           201:        HPEN            hpenOld;
        !           202:        HPEN            hpen;
        !           203:        HBRUSH          hbr;
        !           204:        HFONT           hfOld;
        !           205:        int                     nTabInPix;
        !           206:        char            letter;
        !           207:        int                     i;
        !           208:        int                     nOldMapMode;
        !           209:        RECT            rcWindowOld;
        !           210:        RECT            rcViewportOld;
        !           211:        POINT    point;
        !           212: 
        !           213:        if (!lpdis || !lphead)
        !           214:                return;
        !           215: 
        !           216:        hbr = GetStockObject(LTGRAY_BRUSH);
        !           217:        FillRect(lpdis->hDC, (LPRECT)&lpdis->rcItem, hbr);
        !           218: 
        !           219:        nOldMapMode = SetDCToAnisotropic(lpdis->hDC, lprcScreen, lprcObject, 
        !           220:                        (LPRECT)&rcWindowOld, (LPRECT)&rcViewportOld);
        !           221:        
        !           222:        hfOld = SelectObject(lpdis->hDC, lphead->m_hfont);
        !           223:        hpen = GetStockObject(BLACK_PEN);
        !           224:        hpenOld = SelectObject(lpdis->hDC, hpen);
        !           225: 
        !           226:        nTabInPix = XformWidthInHimetricToPixels(lpdis->hDC, TABWIDTH);
        !           227:        SetBkMode(lpdis->hDC, TRANSPARENT);
        !           228: 
        !           229:        letter = COLUMN_LETTER;
        !           230:        MoveToEx(lpdis->hDC, lprcObject->left, lprcObject->bottom,&point);
        !           231:        LineTo(lpdis->hDC, lprcObject->left, lprcObject->top);
        !           232: 
        !           233:        for (i = 0; i < COLUMN; i++) {
        !           234:                lprcObject->right = lprcObject->left + nTabInPix;               
        !           235:                DrawText(lpdis->hDC, (LPCSTR)&letter, 1, lprcObject,
        !           236:                                DT_SINGLELINE | DT_CENTER | DT_VCENTER);                        
        !           237:                MoveToEx(lpdis->hDC, lprcObject->right, lprcObject->bottom, &point);
        !           238:                LineTo(lpdis->hDC, lprcObject->right, lprcObject->top);
        !           239:                
        !           240:                letter++;
        !           241:                lprcObject->left += nTabInPix;
        !           242:        }
        !           243:        
        !           244:        SelectObject(lpdis->hDC, hpenOld);
        !           245:        SelectObject(lpdis->hDC, hfOld);
        !           246:        
        !           247:        ResetOrigDC(lpdis->hDC, nOldMapMode, (LPRECT)&rcWindowOld, 
        !           248:                        (LPRECT)&rcViewportOld);
        !           249: }
        !           250: 
        !           251: 
        !           252: void Heading_CH_SetHorizontalExtent(LPHEADING lphead, HWND hwndListBox)
        !           253: {
        !           254:        RECT rcLL;
        !           255:        RECT rcCH;
        !           256:        int  nLLWidth;
        !           257:        int  nCHWidth;
        !           258:        int  nHorizExtent;
        !           259:        
        !           260:        if (!lphead || !hwndListBox)
        !           261:                return;
        !           262:        
        !           263:        nHorizExtent=(int)SendMessage(hwndListBox, LB_GETHORIZONTALEXTENT, 0, 0L);
        !           264:        GetClientRect(hwndListBox, (LPRECT)&rcLL);
        !           265:        GetClientRect(lphead->m_colhead.m_hWnd, (LPRECT)&rcCH);
        !           266:        
        !           267:        nLLWidth = rcLL.right - rcLL.left;
        !           268:        nCHWidth = rcCH.right - rcCH.left;
        !           269:        nHorizExtent += nCHWidth - nLLWidth;
        !           270: 
        !           271:        SendMessage(lphead->m_colhead.m_hWnd, LB_SETHORIZONTALEXTENT, 
        !           272:                        nHorizExtent, 0L);
        !           273: }
        !           274: 
        !           275: 
        !           276: UINT Heading_CH_GetHeight(LPHEADING lphead, LPSCALEFACTOR lpscale)
        !           277: {
        !           278:        if (!lphead || !lpscale)
        !           279:                return 0;
        !           280: 
        !           281:        if (lphead->m_fShow)
        !           282:                return (UINT)(lphead->m_colhead.m_uHeight * lpscale->dwSyN / 
        !           283:                                lpscale->dwSyD);
        !           284:        else
        !           285:                return 0;
        !           286: }
        !           287: 
        !           288: 
        !           289: LRESULT Heading_CH_SendMessage(LPHEADING lphead, UINT msg, WPARAM wParam, LPARAM lParam)
        !           290: {
        !           291:        if (!lphead)
        !           292:                return 0;
        !           293: 
        !           294:        if (lphead->m_colhead.m_hWnd)
        !           295:                return SendMessage(lphead->m_colhead.m_hWnd, msg, wParam, lParam);
        !           296: }
        !           297: 
        !           298: 
        !           299: void Heading_CH_ForceRedraw(LPHEADING lphead, BOOL fErase)
        !           300: {
        !           301:        if (!lphead)
        !           302:                return;
        !           303: 
        !           304:        InvalidateRect(lphead->m_colhead.m_hWnd, NULL, fErase);
        !           305: }
        !           306: 
        !           307: void Heading_RH_ForceRedraw(LPHEADING lphead, BOOL fErase)
        !           308: {
        !           309:        if (!lphead)
        !           310:                return;
        !           311: 
        !           312:        InvalidateRect(lphead->m_rowhead.m_hWnd, NULL, fErase);
        !           313: }
        !           314: 
        !           315: void Heading_RH_Draw(LPHEADING lphead, LPDRAWITEMSTRUCT lpdis)
        !           316: {
        !           317:        char            cBuf[5];
        !           318:        HPEN            hpenOld;
        !           319:        HPEN            hpen;
        !           320:        HBRUSH          hbrOld;
        !           321:        HBRUSH          hbr;
        !           322:        HFONT           hfOld;
        !           323:        RECT            rc;
        !           324:        RECT            rcWindowOld;
        !           325:        RECT            rcViewportOld;
        !           326:        int                     nMapModeOld;
        !           327: 
        !           328:        if (!lpdis || !lphead)
        !           329:                return;
        !           330: 
        !           331:        lpdis->rcItem;
        !           332:        
        !           333:        rc.left = 0;
        !           334:        rc.bottom = 0;
        !           335:        rc.top = (int)lpdis->itemData;
        !           336:        rc.right = lphead->m_rowhead.m_uWidth;
        !           337: 
        !           338:        nMapModeOld = SetDCToAnisotropic(lpdis->hDC, &lpdis->rcItem, &rc,
        !           339:                        (LPRECT)&rcWindowOld, (LPRECT)&rcViewportOld);
        !           340: 
        !           341:        hpen = GetStockObject(BLACK_PEN);
        !           342:        hpenOld = SelectObject(lpdis->hDC, hpen);
        !           343:        hbr = GetStockObject(LTGRAY_BRUSH);
        !           344:        hbrOld = SelectObject(lpdis->hDC, hbr);
        !           345:        
        !           346:        Rectangle(lpdis->hDC, rc.left, rc.top, rc.right, 
        !           347:                        rc.bottom);
        !           348:        
        !           349:        hfOld = SelectObject(lpdis->hDC, lphead->m_hfont);
        !           350:                        
        !           351:        SetBkMode(lpdis->hDC, TRANSPARENT);
        !           352: 
        !           353:        wsprintf(cBuf, "%d", lpdis->itemID + 1);
        !           354:        
        !           355:        DrawText(lpdis->hDC, (LPSTR)cBuf, lstrlen(cBuf), (LPRECT)&rc, 
        !           356:                        DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        !           357: 
        !           358:        SelectObject(lpdis->hDC, hfOld);
        !           359: 
        !           360:        SelectObject(lpdis->hDC, hpenOld);
        !           361:        SelectObject(lpdis->hDC, hbrOld);
        !           362:        
        !           363:        ResetOrigDC(lpdis->hDC, nMapModeOld, (LPRECT)&rcWindowOld, 
        !           364:                        (LPRECT)&rcViewportOld);        
        !           365: }
        !           366: 
        !           367: LRESULT Heading_RH_SendMessage(LPHEADING lphead, UINT msg, WPARAM wParam, LPARAM lParam)
        !           368: {
        !           369:        if (!lphead)
        !           370:                return 0;
        !           371: 
        !           372:        if (lphead->m_rowhead.m_hWnd)
        !           373:                return SendMessage(lphead->m_rowhead.m_hWnd, msg, wParam, lParam);
        !           374: }
        !           375: 
        !           376: 
        !           377: UINT Heading_RH_GetWidth(LPHEADING lphead, LPSCALEFACTOR lpscale)
        !           378: {
        !           379:        if (!lphead || !lpscale)
        !           380:                return 0;
        !           381: 
        !           382:        if (lphead->m_fShow)
        !           383:                return (UINT)(lphead->m_rowhead.m_uWidth * lpscale->dwSxN /
        !           384:                                lpscale->dwSxD);
        !           385:        else
        !           386:                return 0;
        !           387: }
        !           388: 
        !           389: 
        !           390: void Heading_RH_Scroll(LPHEADING lphead, HWND hwndListBox)
        !           391: {
        !           392:        int nTopLL;
        !           393:        int nTopRH;
        !           394:        
        !           395:        if (!lphead || !hwndListBox)
        !           396:                return;
        !           397: 
        !           398:        nTopLL = (int)SendMessage(hwndListBox, LB_GETTOPINDEX, 0, 0L);
        !           399:        nTopRH = (int)SendMessage(
        !           400:                        lphead->m_rowhead.m_hWnd, LB_GETTOPINDEX, 0, 0L);
        !           401: 
        !           402:        if (nTopLL != nTopRH) 
        !           403:                SendMessage(
        !           404:                                lphead->m_rowhead.m_hWnd,LB_SETTOPINDEX,(WPARAM)nTopLL,0L);
        !           405: }
        !           406: 
        !           407: 
        !           408: LRESULT FAR PASCAL RowHeadWndProc(HWND hWnd, UINT Message, WPARAM wParam, LPARAM lParam)
        !           409: {
        !           410:        HWND     hwndParent = GetParent (hWnd);
        !           411:        LPOUTLINEDOC lpDoc = (LPOUTLINEDOC)GetWindowLong(hwndParent, 0);
        !           412:        LPHEADING lphead = OutlineDoc_GetHeading(lpDoc);
        !           413:        
        !           414:        switch (Message) {
        !           415:                case WM_PAINT:
        !           416:                {
        !           417:                        LPLINELIST lpLL = OutlineDoc_GetLineList(lpDoc);
        !           418:                        PAINTSTRUCT ps;
        !           419:                
        !           420:                        // If there is no line in listbox, trap the message and draw the 
        !           421:                        // background gray. Without this, the background will be painted
        !           422:                        // as default color.
        !           423:                        if (!LineList_GetCount(lpLL)) {
        !           424:                                BeginPaint(hWnd, &ps);
        !           425:                                EndPaint(hWnd, &ps);
        !           426:                                return 0;
        !           427:                        }
        !           428: 
        !           429:                        break;
        !           430:                }
        !           431:                
        !           432:                case WM_ERASEBKGND:
        !           433:                {
        !           434:                        HDC hDC = (HDC)wParam;
        !           435:                        RECT rc;
        !           436:                        
        !           437:                        GetClientRect(hWnd, (LPRECT)&rc);
        !           438:                        FillRect(hDC, (LPRECT)&rc, GetStockObject(GRAY_BRUSH));
        !           439: 
        !           440:                        return 1;
        !           441:                }
        !           442:        }
        !           443:        
        !           444:        return CallWindowProc(
        !           445:                        (WNDPROC)lphead->m_rowhead.m_WndProc, 
        !           446:                        hWnd, 
        !           447:                        Message, 
        !           448:                        wParam,
        !           449:                        lParam
        !           450:        );
        !           451: }
        !           452: 

unix.superglobalmegacorp.com

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