|
|
1.1 ! root 1: #include <afxwin.h> ! 2: #include <afxdlgs.h> ! 3: #include <afxcoll.h> ! 4: #include <string.h> ! 5: ! 6: #include "types.h" ! 7: #include "resource.h" ! 8: #include "ranges.h" ! 9: #include "list.h" ! 10: #include "listwin.h" ! 11: ! 12: ! 13: #define PAGESIZE 8 ! 14: ! 15: /*********************** GLOBAL DATA *****************************/ ! 16: ! 17: extern LOGFONT DefaultFont; ! 18: extern HCURSOR HCursorSizer; ! 19: extern HCURSOR HCursorNormal; ! 20: extern HICON HIconList; ! 21: ! 22: ! 23: /*********************** CListWnd implementation **********************/ ! 24: ! 25: BEGIN_MESSAGE_MAP(CListWnd, CMDIChildWnd) ! 26: ON_WM_CREATE() ! 27: ON_WM_DESTROY() ! 28: ON_WM_MDIACTIVATE() ! 29: ON_WM_KEYDOWN() ! 30: ON_WM_LBUTTONDBLCLK() ! 31: ON_WM_LBUTTONDOWN() ! 32: ON_WM_LBUTTONUP() ! 33: ON_WM_MOUSEMOVE() ! 34: ON_WM_PAINT() ! 35: ON_WM_SIZE() ! 36: ON_WM_VSCROLL() ! 37: ! 38: ON_COMMAND( VK_UP, OnUp ) ! 39: ON_COMMAND( VK_DOWN, OnDown ) ! 40: ON_COMMAND( IDM_LIST_FONT, OnFont ) ! 41: ON_COMMAND( IDM_LIST_RANGES, OnRanges ) ! 42: ON_COMMAND( IDM_LIST_ALPHA, OnSortAlpha ) ! 43: ON_COMMAND( IDM_LIST_CALLS, OnSortCalls ) ! 44: ON_COMMAND( IDM_LIST_TIME, OnSortTime ) ! 45: ON_COMMAND( IDM_LIST_PER_CALL, OnSortTimePer) ! 46: ON_COMMAND( IDM_LIST_CHILDREN, OnChildren) ! 47: END_MESSAGE_MAP() ! 48: ! 49: BOOL CListWnd::Create(LPCSTR szTitle, LONG style, const RECT& rect, ! 50: CMDIFrameWnd* parent) ! 51: { ! 52: const char * pszStockClass = AfxRegisterWndClass( ! 53: CS_HREDRAW | CS_VREDRAW, NULL, ! 54: (HBRUSH) (COLOR_WINDOW+1), HIconList); ! 55: ! 56: rgl[0] = 0; ! 57: rgl[1] = 150; ! 58: rgl[2] = 200; ! 59: rgl[3] = 250; ! 60: rgl[4] = 300; ! 61: rgl[5] = 350; ! 62: rgl[6] = 400; ! 63: rgl[7] = 450; ! 64: rgl[8] = 500; ! 65: rgl[9] = 550; ! 66: rgl[10] = 600; ! 67: m_cxClient = 600; ! 68: fCapture = FALSE; ! 69: ! 70: return CMDIChildWnd::Create(pszStockClass, szTitle, style, rect, parent); ! 71: } ! 72: ! 73: ! 74: CListWnd::CListWnd() ! 75: { ! 76: int i; ! 77: ! 78: m_pMenuCurrent = NULL; ! 79: m_bWindowActive = FALSE; ! 80: m_SortOrder = LIST_ALPHA; ! 81: logFont = DefaultFont; ! 82: fChildren = FALSE; ! 83: ! 84: for (i=0; i<MAX_NUM_RANGES; i++) { ! 85: rs.TextColor[i] = 0; ! 86: rs.BackColor[i] = RGB( 0, 0, 0); ! 87: rs.Above[i] = 101; ! 88: } ! 89: ! 90: rs.Above[0] = 0; rs.BackColor[0] = RGB( 0, 0, 255); ! 91: rs.TextColor[0] = 1; ! 92: rs.Above[1] = 1; rs.BackColor[1] = RGB( 0, 255, 0); ! 93: rs.Above[2] = 2; rs.BackColor[2] = RGB( 0, 255, 255); ! 94: rs.Above[3] = 5; rs.BackColor[3] = RGB( 255, 255, 0); ! 95: rs.Above[4] = 20; rs.BackColor[4] = RGB( 255, 0, 0); ! 96: rs.Above[5] = 101; ! 97: rs.cRanges = 5; ! 98: ! 99: ratio = 0.33; ! 100: ! 101: return; ! 102: } /* CListWnd::CListWnd() */ ! 103: ! 104: CListWnd::~CListWnd() ! 105: { ! 106: if (m_bWindowActive) { ! 107: m_pMenuCurrent->Detach(); ! 108: } ! 109: } ! 110: ! 111: void CListWnd::EndTiming() ! 112: { ! 113: m_ListHead.SortByTotalTime(); ! 114: m_ListHead.SortByPerTime(); ! 115: m_ListHead.SortByCallCount(); ! 116: m_ListHead.SortByTPerTime(); ! 117: m_ListHead.SortByTimeAll(); ! 118: pRight->ComputeWidths(); ! 119: pLeft->ComputeWidths(); ! 120: return; ! 121: } ! 122: ! 123: void CListWnd::InvalidateLine() ! 124: { ! 125: CRect area(0, (m_nSelectLine - m_nVscrollPos ) * m_cyChar, ! 126: m_cxClient, (m_nSelectLine + 1 - m_nVscrollPos) * m_cyChar); ! 127: InvalidateRect( area ); ! 128: } ! 129: ! 130: int CListWnd::OnCreate(LPCREATESTRUCT p) ! 131: { ! 132: TEXTMETRIC tm; ! 133: ! 134: CDC * dc = GetDC(); ! 135: dc->GetTextMetrics( &tm ); ! 136: ReleaseDC( dc ); ! 137: ! 138: m_cxChar = tm.tmAveCharWidth; ! 139: m_cxCaps = ( (tm.tmPitchAndFamily & 1) ? 3 : 2) * m_cxChar / 2; ! 140: m_cyChar = tm.tmHeight + tm.tmExternalLeading; ! 141: m_nMaxWidth = ( 20 ) * m_cxCaps; ! 142: m_nVscrollPos = 0; ! 143: ! 144: /* ! 145: */ ! 146: ! 147: pLeft = new CListWndLeft; ! 148: pLeft->Create(WS_HSCROLL|WS_VISIBLE, rectDefault, this); ! 149: ! 150: pRight = new CListWndRight; ! 151: pRight->Create(WS_HSCROLL|WS_VISIBLE, rectDefault, this); ! 152: ! 153: return 0; ! 154: } ! 155: ! 156: ! 157: void CListWnd::OnDestroy() ! 158: { ! 159: // m_pMDIFrameWnd->SendMessage(WM_CHILDDESTROY, (UINT)m_hWnd, 0); ! 160: return; ! 161: } ! 162: ! 163: ! 164: void CListWnd::OnSize(UINT nType, int cx, int cy) ! 165: { ! 166: int cxOld = m_cxClient; ! 167: int i; ! 168: ! 169: i = (int) (cx*ratio); ! 170: pLeft->MoveWindow(0, 0, i-1, cy); ! 171: pRight->MoveWindow(i+2, 0, cx-(i+2), cy); ! 172: ! 173: /* ! 174: * Now set the scroll ranges ! 175: */ ! 176: ! 177: m_cxClient = cx; ! 178: m_cyClient = max(cy, 1); ! 179: ! 180: m_nVscrollMax = max( 0, (int)( m_ListHead.GetCount() ) - m_cyClient / m_cyChar ); ! 181: m_nVscrollPos = min( m_nVscrollPos, m_nVscrollMax ); ! 182: ! 183: SetScrollRange( SB_VERT, 0, m_nVscrollMax, FALSE ); ! 184: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE ); ! 185: ! 186: CMDIChildWnd::OnSize(nType, cx, cy); ! 187: ! 188: return; ! 189: } ! 190: ! 191: void CListWnd::OnMDIActivate(BOOL bActivate, CWnd * pActive, ! 192: CWnd* pDeactivate) ! 193: { ! 194: CMDIFrameWnd * pFrame = m_pMDIFrameWnd; ! 195: CMenu * pWinPopupMenu = NULL; ! 196: CMenu * pMenu = NULL; ! 197: ! 198: m_bWindowActive = bActivate; ! 199: ! 200: if (bActivate) { ! 201: pMenu = new CMenu; ! 202: pMenu->LoadMenu("MdiMenuList"); ! 203: pWinPopupMenu = pMenu->GetSubMenu(LISTWIN_MENU_POSITION); ! 204: ! 205: CMenu * pLastMenu = pFrame->MDISetMenu(pMenu,pWinPopupMenu); ! 206: pLastMenu->DestroyMenu(); ! 207: ! 208: delete m_pMenuCurrent; ! 209: m_pMenuCurrent = pMenu; ! 210: } else { ! 211: pMenu = new CMenu; ! 212: pMenu->LoadMenu("MdiMenuInit"); ! 213: pWinPopupMenu = pMenu->GetSubMenu(INIT_MENU_POS); ! 214: ! 215: CMenu * pLastMenu = pFrame->MDISetMenu(pMenu, pWinPopupMenu); ! 216: pLastMenu->DestroyMenu(); ! 217: ! 218: delete m_pMenuCurrent; ! 219: m_pMenuCurrent = pMenu; ! 220: } ! 221: ! 222: pFrame->DrawMenuBar(); ! 223: } ! 224: ! 225: void CListWnd::OnPaint() ! 226: { ! 227: CPaintDC dc (this); ! 228: CRect rt; ! 229: CBrush b(RGB(0, 0, 0)); ! 230: ! 231: dc.FillRect(&dc.m_ps.rcPaint, &b); ! 232: ! 233: return; ! 234: } ! 235: ! 236: void CListWnd::OnVScroll(UINT wParam, UINT pos, CScrollBar * p) ! 237: { ! 238: pLeft->OnVScroll(wParam, pos, p); ! 239: m_nVscrollPos = pRight->OnVScroll(wParam, pos, p); ! 240: SetScrollPos( SB_VERT, m_nVscrollPos ); ! 241: ! 242: return; ! 243: } ! 244: ! 245: void CListWnd::OnUp() ! 246: { ! 247: InvalidateLine(); ! 248: ! 249: if ( m_nSelectLine <= 0 ) { ! 250: m_nSelectLine = m_ListHead.GetCount() - 1; ! 251: m_nVscrollPos = max( 0, m_nSelectLine + 1 - ( m_cyClient / m_cyChar ) ); ! 252: Invalidate( TRUE ); ! 253: } else { ! 254: m_nSelectLine -= 1; ! 255: if (m_nSelectLine - m_nVscrollPos < 0) { ! 256: OnVScroll( SB_LINEUP, 0, NULL ); ! 257: } ! 258: ! 259: if (m_nSelectLine - m_nVscrollPos > (m_cyClient / m_cyChar ) ) { ! 260: m_nVscrollPos = m_nSelectLine + 1 - (m_cyClient / m_cyChar); ! 261: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE ); ! 262: Invalidate( TRUE ); ! 263: } ! 264: if (m_nSelectLine - m_nVscrollPos < 0) { ! 265: m_nVscrollPos = m_nSelectLine; ! 266: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE ); ! 267: Invalidate( TRUE ); ! 268: } ! 269: } ! 270: ! 271: InvalidateLine(); ! 272: } ! 273: ! 274: void CListWnd::OnDown() ! 275: { ! 276: ! 277: InvalidateLine(); ! 278: ! 279: if (( m_nSelectLine == (int)(m_ListHead.GetCount() - 1 )) || ! 280: (m_nSelectLine == -1)) { ! 281: m_nSelectLine = 0; ! 282: m_nVscrollPos = 0; ! 283: Invalidate( TRUE ); ! 284: } else { ! 285: m_nSelectLine += 1; ! 286: if ((m_nSelectLine - m_nVscrollPos + 1) > (m_cyClient/m_cyChar)) { ! 287: OnVScroll( SB_LINEDOWN, 0, NULL ); ! 288: } ! 289: ! 290: if (m_nSelectLine - m_nVscrollPos > (m_cyClient / m_cyChar ) ) { ! 291: m_nVscrollPos = m_nSelectLine + 1 - (m_cyClient / m_cyChar); ! 292: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE ); ! 293: Invalidate( TRUE ); ! 294: } ! 295: if (m_nSelectLine - m_nVscrollPos < 0) { ! 296: m_nVscrollPos = m_nSelectLine; ! 297: SetScrollPos( SB_VERT, m_nVscrollPos, TRUE ); ! 298: Invalidate( TRUE ); ! 299: } ! 300: } ! 301: ! 302: InvalidateLine(); ! 303: } ! 304: ! 305: void CListWnd::OnKeyDown( UINT wParam, UINT, UINT ) ! 306: { ! 307: switch( wParam ) { ! 308: case VK_HOME: ! 309: OnVScroll( SB_TOP, 0, NULL ); ! 310: break; ! 311: case VK_END: ! 312: OnVScroll( SB_BOTTOM, 0, NULL ); ! 313: break; ! 314: ! 315: case VK_PRIOR: ! 316: OnVScroll( SB_PAGEUP, 0, NULL ); ! 317: break; ! 318: ! 319: case VK_NEXT: ! 320: OnVScroll( SB_PAGEDOWN, 0, NULL ); ! 321: break; ! 322: ! 323: case VK_LEFT: ! 324: OnHScroll( SB_PAGEUP, 0, NULL ); ! 325: break; ! 326: ! 327: case VK_RIGHT: ! 328: OnHScroll( SB_PAGEDOWN, 0, NULL ); ! 329: break; ! 330: } ! 331: } ! 332: ! 333: void CListWnd::OnLButtonDblClk( UINT wParam, CPoint location ) ! 334: { ! 335: #if 0 ! 336: if (m_nSelectLine == -1) { ! 337: OnLButtonDown( wParam, location ); ! 338: } ! 339: OnEdit(); ! 340: #endif ! 341: } ! 342: ! 343: ! 344: ! 345: afx_msg void CListWnd::OnSortAlpha() ! 346: { ! 347: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED); ! 348: m_SortOrder = LIST_ALPHA; ! 349: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED); ! 350: Invalidate(TRUE); ! 351: return; ! 352: } /* CListWnd::OnSortAlpha() */ ! 353: ! 354: afx_msg void CListWnd::OnSortCalls() ! 355: { ! 356: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED); ! 357: m_SortOrder = LIST_CALLS; ! 358: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED); ! 359: Invalidate(TRUE); ! 360: return; ! 361: } /* CListWnd::OnSortCalls() */ ! 362: ! 363: afx_msg void CListWnd::OnSortTime() ! 364: { ! 365: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED); ! 366: m_SortOrder = fChildren ? LIST_TIME_TOTAL : LIST_TIME; ! 367: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED); ! 368: Invalidate(TRUE); ! 369: return; ! 370: } /* CListWnd::OnSortTime() */ ! 371: ! 372: afx_msg void CListWnd::OnSortTimePer() ! 373: { ! 374: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_UNCHECKED); ! 375: m_SortOrder = fChildren ? LIST_PER_TIME_TOTAL : LIST_PER_TIME; ! 376: m_pMenuCurrent->CheckMenuItem(IDM_LIST + (m_SortOrder & 7), MF_BYCOMMAND | MF_CHECKED); ! 377: Invalidate(TRUE); ! 378: return; ! 379: } /* CListWnd::OnSortTimePer() */ ! 380: ! 381: void CListWnd::OnRanges() ! 382: { ! 383: CFont cFont; ! 384: CFont * lpcFont; ! 385: ! 386: DoRangesDlg(this, &rs); ! 387: ! 388: CClientDC cdc( this ); ! 389: ! 390: cFont.CreateFontIndirect(&logFont); ! 391: lpcFont = cdc.SelectObject(&cFont); ! 392: // pTimerObj->AssignSizes( &cdc, fZoom, 0, &rs); ! 393: // SetRect( pTimerObj->AssignLocations()) ; ! 394: cdc.SelectObject(lpcFont); ! 395: ! 396: Invalidate(TRUE); ! 397: ! 398: return; ! 399: } /* CListWnd::OnRanges() */ ! 400: ! 401: void CListWnd::OnFont() ! 402: { ! 403: CFontDialog fontDlg(&logFont); ! 404: ! 405: if (fontDlg.DoModal()) { ! 406: ! 407: pRight->ComputeWidths(); ! 408: pLeft->ComputeWidths(); ! 409: } ! 410: return; ! 411: } /* CListWnd::OnFont() */ ! 412: ! 413: afx_msg void CListWnd::OnLButtonDown(UINT nFlags, CPoint pt) ! 414: { ! 415: CClientDC dc(this); ! 416: ! 417: fCapture = TRUE; ! 418: SetCapture(); ! 419: rtCapture.SetRect(pt.x-1, 0, pt.x+1, m_cyClient); ! 420: dc.InvertRect(&rtCapture); ! 421: return; ! 422: } /* CListWnd::OnLButtonDown() */ ! 423: ! 424: afx_msg void CListWnd::OnLButtonUp(UINT nFlags, CPoint pt) ! 425: { ! 426: int x; ! 427: ! 428: if (fCapture) { ! 429: ReleaseCapture(); ! 430: fCapture = FALSE; ! 431: x = min(max(pt.x, 10), m_cxClient-10); ! 432: ratio = ((float) x) / (float)m_cxClient; ! 433: ! 434: pLeft->MoveWindow(0, 0, x-1, m_cyClient); ! 435: pRight->MoveWindow(x+2, 0, m_cxClient-(x+2), m_cyClient); ! 436: } else { ! 437: CWnd::OnLButtonUp(nFlags, pt); ! 438: } ! 439: } /* CListWnd::OnLButtonDown() */ ! 440: ! 441: afx_msg void CListWnd::OnMouseMove(UINT nFlags, CPoint pt) ! 442: { ! 443: if (!fCapture) { ! 444: ! 445: SetCursor(HCursorSizer); ! 446: ! 447: } else { ! 448: CClientDC dc(this); ! 449: int x = min(max(pt.x, 10), m_cxClient-10); ! 450: ! 451: dc.InvertRect(&rtCapture); ! 452: rtCapture.SetRect(x-1, 0, x+1, m_cyClient); ! 453: dc.InvertRect(&rtCapture); ! 454: } ! 455: } /* CListWnd::OnMouseMove() */ ! 456: ! 457: afx_msg void CListWnd::OnChildren() ! 458: { ! 459: fChildren = !fChildren; ! 460: if (m_SortOrder == LIST_TIME) { ! 461: m_SortOrder = LIST_TIME_TOTAL; ! 462: } else if (m_SortOrder == LIST_TIME_TOTAL) { ! 463: m_SortOrder = LIST_TIME; ! 464: } else if (m_SortOrder == LIST_PER_TIME) { ! 465: m_SortOrder = LIST_PER_TIME_TOTAL; ! 466: } else if (m_SortOrder == LIST_PER_TIME_TOTAL) { ! 467: m_SortOrder = LIST_PER_TIME; ! 468: } ! 469: m_pMenuCurrent->CheckMenuItem(IDM_LIST_CHILDREN, MF_BYCOMMAND | (fChildren ? MF_CHECKED : MF_UNCHECKED)); ! 470: Invalidate(TRUE); ! 471: return; ! 472: } /* CListWnd::OnChildren() */ ! 473: ! 474: ! 475: ! 476: ! 477: /**********************************************************************/ ! 478: ! 479: BOOL CListWndChild::Create(DWORD style, const RECT& rect, CListWnd * parent) ! 480: { ! 481: const char * pszStockClass; ! 482: ! 483: pszStockClass = AfxRegisterWndClass( CS_HREDRAW | CS_VREDRAW, NULL, ! 484: (HBRUSH) (COLOR_WINDOW+1), NULL); ! 485: ! 486: pListWnd = parent; ! 487: ! 488: return CWnd::Create(pszStockClass, "A", style, rect, parent, 999); ! 489: ! 490: ! 491: } /* CListWndChild::Create() */ ! 492: ! 493: int CListWndChild::OnCreate(LPCREATESTRUCT p) ! 494: { ! 495: // ComputeWidths(); ! 496: ! 497: return 0; ! 498: } /* CListWndChild::OnCreate() */ ! 499: ! 500: void CListWndChild::OnDestroy() ! 501: { ! 502: return; ! 503: } /* CListWndCHild::OnDestroy() */ ! 504: ! 505: ! 506: void CListWndChild::OnSize(UINT nType, int cx, int cy) ! 507: { ! 508: m_cxClient = cx; ! 509: m_cyClient = cy; ! 510: ! 511: SetScrollRange(SB_HORZ, 0, max(1, m_nHscrollMax - cx), TRUE); ! 512: ! 513: m_nVscrollMax = max(1, (int)(ListHead()->GetCount())-m_cyClient/m_cyChar); ! 514: ! 515: CWnd::OnSize(nType, cx, cy); ! 516: ! 517: return; ! 518: } /* CListWndChild::OnSize() */ ! 519: ! 520: void CListWndChild::OnHScroll(UINT wParam, UINT pos, CScrollBar *) ! 521: { ! 522: int nScrollInc; ! 523: ! 524: switch( wParam ) { ! 525: case SB_LEFT: ! 526: nScrollInc = -m_nVscrollPos; ! 527: break; ! 528: ! 529: case SB_RIGHT: ! 530: nScrollInc = m_cxClient; ! 531: break; ! 532: ! 533: case SB_LINELEFT: ! 534: nScrollInc = -1; ! 535: break; ! 536: ! 537: case SB_LINERIGHT: ! 538: nScrollInc = 1; ! 539: break; ! 540: ! 541: case SB_PAGELEFT: ! 542: nScrollInc = -m_cxClient; ! 543: break; ! 544: ! 545: case SB_PAGERIGHT: ! 546: nScrollInc = m_cxClient; ! 547: break; ! 548: ! 549: case SB_THUMBTRACK: ! 550: nScrollInc = pos - m_nHscrollPos; ! 551: break; ! 552: ! 553: default: ! 554: nScrollInc = 0; ! 555: } ! 556: ! 557: nScrollInc = max( -m_nHscrollPos, ! 558: min(nScrollInc, ! 559: (m_nHscrollMax - m_cxClient) - m_nHscrollPos )); ! 560: if (nScrollInc) { ! 561: m_nHscrollPos += nScrollInc; ! 562: SetScrollPos( SB_HORZ, m_nHscrollPos ); ! 563: ScrollWindow( -nScrollInc, 0); ! 564: UpdateWindow(); ! 565: } ! 566: return; ! 567: } /* CListWndChild::OnHScroll() */ ! 568: ! 569: int CListWndChild::OnVScroll(UINT wParam, UINT pos, CScrollBar *) ! 570: { ! 571: int nScrollInc; ! 572: ! 573: switch( wParam ) { ! 574: case SB_TOP: ! 575: nScrollInc = -m_nVscrollPos; ! 576: break; ! 577: ! 578: case SB_BOTTOM: ! 579: nScrollInc = m_nVscrollMax; ! 580: break; ! 581: ! 582: case SB_LINEUP: ! 583: nScrollInc = -1; ! 584: break; ! 585: ! 586: case SB_LINEDOWN: ! 587: nScrollInc = 1; ! 588: break; ! 589: ! 590: case SB_PAGEUP: ! 591: nScrollInc = min( -1, -(m_cyClient/m_cyChar - 2)); ! 592: break; ! 593: ! 594: case SB_PAGEDOWN: ! 595: nScrollInc = max( 1, m_cyClient/m_cyChar - 2); ! 596: break; ! 597: ! 598: case SB_THUMBTRACK: ! 599: nScrollInc = pos - m_nVscrollPos; ! 600: break; ! 601: ! 602: default: ! 603: nScrollInc = 0; ! 604: break; ! 605: } ! 606: ! 607: nScrollInc = max( -m_nVscrollPos, ! 608: min( nScrollInc, m_nVscrollMax - m_nVscrollPos ) ); ! 609: ! 610: if (nScrollInc) { ! 611: CRect rt(0, 2*m_cyChar+1, m_cxClient, m_cyClient); ! 612: m_nVscrollPos += nScrollInc; ! 613: ScrollWindow( 0, -m_cyChar * nScrollInc, NULL, &rt ); ! 614: UpdateWindow(); ! 615: } ! 616: ! 617: return m_nVscrollPos; ! 618: } /* CListWndChild::OnVScroll() */ ! 619: ! 620: ! 621: afx_msg void CListWndChild::OnMouseMove(UINT nFlags, CPoint pt) ! 622: { ! 623: SetCursor(HCursorNormal); ! 624: ! 625: return; ! 626: } /* CListWndChild::OnMouseMove() */ ! 627: ! 628: ! 629: /*********************************************************************/ ! 630: ! 631: BEGIN_MESSAGE_MAP(CListWndLeft, CWnd) ! 632: ON_WM_CREATE() ! 633: ON_WM_DESTROY() ! 634: ON_WM_HSCROLL() ! 635: ON_WM_MOUSEMOVE() ! 636: ON_WM_PAINT() ! 637: ON_WM_SIZE() ! 638: END_MESSAGE_MAP() ! 639: ! 640: ! 641: void CListWndLeft::OnPaint() ! 642: { ! 643: CPaintDC dc(this); ! 644: CBrush b(RGB(255, 255, 255)); ! 645: ! 646: CRect area(0, 0, m_cxClient, m_cyClient); ! 647: ! 648: int nStart; ! 649: int nEnd; ! 650: ! 651: nStart = max(dc.m_ps.rcPaint.top, 2*m_cyChar); ! 652: nStart = m_nVscrollPos + (nStart / m_cyChar) - 2; ! 653: ! 654: nEnd = min( ListHead()->GetCount(), ! 655: (dc.m_ps.rcPaint.bottom - dc.m_ps.rcPaint.top) / m_cyChar + ! 656: nStart + 2); ! 657: ! 658: int x = -m_nHscrollPos; ! 659: int y; ! 660: int perCent; ! 661: int j; ! 662: CRect rt; ! 663: ! 664: dc.FillRect( area, &b); ! 665: ! 666: dc.SetTextAlign( TA_CENTER | TA_TOP ); ! 667: rt.SetRect(0, 0, m_cxClient, m_cyChar); ! 668: dc.ExtTextOut((m_cxClient-5)/2, 0, ETO_CLIPPED, &rt, "Name", 4, NULL); ! 669: ! 670: dc.SetTextAlign( TA_LEFT | TA_TOP ); ! 671: dc.SetBkMode(TRANSPARENT); ! 672: ! 673: /* ! 674: * Print out the data ! 675: */ ! 676: ! 677: CString szDisplay; ! 678: ListItem * pCur; ! 679: ! 680: for (y= (nStart - m_nVscrollPos + 2) * m_cyChar; ! 681: nStart < nEnd; nStart++, y += m_cyChar ) { ! 682: pCur = ListHead()->GetPosition( nStart, SortOrder()); ! 683: perCent = (int) pCur->Time().PerCent(ListHead()->TotalTime()); ! 684: ! 685: for (j=0; j<RangeStruct()->cRanges-1; j++) { ! 686: if ((RangeStruct()->Above[j] <= perCent) && ! 687: (perCent < RangeStruct()->Above[j+1])) { ! 688: break; ! 689: } ! 690: } ! 691: ! 692: CBrush bBack( RangeStruct()->BackColor[j] ); ! 693: ! 694: dc.SetTextColor( RangeStruct()->TextColor[j] * RGB(255, 255, 255)); ! 695: ! 696: area.top = y; ! 697: area.bottom = y + m_cyChar; ! 698: dc.FillRect( area, &bBack ); ! 699: ! 700: /* ! 701: * Print out the dll and function name ! 702: */ ! 703: ! 704: szDisplay = pCur->strModule() + " : " + pCur->strFunction(); ! 705: ! 706: dc.TextOut(x, y, szDisplay); ! 707: ! 708: } ! 709: ! 710: dc.MoveTo(0, 2*m_cyChar-1); dc.LineTo(m_cxClient, 2*m_cyChar-1); ! 711: dc.MoveTo(0, 2*m_cyChar); dc.LineTo(m_cxClient, 2*m_cyChar); ! 712: ! 713: return; ! 714: } /* CListWndLeft::OnPaint() */ ! 715: ! 716: ! 717: void CListWndLeft::ComputeWidths() ! 718: { ! 719: int i; ! 720: CRect rt; ! 721: CString str; ! 722: CClientDC cdc( this ); ! 723: CFont cFont; ! 724: CFont * lpcFont; ! 725: TEXTMETRIC tm; ! 726: int maxWidth = 0; ! 727: ! 728: cFont.CreateFontIndirect(LogFont()); ! 729: lpcFont = cdc.SelectObject(&cFont); ! 730: cdc.GetTextMetrics( &tm ); ! 731: ! 732: m_cxChar = tm.tmAveCharWidth; ! 733: m_cyChar = tm.tmHeight + tm.tmExternalLeading; ! 734: m_nVscrollPos = m_nHscrollPos = 0; ! 735: ! 736: ListItem * pCur; ! 737: ! 738: for (i=0; i<ListHead()->GetCount(); i++) { ! 739: pCur = ListHead()->GetPosition(i, SortOrder()); ! 740: str = pCur->strModule() + " : " + pCur->strFunction(); ! 741: ! 742: rt.SetRectEmpty(); ! 743: cdc.DrawText(str, -1, &rt, DT_CALCRECT); ! 744: maxWidth = max(maxWidth, rt.Width()+10); ! 745: } ! 746: ! 747: m_nHscrollMax = maxWidth; ! 748: SetScrollRange(SB_HORZ, 0, max(1, m_nHscrollMax - m_cxClient), TRUE); ! 749: ! 750: m_nVscrollMax = max(1, (int)(ListHead()->GetCount())-m_cyClient/m_cyChar); ! 751: ! 752: cdc.SelectObject(lpcFont); ! 753: Invalidate(TRUE); ! 754: ! 755: return; ! 756: } /* CListWndLeft::ComputeWidths() */ ! 757: ! 758: /*********************************************************************/ ! 759: ! 760: BEGIN_MESSAGE_MAP(CListWndRight, CWnd) ! 761: ON_WM_CREATE() ! 762: ON_WM_DESTROY() ! 763: ON_WM_HSCROLL() ! 764: ON_WM_MOUSEMOVE() ! 765: ON_WM_PAINT() ! 766: ON_WM_SIZE() ! 767: END_MESSAGE_MAP() ! 768: ! 769: ! 770: void CListWndRight::OnPaint() ! 771: { ! 772: CPaintDC dc(this); ! 773: CBrush b(RGB(255, 255, 255)); ! 774: CFont cFont; ! 775: CFont * lpcFont; ! 776: ! 777: CRect area(0, 0, m_cxClient, m_cyClient); ! 778: ! 779: dc.FillRect( area, &b); ! 780: ! 781: CRect rt; ! 782: char rgch[256]; ! 783: int perCent; ! 784: int perCentPer; ! 785: int perCentAll; ! 786: int perCentPerAll; ! 787: int j; ! 788: int i; ! 789: int x = -m_nHscrollPos; ! 790: int y; ! 791: ! 792: int nStart; ! 793: int nEnd; ! 794: ! 795: nStart = max(dc.m_ps.rcPaint.top, 2*m_cyChar); ! 796: nStart = m_nVscrollPos + (nStart / m_cyChar) - 2; ! 797: ! 798: nEnd = min( ListHead()->GetCount(), ! 799: (dc.m_ps.rcPaint.bottom - dc.m_ps.rcPaint.top) / m_cyChar + ! 800: nStart + 2); ! 801: ! 802: dc.FillRect(&dc.m_ps.rcPaint, &b); ! 803: ! 804: area.SetRect(0, 0, m_cxClient, 0); ! 805: dc.SetBkMode(TRANSPARENT); ! 806: ! 807: cFont.CreateFontIndirect(LogFont()); ! 808: lpcFont = dc.SelectObject(&cFont); ! 809: ! 810: area.bottom = 2*m_cyChar; ! 811: dc.FillRect( area, &b ); ! 812: dc.SetTextColor(0); ! 813: ! 814: /* ! 815: * Print out the titles for the List Window ! 816: */ ! 817: ! 818: dc.SetTextAlign( TA_CENTER | TA_TOP ); ! 819: ! 820: rt.SetRect(x, 0, x+rgl[0]-5, 2*m_cyChar); ! 821: dc.ExtTextOut(x+(rgl[0]-5)/2, 0, ETO_CLIPPED, &rt, "Num", 3, NULL); ! 822: dc.ExtTextOut(x+(rgl[0]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Calls", 5, NULL); ! 823: ! 824: rt.SetRect(x+rgl[0], 0, x+rgl[4]-5, 2*m_cyChar); ! 825: dc.ExtTextOut(x+(rgl[0]+rgl[4]-5)/2, 0, ETO_CLIPPED, &rt, "Function Only", 13, NULL); ! 826: ! 827: rt.SetRect(x+rgl[0], 0, x+rgl[2]-5, 2*m_cyChar); ! 828: dc.ExtTextOut(x+(rgl[0]+rgl[2]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Function", 8, NULL); ! 829: ! 830: rt.SetRect(x+rgl[2], 0, x+rgl[4]-5, 2*m_cyChar); ! 831: dc.ExtTextOut(x+(rgl[2]+rgl[4]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Per Call", 8, NULL); ! 832: ! 833: rt.SetRect(x+rgl[4], 0, x+rgl[6]-5, 2*m_cyChar); ! 834: dc.ExtTextOut(x+(rgl[4]+rgl[6]-5)/2, m_cyChar, ETO_CLIPPED, &rt, "Function", 8, NULL); ! 835: ! 836: rt.SetRect(x+rgl[4], 0, x+rgl[8], 2*m_cyChar); ! 837: dc.ExtTextOut(x+(rgl[4]+rgl[8])/2, 0, ETO_CLIPPED, &rt, "Function + Children", 19, NULL); ! 838: ! 839: rt.SetRect(x+rgl[6], 0, x+rgl[8], 2*m_cyChar); ! 840: dc.ExtTextOut(x+(rgl[6]+rgl[8])/2, m_cyChar, ETO_CLIPPED, &rt, "Per Call", 8, NULL); ! 841: ! 842: dc.SetTextAlign( TA_RIGHT | TA_TOP ); ! 843: ! 844: ! 845: /* ! 846: * Now print out the actual data items ! 847: */ ! 848: ! 849: CString szDisplay; ! 850: ListItem * pCur; ! 851: ! 852: for ( y= (nStart - m_nVscrollPos + 2)*m_cyChar; ! 853: nStart < nEnd; ! 854: nStart++, y += m_cyChar ) { ! 855: pCur = ListHead()->GetPosition( nStart, SortOrder() ); ! 856: perCent = (int) pCur->Time().PerCent(ListHead()->TotalTime()); ! 857: perCentPer = (int) pCur->TimePerCall().PerCent(ListHead()->TotalTime()); ! 858: perCentAll = (int) pCur->TimeAll().PerCent(ListHead()->TotalTime()); ! 859: perCentPerAll = (int) pCur->TimeAllPerCall().PerCent(ListHead()->TotalTime()); ! 860: ! 861: for (j=0; j<RangeStruct()->cRanges-1; j++) { ! 862: if ((RangeStruct()->Above[j] <= perCent) && ! 863: (perCent < RangeStruct()->Above[j+1])) { ! 864: break; ! 865: } ! 866: } ! 867: ! 868: CBrush bBack( RangeStruct()->BackColor[j] ); ! 869: ! 870: dc.SetTextColor( RangeStruct()->TextColor[j] * RGB(255, 255, 255)); ! 871: ! 872: area.top = y; ! 873: area.bottom = y + m_cyChar; ! 874: dc.FillRect( area, &bBack ); ! 875: ! 876: /* ! 877: * Now print the number of calls ! 878: */ ! 879: ! 880: sprintf(rgch, "%d", pCur->Calls()); ! 881: rt.SetRect(x, y, x+x+rgl[0]-5, y+m_cyChar); ! 882: dc.ExtTextOut(x+rgl[0]-5, y, ETO_CLIPPED, &rt, ! 883: rgch, strlen(rgch), NULL); ! 884: ! 885: /* ! 886: * ! 887: */ ! 888: ! 889: pCur->Time().format(rgch); ! 890: rt.SetRect(x+rgl[0], y, x+rgl[1]-5, y+m_cyChar); ! 891: dc.ExtTextOut(x+rgl[1]-5, y, ETO_CLIPPED, &rt, ! 892: rgch, strlen(rgch), NULL); ! 893: ! 894: sprintf(rgch, "%d%%", perCent); ! 895: rt.SetRect(x+rgl[1], y, x+rgl[2]-5, y+m_cyChar); ! 896: dc.ExtTextOut(x+rgl[2]-5, y, ETO_CLIPPED, &rt, ! 897: rgch, strlen(rgch), NULL); ! 898: ! 899: pCur->TimePerCall().format(rgch); ! 900: rt.SetRect(x+rgl[2], y, x+rgl[3]-5, y+m_cyChar); ! 901: dc.ExtTextOut(x+rgl[3]-5, y, ETO_CLIPPED, &rt, ! 902: rgch, strlen(rgch), NULL); ! 903: ! 904: sprintf(rgch, "%d%%", perCentPer); ! 905: rt.SetRect(x+rgl[3], y, x+rgl[4]-5, y+m_cyChar); ! 906: dc.ExtTextOut(x+rgl[4]-5, y, ETO_CLIPPED, &rt, ! 907: rgch, strlen(rgch), NULL); ! 908: ! 909: pCur->TimeAll().format(rgch); ! 910: rt.SetRect(x+rgl[4], y, x+rgl[5]-5, y+m_cyChar); ! 911: dc.ExtTextOut(x+rgl[5]-5, y, ETO_CLIPPED, &rt, ! 912: rgch, strlen(rgch), NULL); ! 913: ! 914: sprintf(rgch, "%d%%", perCentAll); ! 915: rt.SetRect(x+rgl[5], y, x+rgl[6]-5, y+m_cyChar); ! 916: dc.ExtTextOut(x+rgl[6]-5, y, ETO_CLIPPED, &rt, ! 917: rgch, strlen(rgch), NULL); ! 918: ! 919: pCur->TimeAllPerCall().format(rgch); ! 920: rt.SetRect(x+rgl[6], y, x+rgl[7]-5, y+m_cyChar); ! 921: dc.ExtTextOut(x+rgl[7]-5, y, ETO_CLIPPED, &rt, ! 922: rgch, strlen(rgch), NULL); ! 923: ! 924: sprintf(rgch, "%d%%", perCentPerAll); ! 925: rt.SetRect(x+rgl[7], y, x+rgl[8]-5, y+m_cyChar); ! 926: dc.ExtTextOut(x+rgl[8]-5, y, ETO_CLIPPED, &rt, ! 927: rgch, strlen(rgch), NULL); ! 928: } ! 929: ! 930: /* ! 931: * Now lets draw in the funny lines which make things look better ! 932: */ ! 933: ! 934: for (i=0; i<8; i++) { ! 935: if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) { ! 936: y = 2*m_cyChar; ! 937: } else if ((i == 2) || (i == 6)) { ! 938: y = m_cyChar; ! 939: } else { ! 940: y = 0; ! 941: } ! 942: dc.MoveTo(x+rgl[i]-3, y); dc.LineTo(x+rgl[i]-3, m_cyClient); ! 943: dc.MoveTo(x+rgl[i]-2, y); dc.LineTo(x+rgl[i]-2, m_cyClient); ! 944: dc.MoveTo(x+rgl[i]-1, y); dc.LineTo(x+rgl[i]-1, m_cyClient); ! 945: } ! 946: ! 947: dc.MoveTo(x+rgl[0], m_cyChar-1); dc.LineTo(m_cxClient, m_cyChar-1); ! 948: dc.MoveTo(x+rgl[0], m_cyChar); dc.LineTo(m_cxClient, m_cyChar); ! 949: dc.MoveTo(x+rgl[0], m_cyChar+1); dc.LineTo(m_cxClient, m_cyChar+1); ! 950: ! 951: dc.MoveTo(0, 2*m_cyChar-1); dc.LineTo(m_cxClient, 2*m_cyChar-1); ! 952: dc.MoveTo(0, 2*m_cyChar); dc.LineTo(m_cxClient, 2*m_cyChar); ! 953: ! 954: dc.SelectObject(lpcFont); ! 955: return; ! 956: } /* CListWndRight::OnPaint() */ ! 957: ! 958: void CListWndRight::ComputeWidths() ! 959: { ! 960: int i; ! 961: char rgch[100]; ! 962: CRect rt; ! 963: CClientDC cdc( this ); ! 964: CFont cFont; ! 965: CFont * lpcFont; ! 966: TEXTMETRIC tm; ! 967: ! 968: int perCent; ! 969: int perCentPer; ! 970: int perCentAll; ! 971: int perCentPerAll; ! 972: ! 973: cFont.CreateFontIndirect(LogFont()); ! 974: lpcFont = cdc.SelectObject(&cFont); ! 975: cdc.GetTextMetrics( &tm ); ! 976: ! 977: m_cxChar = tm.tmAveCharWidth; ! 978: m_cyChar = tm.tmHeight + tm.tmExternalLeading; ! 979: m_nVscrollPos = m_nHscrollPos = 0; ! 980: ! 981: ListItem * pCur; ! 982: CString szDisplay; ! 983: ! 984: for (i=0; i<9; i++) { ! 985: rgl[i] = 0; ! 986: } ! 987: ! 988: ! 989: for (i=0; i<ListHead()->GetCount(); i++) { ! 990: pCur = ListHead()->GetPosition(i, SortOrder()); ! 991: ! 992: perCent = (int) pCur->Time().PerCent(ListHead()->TotalTime()); ! 993: perCentPer = (int) pCur->TimePerCall().PerCent(ListHead()->TotalTime()); ! 994: perCentAll = (int) pCur->TimeAll().PerCent(ListHead()->TotalTime()); ! 995: perCentPerAll = (int) pCur->TimeAllPerCall().PerCent(ListHead()->TotalTime()); ! 996: ! 997: ! 998: /* ! 999: * Width of # calls ! 1000: */ ! 1001: ! 1002: sprintf(rgch, "%d", pCur->Calls()); ! 1003: rt.SetRectEmpty(); ! 1004: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1005: rgl[0] = max(rgl[0], rt.Width()+10); ! 1006: ! 1007: /* ! 1008: * ! 1009: */ ! 1010: ! 1011: pCur->Time().format(rgch); ! 1012: rt.SetRectEmpty(); ! 1013: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1014: rgl[1] = max(rgl[1], rt.Width()+10); ! 1015: ! 1016: sprintf(rgch, "%d%%", perCent); ! 1017: rt.SetRectEmpty(); ! 1018: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1019: rgl[2] = max(rgl[2], rt.Width()+10); ! 1020: ! 1021: pCur->TimePerCall().format(rgch); ! 1022: rt.SetRectEmpty(); ! 1023: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1024: rgl[3] = max(rgl[3], rt.Width()+10); ! 1025: ! 1026: sprintf(rgch, "%d%%", perCentPer); ! 1027: rt.SetRectEmpty(); ! 1028: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1029: rgl[4] = max(rgl[4], rt.Width()+10); ! 1030: ! 1031: pCur->TimeAll().format(rgch); ! 1032: rt.SetRectEmpty(); ! 1033: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1034: rgl[5] = max(rgl[5], rt.Width()+10); ! 1035: ! 1036: sprintf(rgch, "%d%%", perCentAll); ! 1037: rt.SetRectEmpty(); ! 1038: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1039: rgl[6] = max(rgl[6], rt.Width()+10); ! 1040: ! 1041: pCur->TimeAllPerCall().format(rgch); ! 1042: rt.SetRectEmpty(); ! 1043: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1044: rgl[7] = max(rgl[7], rt.Width()+10); ! 1045: ! 1046: sprintf(rgch, "%d%%", perCentPerAll); ! 1047: rt.SetRectEmpty(); ! 1048: cdc.DrawText(rgch, -1, &rt, DT_CALCRECT); ! 1049: rgl[8] = max(rgl[8], rt.Width()+10); ! 1050: } ! 1051: ! 1052: for (i=1; i<9; i++) { ! 1053: rgl[i] += rgl[i-1]; ! 1054: } ! 1055: ! 1056: m_nHscrollMax = rgl[8]; ! 1057: SetScrollRange(SB_HORZ, 0, max(1, m_nHscrollMax), TRUE); ! 1058: ! 1059: m_nVscrollMax = max(1, (int)(ListHead()->GetCount())-m_cyClient/m_cyChar); ! 1060: ! 1061: cdc.SelectObject(lpcFont); ! 1062: Invalidate(TRUE); ! 1063: ! 1064: return; ! 1065: } /* CListWndRight::ComputeWidths() */ ! 1066: ! 1067: ! 1068: #if 0 ! 1069: afx_msg void CListWndRight::OnMouseMove(UINT nFlags, CPoint pt) ! 1070: { ! 1071: int i; ! 1072: BOOL f = FALSE; ! 1073: ! 1074: // if (!fCapture) { ! 1075: ! 1076: SetCursor(HCursorNormal); ! 1077: ! 1078: // } else { ! 1079: // CClientDC dc(this); ! 1080: // int x = min(max(pt.x, rgl[iCapture-1]+10), ! 1081: // rgl[iCapture+1]-10); ! 1082: // ! 1083: // dc.InvertRect(&rtCapture); ! 1084: // rtCapture.SetRect(x-1, 0, x+1, m_cyClient); ! 1085: // dc.InvertRect(&rtCapture); ! 1086: // } ! 1087: } /* CListWndRight::OnMouseMove() */ ! 1088: ! 1089: ! 1090: afx_msg void CListWnd::OnLButtonDown(UINT nFlags, CPoint pt) ! 1091: { ! 1092: BOOL f = FALSE; ! 1093: int i; ! 1094: ! 1095: for (i=1; i<10; i++) { ! 1096: if ((rgl[i]-5 < pt.x) && (pt.x < rgl[i])) { ! 1097: f = TRUE; ! 1098: break; ! 1099: } ! 1100: } ! 1101: ! 1102: if (f) { ! 1103: CClientDC dc(this); ! 1104: fCapture = TRUE; ! 1105: iCapture = i; ! 1106: SetCapture(); ! 1107: rtCapture.SetRect(pt.x-1, 0, pt.x+1, m_cyClient); ! 1108: dc.InvertRect(&rtCapture); ! 1109: } else { ! 1110: CWnd::OnLButtonDown(nFlags, pt); ! 1111: } ! 1112: } /* CListWnd::OnLButtonDown() */ ! 1113: ! 1114: afx_msg void CListWnd::OnLButtonUp(UINT nFlags, CPoint pt) ! 1115: { ! 1116: if (fCapture) { ! 1117: ReleaseCapture(); ! 1118: fCapture = FALSE; ! 1119: rgl[iCapture] = min(max(pt.x, rgl[iCapture-1]+10), rgl[iCapture+1]-10); ! 1120: Invalidate(TRUE); ! 1121: } else { ! 1122: CWnd::OnLButtonUp(nFlags, pt); ! 1123: } ! 1124: } /* CListWnd::OnLButtonDown() */ ! 1125: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.