home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Graphics Programming
/
Feng_Yuan_Win32_GDI_DirectX.iso
/
Samples
/
include
/
Framewnd.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
2000-05-11
|
8KB
|
303 lines
//-----------------------------------------------------------------------------------//
// Windows Graphics Programming: Win32 GDI and DirectDraw //
// ISBN 0-13-086985-6 //
// //
// Written by Yuan, Feng www.fengyuan.com //
// Copyright (c) 2000 by Hewlett-Packard Company www.hp.com //
// Published by Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com //
// //
// FileName : framewnd.cpp //
// Description: SDI and MDI frame window classes //
// Version : 1.00.000, May 31, 2000 //
//-----------------------------------------------------------------------------------//
#define STRICT
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <commctrl.h>
#include <tchar.h>
#include <assert.h>
#include "win.h"
#include "Status.h"
#include "Canvas.h"
#include "Toolbar.h"
#include "FrameWnd.h"
KFrame::KFrame(HINSTANCE hInstance, const TBBUTTON * pButtons, int nCount,
KToolbar * pToolbar, KCanvas * pCanvas, KStatusWindow * pStatus)
{
m_hInst = hInstance;
m_pStatus = NULL;
m_pCanvas = NULL;
m_pToolbar = NULL;
m_pButtons = pButtons;
m_nButtons = nCount;
m_pToolbar = pToolbar;
m_pCanvas = pCanvas;
m_pStatus = pStatus;
m_hMDIClient = NULL;
m_hAccel = NULL;
}
KFrame::~KFrame()
{
}
// default implementation: create a canvas window and a status window
LRESULT KFrame::OnCreate(void)
{
RECT rect;
// toolbar window is at the top of client area
if ( m_pToolbar )
{
m_pToolbar->Create(m_hWnd, m_hInst, ID_STATUSWINDOW, m_pButtons, m_nButtons);
GetWindowRect(m_pToolbar->m_hWnd, & rect);
m_nToolbarHeight = 37; // rect.bottom - rect.top;
}
else
m_nToolbarHeight = 0;
// status window is at the bottom of client area
if ( m_pStatus )
{
m_pStatus->Create(m_hWnd, ID_STATUSWINDOW);
GetWindowRect(m_pStatus->m_hWnd, & rect);
m_nStatusHeight = rect.bottom - rect.top;
}
else
m_nStatusHeight = 0;
// create a canvas window above the status window
if ( m_pCanvas )
{
GetClientRect(m_hWnd, & rect);
m_pCanvas->SetStatus(m_hInst, m_pStatus);
m_pCanvas->CreateEx(0, _T("Canvas Class"), NULL, WS_VISIBLE | WS_CHILD,
0, m_nToolbarHeight, rect.right, rect.bottom - m_nToolbarHeight - m_nStatusHeight,
m_hWnd, NULL, m_hInst);
}
return 0;
}
LRESULT KFrame::OnSize(int width, int height)
{
// need to tell status window about resizing
if ( m_pToolbar )
m_pToolbar->Resize(m_hWnd, width, height);
if ( m_pStatus )
m_pStatus->Resize(m_hWnd, width, height);
// resize canvas window
if ( m_pCanvas )
MoveWindow(m_pCanvas->m_hWnd,
0, m_nToolbarHeight, width, height - m_nToolbarHeight - m_nStatusHeight, TRUE);
if ( m_hMDIClient )
MoveWindow(m_hMDIClient,
0, m_nToolbarHeight, width, height - m_nToolbarHeight - m_nStatusHeight, TRUE);
return 0;
}
BOOL KFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
// forward message to canvas window
if ( m_pCanvas && m_pCanvas->OnCommand(wParam, lParam) )
return TRUE;
return FALSE; // not processed
}
LRESULT KFrame::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch( uMsg )
{
case WM_CREATE:
m_hWnd = hWnd;
return OnCreate();
case WM_SIZE:
return OnSize(LOWORD(lParam), HIWORD(lParam));
case WM_COMMAND:
if ( OnCommand(wParam, lParam) )
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0); // this is the only main window, destroying window means quit program
return 0;
}
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
WPARAM KFrame::MessageLoop(void)
{
MSG msg;
while ( GetMessage(&msg, NULL, 0, 0) )
if ( ! TranslateMDISysAccel(m_hMDIClient, &msg) &&
! TranslateAccelerator(m_hWnd, m_hAccel, & msg) )
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
///////////////////////// KMDIFrame
BOOL CALLBACK CloseEnumProc(HWND hWnd, LPARAM lParam)
{
if ( GetWindow(hWnd, GW_OWNER) )
return TRUE;
SendMessage(GetParent(hWnd), WM_MDIRESTORE, (WPARAM) hWnd, 0);
if ( ! SendMessage(hWnd, WM_QUERYENDSESSION, 0, 0) )
return TRUE;
SendMessage(GetParent(hWnd), WM_MDIDESTROY, (WPARAM) hWnd, 0);
return TRUE;
}
BOOL KMDIFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
return FALSE; // not processed
}
LRESULT KMDIFrame::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_CREATE:
{
m_hWnd = hWnd;
m_hMainMenu = GetMenu(hWnd);
OnCreate(); // toolbar & status
CLIENTCREATESTRUCT client;
client.hWindowMenu = GetSubMenu(m_hMainMenu, 1);
client.idFirstChild = 1000;
m_hMDIClient = CreateWindow(_T("MDICLIENT"), NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
0, 0, 0, 0, hWnd, (HMENU) 1, m_hInst, & client);
return 0;
}
break;
case WM_COMMAND:
if ( OnCommand(wParam, lParam) ) // allow overridding
return 0;
if ( LOWORD(wParam)==m_Translate[Enum_WINDOW_TILE] )
{
SendMessage(m_hMDIClient, WM_MDITILE, 0, 0);
return 0;
}
else if ( LOWORD(wParam)==m_Translate[Enum_WINDOW_CASCADE] )
{
SendMessage(m_hMDIClient, WM_MDICASCADE, 0, 0);
return 0;
}
else if ( LOWORD(wParam)==m_Translate[Enum_WINDOW_ARRANGE] )
{
SendMessage(m_hMDIClient, WM_MDIICONARRANGE, 0, 0);
return 0;
}
else if ( LOWORD(wParam)==m_Translate[Enum_WINDOW_CLOSEALL] )
{
EnumChildWindows(m_hMDIClient, CloseEnumProc, 0);
return 0;
}
else if ( LOWORD(wParam)==m_Translate[Enum_FILE_CLOSE] )
{
HWND h = (HWND) SendMessage(m_hMDIClient, WM_MDIGETACTIVE, 0, 0);
if ( SendMessage(h, WM_QUERYENDSESSION, 0, 0) )
SendMessage(m_hMDIClient, WM_MDIDESTROY, (WPARAM) h, 0);
return 0;
}
else if ( LOWORD(wParam)==m_Translate[Enum_FILE_EXIT] )
{
SendMessage(hWnd, WM_CLOSE, 0, 0);
return 0;
}
else
{
HWND h = (HWND) SendMessage(m_hMDIClient, WM_MDIGETACTIVE, 0, 0);
if ( h )
SendMessage(h, WM_COMMAND, wParam, lParam);
}
break;
// forward message to active child window
case WM_QUERYNEWPALETTE:
{
HWND h = (HWND) SendMessage(m_hMDIClient, WM_MDIGETACTIVE, 0, 0);
if ( h )
SendMessage(h, uMsg, wParam, lParam);
}
break;
case WM_SIZE:
return OnSize(LOWORD(lParam), HIWORD(lParam));
case WM_QUERYENDSESSION:
case WM_CLOSE:
SendMessage(hWnd, WM_COMMAND, m_Translate[Enum_WINDOW_CLOSEALL], 0); // Close all child window
if ( GetWindow(m_hMDIClient, GW_CHILD) ) // stay if child winodow staying
return 0;
break;
case WM_DESTROY:
PostQuitMessage(0); // this is the only main window, destroying window means quit program
return 0;
case WM_USER:
if ( wParam )
SendMessage(m_hMDIClient, WM_MDISETMENU, (WPARAM) m_hMainMenu, (LPARAM) GetSubMenu(m_hMainMenu, 1));
DrawMenuBar(hWnd);
return 0;
}
return DefFrameProc(hWnd, m_hMDIClient, uMsg, wParam, lParam);
}