|
|
1.1 ! root 1: /*** ! 2: *statbar.cpp ! 3: * ! 4: * Copyright (C) 1992, Microsoft Corporation. All Rights Reserved. ! 5: * Information Contained Herein Is Proprietary and Confidential. ! 6: * ! 7: *Purpose: ! 8: * ! 9: *Implementation Notes: ! 10: * ! 11: *****************************************************************************/ ! 12: ! 13: #include <stdarg.h> ! 14: ! 15: #include <windows.h> ! 16: #include <ole2.h> ! 17: #include <dispatch.h> ! 18: #include <string.h> ! 19: ! 20: #include "statbar.h" ! 21: ! 22: ! 23: extern "C" long FAR PASCAL StatBarWndProc(HWND, UINT, WPARAM, LPARAM); ! 24: ! 25: ! 26: char FAR* CStatBar::m_szWndClass = "StatBarWndClass"; ! 27: ! 28: ! 29: CStatBar::CStatBar() ! 30: { ! 31: m_refs = 0; ! 32: ! 33: m_x = 0; ! 34: m_y = 0; ! 35: m_width = 0; ! 36: m_height = 0; ! 37: ! 38: m_bstrMsg = NULL; ! 39: ! 40: m_hfont = (HANDLE)0; ! 41: } ! 42: ! 43: CStatBar::~CStatBar() ! 44: { ! 45: SysFreeString(m_bstrMsg); ! 46: } ! 47: ! 48: ! 49: /*** ! 50: *PUBLIC CStatBar FAR* CStatBar::Create(HANDLE, HWND) ! 51: * ! 52: *Purpose: ! 53: * ! 54: *Entry: ! 55: * ! 56: *Exit: ! 57: * ! 58: ***********************************************************************/ ! 59: CStatBar FAR* ! 60: CStatBar::Create(HANDLE hinst, HWND hwndFrame) ! 61: { ! 62: CStatBar FAR* psb; ! 63: ! 64: psb = new FAR CStatBar(); ! 65: if(psb == NULL) ! 66: return NULL; ! 67: psb->AddRef(); ! 68: ! 69: if(!psb->Register(hinst)) ! 70: goto LFail; ! 71: ! 72: psb->m_hwnd = CreateWindow( ! 73: CStatBar::m_szWndClass, ! 74: NULL, ! 75: WS_CHILD | WS_CLIPSIBLINGS, ! 76: 0, 0, 0, 0, ! 77: hwndFrame, ! 78: 0, ! 79: hinst, ! 80: NULL); ! 81: ! 82: if(!psb->m_hwnd) ! 83: goto LFail; ! 84: ! 85: // Stash the newly created CStatBar* in the extra bytes of the ! 86: // associated window so we can get at the instance in the message ! 87: // proc. ! 88: // ! 89: // Note: we do not AddRef for this reference. We make sure that the ! 90: // window is destroyed when the refcnt goes to 0. ! 91: // ! 92: SetWindowLong(psb->m_hwnd, 0, (LONG)psb); ! 93: ! 94: return psb; ! 95: ! 96: LFail:; ! 97: delete psb; ! 98: return NULL; ! 99: } ! 100: ! 101: ! 102: //--------------------------------------------------------------------- ! 103: // IUnknown Methods ! 104: //--------------------------------------------------------------------- ! 105: ! 106: ! 107: STDMETHODIMP ! 108: CStatBar::QueryInterface(REFIID riid, void FAR* FAR* ppv) ! 109: { ! 110: if(riid == IID_IUnknown){ ! 111: *ppv = this; ! 112: AddRef(); ! 113: return NOERROR; ! 114: } ! 115: *ppv = (void FAR*)NULL; ! 116: return ResultFromScode(E_NOINTERFACE); ! 117: } ! 118: ! 119: ! 120: STDMETHODIMP_(ULONG) ! 121: CStatBar::AddRef(void) ! 122: { ! 123: return ++m_refs; ! 124: } ! 125: ! 126: ! 127: STDMETHODIMP_(ULONG) ! 128: CStatBar::Release(void) ! 129: { ! 130: if(--m_refs == 0){ ! 131: ! 132: // destroy the status bar window. ! 133: // ! 134: SendMessage(m_hwnd, WM_DESTROY, 0, 0L); ! 135: ! 136: delete this; ! 137: return 0; ! 138: } ! 139: ! 140: return m_refs; ! 141: } ! 142: ! 143: ! 144: //--------------------------------------------------------------------- ! 145: // Introduced Methods ! 146: //--------------------------------------------------------------------- ! 147: ! 148: ! 149: /*** ! 150: *PRIVATE BOOL CStatBar::Register(HANDLE) ! 151: * ! 152: *Purpose: ! 153: * Register the status bar window class. ! 154: * ! 155: *Entry: ! 156: * None ! 157: * ! 158: *Exit: ! 159: * return value = BOOL, TRUE if successful, FALSE if not. ! 160: * ! 161: ***********************************************************************/ ! 162: BOOL ! 163: CStatBar::Register(HANDLE hinst) ! 164: { ! 165: WNDCLASS wc; ! 166: ! 167: // register the class, unless already registered. ! 168: if(GetClassInfo(hinst, m_szWndClass, &wc) == 0){ ! 169: wc.style = 0; ! 170: wc.lpfnWndProc = StatBarWndProc; ! 171: wc.cbClsExtra = 0; ! 172: wc.cbWndExtra = sizeof(CStatBar FAR*); ! 173: wc.hInstance = hinst; ! 174: wc.hIcon = 0; ! 175: wc.hCursor = LoadCursor(NULL, IDC_ARROW); ! 176: wc.hbrBackground = GetStockObject(LTGRAY_BRUSH); ! 177: wc.lpszMenuName = 0; ! 178: wc.lpszClassName = CStatBar::m_szWndClass; ! 179: if(!RegisterClass(&wc)) ! 180: return FALSE; ! 181: } ! 182: return TRUE; ! 183: } ! 184: ! 185: ! 186: /*** ! 187: *PUBLIC void CStatBar::Show(void) ! 188: * ! 189: *Purpose: ! 190: * Show the status bar window associated with this CStatBar instance. ! 191: * ! 192: *Entry: ! 193: * None ! 194: * ! 195: *Exit: ! 196: * None ! 197: * ! 198: ***********************************************************************/ ! 199: void ! 200: CStatBar::Show() ! 201: { ! 202: ShowWindow(m_hwnd, SW_SHOW); ! 203: } ! 204: ! 205: void ! 206: CStatBar::SetFont(HFONT hfont) ! 207: { ! 208: HDC hdc; ! 209: TEXTMETRIC tm; ! 210: HFONT hfontOld; ! 211: ! 212: // compute the character sizes given this new font. ! 213: // ! 214: hdc = GetDC(m_hwnd); ! 215: hfontOld = SelectObject(hdc, hfont); ! 216: GetTextMetrics(hdc, &tm); ! 217: m_dxFont = tm.tmAveCharWidth; ! 218: m_dyFont = tm.tmHeight + tm.tmExternalLeading; ! 219: SelectObject(hdc, hfontOld); ! 220: ReleaseDC(m_hwnd, hdc); ! 221: ! 222: m_hfont = hfont; ! 223: } ! 224: ! 225: /*** ! 226: *PRIVATE CStatBar::WMPaint(void) ! 227: * ! 228: *Purpose: ! 229: * This method is responsible for drawing the status bar, and is called ! 230: * in response to a WM_PAINT message. ! 231: * ! 232: *Entry: ! 233: * None ! 234: * ! 235: *Exit: ! 236: * None ! 237: * ! 238: ***********************************************************************/ ! 239: void ! 240: CStatBar::WMPaint() ! 241: { ! 242: HDC hdc; ! 243: RECT rcMsg; ! 244: HRGN hrgn; ! 245: HFONT hfontOld; ! 246: PAINTSTRUCT ps; ! 247: HPEN hpenBlack, hpenWhite, hpenGray, hpenOld; ! 248: ! 249: hdc = BeginPaint(m_hwnd, &ps); ! 250: ! 251: // compute the message box rect ! 252: // ! 253: rcMsg.top = 3; ! 254: rcMsg.bottom= m_height - 3; ! 255: rcMsg.left = m_dxFont; ! 256: rcMsg.right = m_width - m_dxFont; ! 257: ! 258: // prepare the pens ! 259: // ! 260: hpenWhite = GetStockObject(WHITE_PEN); ! 261: hpenBlack = GetStockObject(BLACK_PEN); ! 262: hpenGray = CreatePen(PS_SOLID, 1, GetSysColor(COLOR_BTNSHADOW)); ! 263: ! 264: // draw a top gray line ! 265: // ! 266: hpenOld = SelectObject(hdc, hpenGray); ! 267: #if defined(WIN16) ! 268: MoveTo(hdc, ps.rcPaint.left, 0); ! 269: #elif defined(WIN32) ! 270: MoveToEx(hdc, ps.rcPaint.left, 0, NULL); ! 271: #endif ! 272: LineTo(hdc, ps.rcPaint.right, 0); ! 273: ! 274: // draw a white line just under ! 275: // ! 276: SelectObject(hdc, hpenWhite); ! 277: #if defined(WIN16) ! 278: MoveTo(hdc, ps.rcPaint.left, 1); ! 279: #elif defined(WIN32) ! 280: MoveToEx(hdc, ps.rcPaint.left, 1, NULL); ! 281: #endif ! 282: LineTo(hdc, ps.rcPaint.right, 1); ! 283: ! 284: // do not overwrite the background color ! 285: // ! 286: SetBkMode(hdc, TRANSPARENT); ! 287: ! 288: // message area ! 289: // ! 290: SelectObject(hdc, hpenBlack); ! 291: #if defined(WIN16) ! 292: MoveTo(hdc, rcMsg.left, rcMsg.bottom); ! 293: #elif defined(WIN32) ! 294: MoveToEx(hdc, rcMsg.left, rcMsg.bottom, NULL); ! 295: #endif ! 296: LineTo(hdc, rcMsg.left, rcMsg.top); ! 297: LineTo(hdc, rcMsg.right, rcMsg.top); ! 298: ! 299: SelectObject(hdc, hpenWhite); ! 300: LineTo(hdc, rcMsg.right, rcMsg.bottom); ! 301: LineTo(hdc, rcMsg.left, rcMsg.bottom); ! 302: ! 303: // select the black pen for writing ! 304: // ! 305: SelectObject(hdc, hpenBlack); ! 306: ! 307: // select the status bar font to write in ! 308: // ! 309: hfontOld = SelectObject(hdc, m_hfont); ! 310: ! 311: // set the clipping region ! 312: // ! 313: hrgn = CreateRectRgn( ! 314: rcMsg.left, rcMsg.top, rcMsg.right, rcMsg.bottom); ! 315: ! 316: SelectClipRgn(hdc, hrgn); ! 317: ! 318: // draw the status message ! 319: // ! 320: TextOut( ! 321: hdc, ! 322: rcMsg.left + (m_dxFont / 2), ! 323: rcMsg.top + ((rcMsg.bottom - rcMsg.top - m_dyFont) / 2), ! 324: m_bstrMsg, SysStringLen(m_bstrMsg)); ! 325: ! 326: // cleanup ! 327: // ! 328: SelectObject(hdc, hpenOld); ! 329: SelectObject(hdc, hfontOld); ! 330: ! 331: DeleteObject(hrgn); ! 332: DeleteObject(hpenGray); ! 333: ! 334: EndPaint(m_hwnd, &ps); ! 335: } ! 336: ! 337: extern "C" long FAR PASCAL ! 338: StatBarWndProc( ! 339: HWND hwnd, ! 340: UINT message, ! 341: WPARAM wParam, ! 342: LPARAM lParam) ! 343: { ! 344: CStatBar FAR* psb; ! 345: ! 346: switch(message){ ! 347: case WM_SIZE: ! 348: return 0; ! 349: case WM_PAINT: ! 350: psb = (CStatBar FAR*)GetWindowLong(hwnd, 0); ! 351: psb->WMPaint(); ! 352: return 0; ! 353: } ! 354: return(DefWindowProc(hwnd, message, wParam, lParam)); ! 355: } ! 356: ! 357: ! 358: //--------------------------------------------------------------------- ! 359: // Status Bar Utilities ! 360: //--------------------------------------------------------------------- ! 361: ! 362: extern "C" void ! 363: SBprintf(CStatBar FAR* psb, char FAR* szFmt, ...) ! 364: { ! 365: va_list args; ! 366: static char buf[256]; ! 367: ! 368: va_start(args, szFmt); ! 369: wvsprintf(buf, szFmt, args); ! 370: psb->SetText(buf); ! 371: psb->Update(); ! 372: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.