STATBAR.C

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright 1995 - 1998 Microsoft Corporation. All Rights Reserved.
//
// MODULE: statbar.c
//
// PURPOSE: Handles general routines for the TapiComm sample.
//
// FUNCTIONS:
// MsgTimer - Handles the WM_TIMER messages to set the time on
// the status bar.
// MsgMouseMove - Handles the WM_MOUSEMOVE to display the cursor position.
// MsgMenuSelect - Handle the WM_MENUSELECT message. This message will
// enable the status bar control to update when the user
// moves across menu items on the main window.
// InitializeStatusBar - Sets the pane positions in the statusbar control
// CreateSBar - Calls CreateStatusWindow() to create the status bar
// UpdateStatusBar - Updates the statusbar control with appropriate text
//

#include <windows.h> // required for all Windows applications
#include <windowsx.h>
#include <commctrl.h> // prototypes and defs for common controls
#include "globals.h" // prototypes specific to this application
#include "statbar.h" // prototypes specific to statbar.c


// Global Variables for the status bar control.

HWND hWndStatusbar;

// **TODO** Add entries to the string table in TapiComm.rc for each menu
// command. MsgMenuSelect (below) loads these strings to display
// information in the status bar. MsgMenuSelect assumes that the
// string ID is the same as the command ID and that a string
// exists for every command.
//
// The following array contains resource string ID's for popup menus
// in the main application menu. This array is used by MsgMenuSelect
// to display information in the status bar.
//
// **TODO** Add entries to this array for each popup menu in the same
// positions as they appear in the main menu. Remember to define
// the ID's in globals.h and add the strings to TapiComm.rc.

UINT idPopup[] =
{
IDS_FILEMENU,
IDS_EDITMENU,
IDS_HELPMENU,
};



//
// FUNCTION: MsgMenuSelect(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Upadates menu selections on the staus bar.
//
//
// PARAMETERS:
//
// hwnd - Window handle (Used)
// uMessage - Message number (Used)
// wparam - Extra data (Used)
// lparam - Extra data (Used)
//
// RETURN VALUE:
//
// Always returns 0 - Message handled
//
// COMMENTS:
// This message is sent when the user selects menu items by
// by pulling down a popup menu move the mouse around to highlite
// different menu items.
//
//

#define MENUHACK 1 // Menu Select message has a bug..so workaround

LRESULT MsgMenuSelect(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
{
static char szBuffer[128];
UINT nStringID = 0;
UINT fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff;
UINT uCmd = GET_WM_MENUSELECT_CMD(wparam, lparam);
HMENU hMenu = GET_WM_MENUSELECT_HMENU(wparam, lparam);


szBuffer[0] = 0; // First reset the buffer


if (fuFlags == 0xffff && hMenu == NULL) // Menu has been closed
nStringID = IDS_DESCRIPTION;

else if (fuFlags & MFT_SEPARATOR) // Ignore separators
nStringID = 0;

else if (fuFlags & MF_POPUP) // Popup menu
{
#ifdef MENUHACK // This code shouldn't be necessary...
UINT i;
for (i = 0; i < sizeof(idPopup)/sizeof(idPopup[0]); i++)
{
if(GetSubMenu(hMenu, i) == (HMENU)uCmd)
{
uCmd = i;
break;
}
}
#endif
if (fuFlags & MF_SYSMENU) // System menu
nStringID = IDS_SYSMENU;

else
// Get string ID for popup menu from idPopup array.
nStringID = ((uCmd < sizeof(idPopup)/sizeof(idPopup[0])) ?
idPopup[uCmd] : 0);
} // for MF_POPUP

else // Must be a command item
nStringID = uCmd; // String ID == Command ID

// Load the string if we have an ID
if (0 != nStringID)
LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer));

// Finally... send the string to the status bar
UpdateStatusBar(szBuffer, 0, 0);

return 0;
}


//
// FUNCTION: InitializeStatusBar(HWND)
//
// PURPOSE: Initialize statusbar control with time and mouse positions.
//
//
// PARAMETERS:
//
// hwndParent - Window handle of the status bar's parent
//
//
// RETURN VALUE: NONE
//
//
// COMMENTS:
//
// This function initializes the time and mouse positions sections of
// the statubar window. The Date for the time section is obtained by
// calling SetTimer API. When the timer messages start comming in,
// GetSytemTime() to fill the time section.
// The WPARAM of SB_SETTEXT is divided into 2 parameters. The LOWORD
// determines which section/part the text goes into, and the HIWORD
// tells how the bar is drawn (popin or popout).
//

void InitializeStatusBar(HWND hwndParent)
{
const cSpaceInBetween = 8;
int ptArray[2]; // Array defining the number of parts/sections
SIZE size = {0,0}; // the Status bar will display.
RECT rect;
HDC hDC;

/*
* Fill in the ptArray...
*/

hDC = GetDC(hwndParent);
GetClientRect(hwndParent, &rect);
ReleaseDC(hwndParent, hDC);

ptArray[0] = (rect.right) / 2;
ptArray[1] = rect.right;

SendMessage(hWndStatusbar,
SB_SETPARTS,
sizeof(ptArray)/sizeof(ptArray[0]),
(LPARAM)(LPINT)ptArray);

UpdateStatusBar(SZDESCRIPTION, 0, 0);
}


//
// FUNCTION: CreateSBar(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Calls CreateStatusWindow() to create the status bar
//
//
// PARAMETERS:
//
// hwndParent - Window handle of the status bar's parent
//
// RETURN VALUE:
//
// If both controls were created successfully Return TRUE,
// else returns FALSE.
//
// COMMENTS:
//
//

BOOL CreateSBar(HWND hwndParent)
{
hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER,
SZDESCRIPTION,
hwndParent,
IDM_STATUSBAR);
if(hWndStatusbar)
{
InitializeStatusBar(hwndParent);
return TRUE;
}

return FALSE;
}


//
// FUNCTION: UpdateStatusBar(HWND)
//
// PURPOSE: Updates the statusbar control with appropriate text
//
//
// PARAMETERS:
//
// lpszStatusString - text to be displayed
// partNumber - which part of the status bar to display text in
// displayFlags - display flags
//
//
// RETURN VALUE: NONE
//
//
// COMMENTS:
// None
//
//

void UpdateStatusBar(LPSTR lpszStatusString, WORD partNumber, WORD displayFlags)
{
SendMessage(hWndStatusbar,
SB_SETTEXT,
partNumber | displayFlags,
(LPARAM)lpszStatusString);
}