/************************************************************************* ** ** OLE 2.0 Sample Code ** ** status.c ** ** This file contains the window handlers, and various initialization ** and utility functions for an application status bar. ** ** (c) Copyright Microsoft Corp. 1992 - 1993 All Rights Reserved ** *************************************************************************/ // Application specific include files #include "outline.h" #include "message.h" #include "status.h" // Current status message. static LPSTR lpszStatusMessage = NULL; // Window proc for status window. LRESULT FAR PASCAL StatusWndProc (HWND hwnd, unsigned message, WPARAM wParam, LPARAM lParam); // List of all constant messages. static STATMESG ControlList[2] = { { STATUS_READY, "Ready." }, { STATUS_BLANK, " " } }; // List of all system menu messages. static STATMESG SysMenuList[16] = { { SC_SIZE, "Change the size of the window." }, { SC_MOVE, "Move the window." }, { SC_MINIMIZE, "Make the window iconic." }, { SC_MAXIMIZE, "Make the window the size of the screen." }, { SC_NEXTWINDOW, "Activate the next window." }, { SC_PREVWINDOW, "Activate the previous window." }, { SC_CLOSE, "Close this window." }, { SC_VSCROLL, "Vertical scroll?" }, { SC_HSCROLL, "Horizontal scroll?" }, { SC_MOUSEMENU, "A menu for mice." }, { SC_KEYMENU, "A menu for keys (I guess)." }, { SC_ARRANGE, "Arrange something." }, { SC_RESTORE, "Make the window noramally sized." }, { SC_TASKLIST, "Put up the task list dialog." }, { SC_SCREENSAVE, "Save the screen! Run for your life!" }, { SC_HOTKEY, "Boy, is this key hot!" } }; // Message type for popup messages. typedef struct { HMENU hmenu; char string[MAX_MESSAGE]; } STATPOPUP; // List of all popup messages. static STATPOPUP PopupList[NUM_POPUP]; static UINT nCurrentPopup = 0; /* RegisterStatusClass * ------------------- * * Creates classes for status window. * * HINSTANCE hInstance * * RETURNS: TRUE if class successfully registered. * FALSE otherwise. * * CUSTOMIZATION: Change class name. * */ BOOL RegisterStatusClass(HINSTANCE hInstance) { WNDCLASS wc; wc.lpszClassName = "ObjStatus"; wc.lpfnWndProc = StatusWndProc; wc.style = 0; wc.hInstance = hInstance; wc.hIcon = NULL; wc.cbClsExtra = 4; wc.cbWndExtra = 0; wc.lpszMenuName = NULL; wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = GetStockObject(LTGRAY_BRUSH); if (!RegisterClass(&wc)) return FALSE; return TRUE; } /* CreateStatusWindow * ------------------ * * Creates status window. * * HWND hwndMain * * RETURNS: HWND of status window if creation is successful. * NULL otherwise. * * CUSTOMIZATION: Change class name. * */ HWND CreateStatusWindow(HWND hWndApp, HINSTANCE hInst) { RECT rect; int width, height; HWND hWndStatusBar; lpszStatusMessage = ControlList[0].string; GetClientRect(hWndApp, &rect); width = rect.right - rect.left; height = rect.bottom - rect.top; hWndStatusBar = CreateWindow ( "ObjStatus", "SvrStatus", WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE, 0, height - STATUS_HEIGHT, width, STATUS_HEIGHT, hWndApp, NULL, hInst, NULL ); return hWndStatusBar; } /* DestroyStatusWindow * ------------------- * * Destroys status window. * * CUSTOMIZATION: None. * */ void DestroyStatusWindow(HWND hWndStatusBar) { DestroyWindow(hWndStatusBar); } /* AssignPopupMessage * ------------------ * * Associates a string with a popup menu handle. * * HMENU hmenuPopup * char *szMessage * * CUSTOMIZATION: None. * */ void AssignPopupMessage(HMENU hmenuPopup, char *szMessage) { if (nCurrentPopup < NUM_POPUP) { PopupList[nCurrentPopup].hmenu = hmenuPopup; lstrcpy(PopupList[nCurrentPopup].string, szMessage); ++nCurrentPopup; } } /* SetStatusText * ------------- * * Show the message in the status line. */ void SetStatusText(HWND hWndStatusBar, LPSTR lpszMessage) { lpszStatusMessage = lpszMessage; InvalidateRect (hWndStatusBar, (LPRECT)NULL, TRUE); UpdateWindow (hWndStatusBar); } /* GetItemMessage * -------------- * * Retrieve the message associated with the given menu command item number. * * UINT wIDItem * LPVOID lpDoc * * CUSTOMIZATION: None. * */ void GetItemMessage(UINT wIDItem, LPSTR FAR* lplpszMessage) { UINT i; *lplpszMessage = ControlList[1].string; for (i = 0; i < NUM_STATS; ++i) { if (wIDItem == MesgList[i].wIDItem) { *lplpszMessage = MesgList[i].string; break; } } } /* GetPopupMessage * --------------- * * Retrieve the message associated with the given popup menu. * * HMENU hmenuPopup * LPVOID lpDoc * * CUSTOMIZATION: None. * */ void GetPopupMessage(HMENU hmenuPopup, LPSTR FAR* lplpszMessage) { UINT i; *lplpszMessage = ControlList[1].string; for (i = 0; i < nCurrentPopup; ++i) { if (hmenuPopup == PopupList[i].hmenu) { *lplpszMessage = PopupList[i].string; break; } } } /* GetSysMenuMessage * ----------------- * * Retrieves the messages to correspond to items on the system menu. * * * UINT wIDItem * LPVOID lpDoc * * CUSTOMIZATION: None. * */ void GetSysMenuMessage(UINT wIDItem, LPSTR FAR* lplpszMessage) { UINT i; *lplpszMessage = ControlList[1].string; for (i = 0; i < 16; ++i) { if (wIDItem == SysMenuList[i].wIDItem) { *lplpszMessage = SysMenuList[i].string; break; } } } /* GetControlMessage * ----------------- * * Retrieves the general system messages. * * * STATCONTROL scCommand * LPVOID lpDoc * * CUSTOMIZATION: Add new messages. * */ void GetControlMessage(STATCONTROL scCommand, LPSTR FAR* lplpszMessage) { UINT i; *lplpszMessage = ControlList[1].string; for (i = 0; i < 2; ++i) { if ((UINT)scCommand == ControlList[i].wIDItem) { *lplpszMessage = ControlList[i].string; break; } } } /* StatusWndProc * ------------- * * Message handler for the statusbar window. * * * CUSTOMIZATION: None * */ LRESULT FAR PASCAL StatusWndProc (HWND hwnd, unsigned message, WPARAM wParam, LPARAM lParam) { if (message == WM_PAINT) { RECT rc; HDC hdc; PAINTSTRUCT paintstruct; HPEN hpenOld; HPEN hpen; HFONT hfontOld; HFONT hfont; HPALETTE hpalOld = NULL; POINT point; BeginPaint (hwnd, &paintstruct); hdc = GetDC (hwnd); GetClientRect (hwnd, (LPRECT) &rc); hpenOld = SelectObject (hdc, GetStockObject (BLACK_PEN)); MoveToEx (hdc, 0, 0, &point); LineTo (hdc, rc.right, 0); SelectObject (hdc, GetStockObject (WHITE_PEN)); MoveToEx (hdc, STATUS_RRIGHT, STATUS_RTOP, &point); LineTo (hdc, STATUS_RRIGHT, STATUS_RBOTTOM); LineTo (hdc, STATUS_RLEFT-1, STATUS_RBOTTOM); hpen = CreatePen (PS_SOLID, 1, /* DKGRAY */ 0x00808080); SelectObject (hdc, hpen); MoveToEx (hdc, STATUS_RLEFT, STATUS_RBOTTOM-1, &point); LineTo (hdc, STATUS_RLEFT, STATUS_RTOP); LineTo (hdc, STATUS_RRIGHT, STATUS_RTOP); SetBkMode (hdc, TRANSPARENT); SetTextAlign (hdc, TA_LEFT | TA_TOP); hfont = CreateFont (STATUS_THEIGHT, 0, 0, 0, FW_NORMAL, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "MS Sans Serif"); hfontOld = SelectObject(hdc, hfont); TextOut (hdc, STATUS_TLEFT, STATUS_TTOP, lpszStatusMessage, lstrlen(lpszStatusMessage)); // Restore original objects SelectObject (hdc, hfontOld); SelectObject (hdc, hpenOld); DeleteObject (hpen); DeleteObject (hfont); ReleaseDC (hwnd, hdc); EndPaint (hwnd, &paintstruct); return 0; } else { return DefWindowProc(hwnd, message, wParam, lParam); } }