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