370 lines
7.9 KiB
C
370 lines
7.9 KiB
C
|
/*************************************************************************
|
||
|
**
|
||
|
** 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);
|
||
|
}
|
||
|
}
|