home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CICA 1992 November
/
CICA_MS_Windows_CD-ROM_Walnut_Creek_November_1992.iso
/
win3
/
programr
/
blandmdi
/
blandmdi.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-05-03
|
8KB
|
287 lines
/*
*
* PROGRAM : BlandMDI.c
*
* PURPOSE : Show example of a minimal MDI application
*
* FUNCTIONS:
*
* WinMain() - Calls the initialization function
* and processes message loop
*
* BlandFrameWndProc() - Window function for the "frame"
* window, which controls the menu
* and contains the MDI client window
*
* BlandMDIChildWndProc()- Window function for the individual
* child windows
*
* CloseAllChildren - Destroys all MDI child windows.
*
* CommandHandler() - Processes the "frame" window's
* WM_COMMAND messages.
*
* Copyright 1991 Microsoft Corporation. All rights reserved.
*/
/*-------------------- #includes -------------------------------*/
#include "blandmdi.h"
/*-------------------- global variables -------------------------*/
// global variables used in this module or among more than one module
HANDLE hInst; // Program instance handle
HWND hwndFrame = NULL; // Handle to main window
HWND hwndMDIClient = NULL; // Handle to MDI client
LONG styleDefault = 0; // Default style bits for child windows
/*--------------------- function prototypes -----------------------*/
// Forward declarations of helper functions in this module
VOID NEAR PASCAL CommandHandler (HWND,WORD);
VOID NEAR PASCAL CloseAllChildren(VOID);
/*--------------- BlandFrameWndProc() -------------------------------*/
/*
*
* FUNCTION : BlandFrameWndProc (hwnd, msg, wParam, lParam )
*
* PURPOSE : The window function for the "frame" window, which controls
* the menu and encompasses all the MDI child windows. Does
* the major part of the message processing. Specifically, in
* response to:
*
* WM_CREATE : Creates and displays the "frame".
*
* WM_COMMAND: Passes control to a command-handling function.
*
* WM_CLOSE : Quits the app.
*
* WM_DESTROY: Destroys frame window and quits app.
*
* NOTE: If cases are added for WM_MENUCHAR, WM_NEXTMENU, WM_SETFOCUS,
* and WM_SIZE, note that these messages should be passed on
* to DefFrameProc even if we handle them. See the SDK Reference
* entry for DefFrameProc
*/
LONG FAR PASCAL BlandFrameWndProc ( hwnd, msg, wParam, lParam )
register HWND hwnd;
WORD msg;
register WORD wParam;
LONG lParam;
{
switch (msg)
{
case WM_CREATE:
{
CLIENTCREATESTRUCT ccs;
// Find window menu where children will be listed
ccs.hWindowMenu = GetSubMenu (GetMenu(hwnd),WINDOWMENU);
ccs.idFirstChild = IDM_WINDOWCHILD;
// Create the MDI client
hwndMDIClient = CreateWindow ("mdiclient",
NULL,
WS_CHILD | WS_CLIPCHILDREN,
0,
0,
0,
0,
hwnd,
0,
hInst,
(LPSTR)&ccs);
ShowWindow (hwndMDIClient,SW_SHOW);
break;
}
case WM_COMMAND:
// Direct all menu selection or accelerator commands to
// the CommandHandler function
CommandHandler (hwnd,wParam);
break;
case WM_CLOSE:
DestroyWindow (hwnd);
break;
case WM_DESTROY:
PostQuitMessage (0);
break;
default:
// use DefFrameProc() instead of DefWindowProc(), since there
// are things that have to be handled differently because of MDI
return DefFrameProc (hwnd,hwndMDIClient,msg,wParam,lParam);
}
return 0;
}
/*--------------------BlandMDIChildWndProc ----------------------*/
/*
*
* FUNCTION: BlandMDIChildWndProc ( hwnd, msg, wParam, lParam )
*
* NOTE: If cases are added for WM_CHILDACTIVATE, WM_GETMINMAXINFO,
* WM_MENUCHAR, WM_MOVE, WM_NEXTMENU, WM_SETFOCUS, WM_SIZE,
* or WM_SYSCOMMAND, these messages should be passed on
* to DefMDIChildProc even if we handle them. See the SDK
* Reference entry for DefMDIChildProc
*
*/
LONG FAR PASCAL BlandMDIChildWndProc ( hwnd, msg, wParam, lParam )
register HWND hwnd;
WORD msg;
register WORD wParam;
LONG lParam;
{
// Since this is a generic MDI app, the children don't handle
// and messages in non-default ways
return DefMDIChildProc (hwnd, msg, wParam, lParam);
}
/*----------------- CommandHandler -------------------------------*/
/*
*
* FUNCTION : CommandHandler ()
*
* PURPOSE : Processes all "frame" WM_COMMAND messages.
*
*/
VOID NEAR PASCAL CommandHandler ( hwnd, wParam )
register HWND hwnd;
register WORD wParam;
{
switch (wParam)
{
case IDM_FILENEW:
// Make an empty MDI child window
MakeNewChild (NULL);
break;
case IDM_FILEEXIT:
// Close application
SendMessage (hwnd, WM_CLOSE, 0, 0L);
break;
case IDM_WINDOWTILE:
// Tile MDI windows
SendMessage (hwndMDIClient, WM_MDITILE, 0, 0L);
break;
case IDM_WINDOWCASCADE:
// Cascade MDI windows
SendMessage (hwndMDIClient, WM_MDICASCADE, 0, 0L);
break;
case IDM_WINDOWICONS:
// Auto - arrange MDI icons
SendMessage (hwndMDIClient, WM_MDIICONARRANGE, 0, 0L);
break;
case IDM_WINDOWCLOSEALL:
CloseAllChildren();
break;
default:
// This is essential, since there are frame WM_COMMANDS generated
// by the MDI system for activating child windows via the
// window menu.
DefFrameProc(hwnd, hwndMDIClient, WM_COMMAND, wParam, 0L);
}
}
/*------------------- CloseAllChildren -----------------------------*/
/*
*
* FUNCTION : CloseAllChildren ()
*
* PURPOSE : Destroys all MDI child windows.
*
*/
VOID NEAR PASCAL CloseAllChildren (VOID)
{
register HWND hwndT;
// As long as the MDI client has a child, destroy it
while ( hwndT = GetWindow (hwndMDIClient, GW_CHILD))
{
// Skip the icon title windows
while (hwndT && GetWindow (hwndT, GW_OWNER))
hwndT = GetWindow (hwndT, GW_HWNDNEXT);
if (hwndT)
SendMessage (hwndMDIClient, WM_MDIDESTROY, (WORD)hwndT, 0L);
else
break;
}
}
/*----------------------- WinMain ----------------------------------*/
/*
*
* FUNCTION : WinMain(HANDLE, HANDLE, LPSTR, int)
*
* PURPOSE : Creates the "frame" window, does some initialization and
* enters the message loop.
*
*/
int NEAR PASCAL WinMain(hInstance, hPrevInstance, lpszCmdLine, nCmdShow)
HANDLE hInstance;
HANDLE hPrevInstance;
LPSTR lpszCmdLine;
int nCmdShow;
{
MSG msg;
hInst = hInstance;
// If this is the first instance of the app. register window classes
if (!hPrevInstance)
if (!InitializeApplication ())
return 0;
// Create the frame and do other initialization
if (!InitializeInstance (lpszCmdLine, nCmdShow))
return 0;
// Enter main message loop
while (GetMessage (&msg, NULL, 0, 0))
// If a keyboard message is for the MDI, let the MDI client
// take care of it. Otherwise, just handle the message as usual
if ( !TranslateMDISysAccel (hwndMDIClient, &msg))
{
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return 0;
}