|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.