|
|
1.1 root 1: /*************************************************************************
2: **
3: ** OLE 2.0 Sample Code
4: **
5: ** status.c
6: **
7: ** This file contains the window handlers, and various initialization
8: ** and utility functions for an application status bar.
9: **
10: ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved
11: **
12: *************************************************************************/
13:
14: // Application specific include files
15: #include "outline.h"
16: #include "message.h"
17: #include "status.h"
18:
19: // Current status message.
20: static char *szStatusMessage = NULL;
21:
22: // Holder for string messages.
23: static char szMessageHold[MAX_MESSAGE];
24:
25: // Window proc for status window.
26: LRESULT FAR PASCAL StatusWndProc
27: (HWND hwnd, unsigned message, WPARAM wParam, LPARAM lParam);
28:
29: // List of all constant messages.
30: static STATMESG ControlList[2] =
31: {
32: { STATUS_READY, "Ready." },
33: { STATUS_BLANK, " " }
34: };
35:
36: // List of all system menu messages.
37: static STATMESG SysMenuList[16] =
38: {
39: { SC_SIZE, "Change the size of the window." },
40: { SC_MOVE, "Move the window." },
41: { SC_MINIMIZE, "Make the window iconic." },
42: { SC_MAXIMIZE, "Make the window the size of the screen." },
43: { SC_NEXTWINDOW, "Activate the next window." },
44: { SC_PREVWINDOW, "Activate the previous window." },
45: { SC_CLOSE, "Close this window." },
46: { SC_VSCROLL, "Vertical scroll?" },
47: { SC_HSCROLL, "Horizontal scroll?" },
48: { SC_MOUSEMENU, "A menu for mice." },
49: { SC_KEYMENU, "A menu for keys (I guess)." },
50: { SC_ARRANGE, "Arrange something." },
51: { SC_RESTORE, "Make the window noramally sized." },
52: { SC_TASKLIST, "Put up the task list dialog." },
53: { SC_SCREENSAVE, "Save the screen! Run for your life!" },
54: { SC_HOTKEY, "Boy, is this key hot!" }
55: };
56:
57: // Message type for popup messages.
58: typedef struct {
59: HMENU hmenu;
60: char string[MAX_MESSAGE];
61: } STATPOPUP;
62:
63: // List of all popup messages.
64: static STATPOPUP PopupList[NUM_POPUP];
65:
66: static UINT nCurrentPopup = 0;
67:
68:
69:
70: /* RegisterStatusClass
71: * -------------------
72: *
73: * Creates classes for status window.
74: *
75: * HINSTANCE hInstance
76: *
77: * RETURNS: TRUE if class successfully registered.
78: * FALSE otherwise.
79: *
80: * CUSTOMIZATION: Change class name.
81: *
82: */
83: BOOL RegisterStatusClass(HINSTANCE hInstance)
84: {
85: WNDCLASS wc;
86:
87: wc.lpszClassName = "ObjStatus";
88: wc.lpfnWndProc = StatusWndProc;
89: wc.style = 0;
90: wc.hInstance = hInstance;
91: wc.hIcon = NULL;
92: wc.cbClsExtra = 4;
93: wc.cbWndExtra = 0;
94: wc.lpszMenuName = NULL;
95: wc.hCursor = LoadCursor(NULL, IDC_ARROW);
96: wc.hbrBackground = GetStockObject(LTGRAY_BRUSH);
97:
98: if (!RegisterClass(&wc))
99: return FALSE;
100:
101: return TRUE;
102: }
103:
104:
105: /* CreateStatusWindow
106: * ------------------
107: *
108: * Creates status window.
109: *
110: * HWND hwndMain
111: *
112: * RETURNS: HWND of status window if creation is successful.
113: * NULL otherwise.
114: *
115: * CUSTOMIZATION: Change class name.
116: *
117: */
118: HWND CreateStatusWindow(HWND hWndApp, HINSTANCE hInst)
119: {
120: RECT rect;
121: int width, height;
122: HWND hWndStatusBar;
123:
124: szStatusMessage = ControlList[0].string;
125: GetClientRect(hWndApp, &rect);
126: width = rect.right - rect.left;
127: height = rect.bottom - rect.top;
128:
129: hWndStatusBar = CreateWindow (
130: "ObjStatus",
131: "SvrStatus",
132: WS_CHILD | WS_VISIBLE,
133: 0, height - STATUS_HEIGHT,
134: width,
135: STATUS_HEIGHT,
136: hWndApp,
137: NULL,
138: hInst,
139: NULL
140: );
141:
142: return hWndStatusBar;
143: }
144:
145:
146: /* DestroyStatusWindow
147: * -------------------
148: *
149: * Destroys status window.
150: *
151: * CUSTOMIZATION: None.
152: *
153: */
154: void DestroyStatusWindow(HWND hWndStatusBar)
155: {
156: DestroyWindow(hWndStatusBar);
157: }
158:
159:
160: /* AssignPopupMessage
161: * ------------------
162: *
163: * Associates a string with a popup menu handle.
164: *
165: * HMENU hmenuPopup
166: * char *szMessage
167: *
168: * CUSTOMIZATION: None.
169: *
170: */
171: void AssignPopupMessage(HMENU hmenuPopup, char *szMessage)
172: {
173: if (nCurrentPopup < NUM_POPUP) {
174: PopupList[nCurrentPopup].hmenu = hmenuPopup;
175: lstrcpy(PopupList[nCurrentPopup].string, szMessage);
176: ++nCurrentPopup;
177: }
178: }
179:
180: static void WriteStatusMessage(HWND hWndStatusBar, LPVOID lpDoc)
181: {
182: #if defined( INPLACE_LATER )
183: if (lpDoc && lpDoc->lpIpData != NULL) {
184: lpDoc->lpIpData->lpFrame->lpVtbl->SetStatusText
185: (lpDoc->lpIpData->lpFrame, szStatusMessage);
186: }
187: else
188: #endif
189: {
190: InvalidateRect (hWndStatusBar, (LPRECT)NULL, TRUE);
191: UpdateWindow (hWndStatusBar);
192: }
193: }
194:
195: /* ItemMessage
196: * -----------
197: *
198: * Prints message associated with the given item number.
199: *
200: * UINT wIDItem
201: * LPVOID lpDoc
202: *
203: * CUSTOMIZATION: None.
204: *
205: */
206: void ItemMessage(HWND hWndStatusBar, UINT wIDItem, LPVOID lpDoc)
207: {
208: UINT i;
209:
210: szStatusMessage = ControlList[1].string;
211: for (i = 0; i < NUM_STATS; ++i) {
212: if (wIDItem == MesgList[i].wIDItem) {
213: szStatusMessage = MesgList[i].string;
214: break;
215: }
216: }
217: WriteStatusMessage(hWndStatusBar, lpDoc);
218: }
219:
220:
221: /* PopupMessage
222: * ------------
223: *
224: * Prints message associated with the given popup menu.
225: *
226: * HMENU hmenuPopup
227: * LPVOID lpDoc
228: *
229: * CUSTOMIZATION: None.
230: *
231: */
232: void PopupMessage(HWND hWndStatusBar, HMENU hmenuPopup, LPVOID lpDoc)
233: {
234: UINT i;
235:
236: szStatusMessage = ControlList[1].string;
237: for (i = 0; i < nCurrentPopup; ++i) {
238: if (hmenuPopup == PopupList[i].hmenu) {
239: szStatusMessage = PopupList[i].string;
240: break;
241: }
242: }
243: WriteStatusMessage(hWndStatusBar, lpDoc);
244: }
245:
246:
247: /* SysMenuMessage
248: * --------------
249: *
250: * Prints messages to correspond to items on the system menu.
251: *
252: *
253: * UINT wIDItem
254: * LPVOID lpDoc
255: *
256: * CUSTOMIZATION: None.
257: *
258: */
259: void SysMenuMessage(HWND hWndStatusBar, UINT wIDItem, LPVOID lpDoc)
260: {
261: UINT i;
262:
263: szStatusMessage = ControlList[1].string;
264: for (i = 0; i < 16; ++i) {
265: if (wIDItem == SysMenuList[i].wIDItem) {
266: szStatusMessage = SysMenuList[i].string;
267: break;
268: }
269: }
270: WriteStatusMessage(hWndStatusBar, lpDoc);
271: }
272:
273:
274: /* ControlMessage
275: * --------------
276: *
277: * Prints general system messages.
278: *
279: *
280: * STATCONTROL scCommand
281: * LPVOID lpDoc
282: *
283: * CUSTOMIZATION: Add new messages.
284: *
285: */
286: void ControlMessage(HWND hWndStatusBar, STATCONTROL scCommand, LPVOID lpDoc)
287: {
288: UINT i;
289:
290: szStatusMessage = ControlList[1].string;
291: for (i = 0; i < 2; ++i) {
292: if ((UINT)scCommand == ControlList[i].wIDItem) {
293: szStatusMessage = ControlList[i].string;
294: break;
295: }
296: }
297: WriteStatusMessage(hWndStatusBar, lpDoc);
298: }
299:
300:
301: /* StringMessage
302: * -------------
303: *
304: * Prints messages specially sent by the application.
305: *
306: * char *szMessage
307: * LPVOID lpDoc
308: *
309: * CUSTOMIZATION: Add new messages.
310: *
311: */
312: void StringMessage(HWND hWndStatusBar, char *szMessage, LPVOID lpDoc)
313: {
314: lstrcpy(szMessageHold, szMessage);
315: szStatusMessage = szMessageHold;
316: WriteStatusMessage(hWndStatusBar, lpDoc);
317: }
318:
319:
320:
321: /* StatusWndProc
322: * -------------
323: *
324: * Message handler for the statusbar window.
325: *
326: *
327: * CUSTOMIZATION: None
328: *
329: */
330: LRESULT FAR PASCAL StatusWndProc
331: (HWND hwnd, unsigned message, WPARAM wParam, LPARAM lParam)
332: {
333: if (message == WM_PAINT) {
334: RECT rc;
335: HDC hdc;
336: PAINTSTRUCT paintstruct;
337: HPEN hpenOld;
338: HPEN hpen;
339: HFONT hfontOld;
340: HFONT hfont;
341: HPALETTE hpalOld = NULL;
342: POINT point;
343:
344: BeginPaint (hwnd, &paintstruct);
345: hdc = GetDC (hwnd);
346:
347: GetClientRect (hwnd, (LPRECT) &rc);
348:
349: hpenOld = SelectObject (hdc, GetStockObject (BLACK_PEN));
350:
351: MoveToEx (hdc, 0, 0, &point);
352: LineTo (hdc, rc.right, 0);
353:
354: SelectObject (hdc, GetStockObject (WHITE_PEN));
355:
356: MoveToEx (hdc, STATUS_RRIGHT, STATUS_RTOP, &point);
357: LineTo (hdc, STATUS_RRIGHT, STATUS_RBOTTOM);
358: LineTo (hdc, STATUS_RLEFT-1, STATUS_RBOTTOM);
359:
360: hpen = CreatePen (PS_SOLID, 1, /* DKGRAY */ 0x00808080);
361: SelectObject (hdc, hpen);
362:
363: MoveToEx (hdc, STATUS_RLEFT, STATUS_RBOTTOM-1, &point);
364: LineTo (hdc, STATUS_RLEFT, STATUS_RTOP);
365: LineTo (hdc, STATUS_RRIGHT, STATUS_RTOP);
366:
367: SetBkMode (hdc, TRANSPARENT);
368: SetTextAlign (hdc, TA_LEFT | TA_TOP);
369: hfont = CreateFont (STATUS_THEIGHT, 0, 0, 0, FW_NORMAL, FALSE, FALSE,
370: FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS,
371: CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
372: DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif");
373:
374: hfontOld = SelectObject(hdc, hfont);
375:
376: TextOut (hdc, STATUS_TLEFT, STATUS_TTOP,
377: szStatusMessage,
378: lstrlen(szStatusMessage));
379:
380: // Restore original objects
381: SelectObject (hdc, hfontOld);
382: SelectObject (hdc, hpenOld);
383: DeleteObject (hpen);
384: DeleteObject (hfont);
385:
386: ReleaseDC (hwnd, hdc);
387: EndPaint (hwnd, &paintstruct);
388:
389: return 0;
390: }
391: else {
392: return DefWindowProc(hwnd, message, wParam, lParam);
393: }
394: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.