Annotation of mstools/ole20/samples/outline/heading.c, revision 1.1.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.