Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
08.05.2015
Размер:
124.42 Кб
Скачать

Пример программы

#include <windows.h>

#include <stdlib.h>

#include "mdidemo.h"

//Предварительное объявление функций

LRESULT CALLBACK FrameWndProc (HWND, UINT, WPARAM, LPARAM);

BOOL CALLBACK CloseEnumProc(HWND, LPARAM);

LRESULT CALLBACK HelloWndProc (HWND, UINT, WPARAM, LPARAM);

LRESULT CALLBACK RectWndProc (HWND, UINT, WPARAM, LPARAM);

// Глобальные переменнве

char szFrameClass[] = "MdiFrame";

char szHelloClass[] = "MdiHelloChild";

char szRectClass[] = "MdiRectChild";

HINSTANCE hInst;

HMENU hMenuInit, hMenuHello, hMenuRect;

HMENU hMenuInitWindow, hMenuHelloWindow, hMenuRectWindow;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

PSTR szCmdLine, int iCmdShow)

{

HACCEL hAccel;

HWND hwndFrame, hwndClient;

MSG msg;

WNDCLASSEX wndclass;

hInst = hInstance;

if(!hPrevInstance)

{

// Регистрация класса главного окна

wndclass.cbSize = sizeof(wndclass);

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = FrameWndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = 0;

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

wndclass.hbrBackground =(HBRUSH)(COLOR_APPWORKSPACE + 1);

wndclass.lpszMenuName = NULL;

wndclass.lpszClassName = szFrameClass;

wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wndclass);

// Регистрация класса окна, в котором выводится фраза "Привет, мир!"

wndclass.cbSize = sizeof(wndclass);

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = HelloWndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = sizeof(HANDLE);

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

wndclass.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = NULL;

wndclass.lpszClassName = szHelloClass;

wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wndclass);

// Регистрация класса окна, в котором выводится прямоугольник

wndclass.cbSize = sizeof(wndclass);

wndclass.style = CS_HREDRAW | CS_VREDRAW;

wndclass.lpfnWndProc = RectWndProc;

wndclass.cbClsExtra = 0;

wndclass.cbWndExtra = sizeof(HANDLE);

wndclass.hInstance = hInstance;

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

wndclass.hbrBackground =(HBRUSH) GetStockObject(WHITE_BRUSH);

wndclass.lpszMenuName = NULL;

wndclass.lpszClassName = szRectClass;

wndclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

RegisterClassEx(&wndclass);

}

// Формирование описателей меню для разных окон

hMenuInit = LoadMenu(hInst, "MdiMenuInit");

hMenuHello = LoadMenu(hInst, "MdiMenuHello");

hMenuRect = LoadMenu(hInst, "MdiMenuRect");

hMenuInitWindow = GetSubMenu(hMenuInit, INIT_MENU_POS);

hMenuHelloWindow = GetSubMenu(hMenuHello, HELLO_MENU_POS);

hMenuRectWindow = GetSubMenu(hMenuRect, RECT_MENU_POS);

// Чтение горячих клавиш

hAccel = LoadAccelerators(hInst, "MdiAccel");

// Создание главного окна

hwndFrame = CreateWindow(szFrameClass, "MDI Demonstration",

WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,

CW_USEDEFAULT, CW_USEDEFAULT,

CW_USEDEFAULT, CW_USEDEFAULT,

NULL, hMenuInit, hInstance, NULL);

hwndClient = GetWindow(hwndFrame, GW_CHILD);

ShowWindow(hwndFrame, iCmdShow);

UpdateWindow(hwndFrame);

// Цикл обработки сообщений

while(GetMessage(&msg, NULL, 0, 0))

{

if(!TranslateMDISysAccel(hwndClient, &msg) &&

!TranslateAccelerator(hwndFrame, hAccel, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

// Удаление меню

DestroyMenu(hMenuHello);

DestroyMenu(hMenuRect);

return msg.wParam;

}

// оконная процедура главного окна

LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

static HWND hwndClient;

CLIENTCREATESTRUCT clientcreate;

HWND hwndChild;

MDICREATESTRUCT mdicreate;

switch(iMsg)

{

case WM_CREATE : // Создание клиентского окна

clientcreate.hWindowMenu = hMenuInitWindow;

clientcreate.idFirstChild = IDM_FIRSTCHILD;

hwndClient = CreateWindow("MDICLIENT", NULL,

WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,

0, 0, 0, 0, hwnd,(HMENU) 1, hInst, (LPSTR) &clientcreate);

return 0;

case WM_COMMAND:

switch(wParam)

{

case IDM_NEWHELLO: // Создание дочернего окна, в котором выводится фраза "Привет, мир!"

mdicreate.szClass = szHelloClass;

mdicreate.szTitle = "Hello";

mdicreate.hOwner = hInst;

mdicreate.x = CW_USEDEFAULT;

mdicreate.y = CW_USEDEFAULT;

mdicreate.cx = CW_USEDEFAULT;

mdicreate.cy = CW_USEDEFAULT;

mdicreate.style = 0;

mdicreate.lParam = 0;

hwndChild =(HWND) SendMessage(hwndClient, WM_MDICREATE, 0,

(LPARAM)(LPMDICREATESTRUCT) &mdicreate);

return 0;

case IDM_NEWRECT : // Создание дочернего окна, в котором выводится прямоугольник

mdicreate.szClass = szRectClass;

mdicreate.szTitle = "Rectangles";

mdicreate.hOwner = hInst;

mdicreate.x = CW_USEDEFAULT;

mdicreate.y = CW_USEDEFAULT;

mdicreate.cx = CW_USEDEFAULT;

mdicreate.cy = CW_USEDEFAULT;

mdicreate.style = 0;

mdicreate.lParam = 0;

hwndChild =(HWND) SendMessage(hwndClient, WM_MDICREATE, 0,

(LPARAM)(LPMDICREATESTRUCT) &mdicreate);

return 0;

case IDM_CLOSE : // Закрыти активного окна

hwndChild =(HWND) SendMessage(hwndClient, WM_MDIGETACTIVE, 0, 0);

if (SendMessage(hwndChild, WM_QUERYENDSESSION, 0, 0))

SendMessage(hwndClient, WM_MDIDESTROY, (WPARAM) hwndChild, 0);

return 0;

case IDM_EXIT: // Выход из программы

SendMessage(hwnd, WM_CLOSE, 0, 0);

return 0;

//Сообщения о сортироке окон

case IDM_TILE :

SendMessage(hwndClient, WM_MDITILE, 0, 0);

return 0;

case IDM_CASCADE :

SendMessage(hwndClient, WM_MDICASCADE, 0, 0);

return 0;

case IDM_ARRANGE :

SendMessage(hwndClient, WM_MDIICONARRANGE, 0, 0);

return 0;

case IDM_CLOSEALL : // Закрыть все дочерние окна

EnumChildWindows(hwndClient, &CloseEnumProc, 0);

return 0;

default :

hwndChild =(HWND) SendMessage(hwndClient, WM_MDIGETACTIVE, 0, 0);

if(IsWindow(hwndChild))

SendMessage(hwndChild, WM_COMMAND, wParam, lParam);

break; // ...and then to DefFrameProc

}

break;

case WM_QUERYENDSESSION:

case WM_CLOSE: // Attempt to close all children

SendMessage(hwnd, WM_COMMAND, IDM_CLOSEALL, 0);

if(NULL != GetWindow(hwndClient, GW_CHILD))

return 0;

break;

case WM_DESTROY :

PostQuitMessage(0);

return 0;

}

// Использоваие DefFrameProc(not вместо DefWindowProc

return DefFrameProc(hwnd, hwndClient, iMsg, wParam, lParam);

}

// Функция закрытия окон

BOOL CALLBACK CloseEnumProc(HWND hwnd, LPARAM lParam)

{

if(GetWindow(hwnd, GW_OWNER)) return 1;

SendMessage(GetParent(hwnd), WM_MDIRESTORE,(WPARAM) hwnd, 0);

if(!SendMessage(hwnd, WM_QUERYENDSESSION, 0, 0)) return 1;

SendMessage(GetParent(hwnd), WM_MDIDESTROY,(WPARAM) hwnd, 0);

return 1;

}

// Оконная процедура первого окна

LRESULT CALLBACK HelloWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

static COLORREF clrTextArray[] = { RGB(0, 0, 0), RGB(255, 0, 0),

RGB(0, 255, 0), RGB( 0, 0, 255),

RGB(255, 255, 255) };

static HWND hwndClient, hwndFrame;

HDC hdc;

HMENU hMenu;

LPHELLODATA lpHelloData;

PAINTSTRUCT ps;

RECT rect;

switch(iMsg)

{

case WM_CREATE :

// Save some window handles

hwndClient = GetParent(hwnd);

hwndFrame = GetParent(hwndClient);

return 0;

case WM_PAINT :

// Рисование

hdc = BeginPaint(hwnd, &ps);

GetClientRect(hwnd, &rect);

DrawText(hdc, "Привет, Мир!", -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

EndPaint(hwnd, &ps);

return 0;

case WM_MDIACTIVATE :

// Установка нового меню

if(lParam ==(LPARAM) hwnd)

SendMessage(hwndClient, WM_MDISETMENU,

(WPARAM) hMenuHello,(LPARAM) hMenuHelloWindow);

DrawMenuBar(hwndFrame);

return 0;

case WM_QUERYENDSESSION :

case WM_CLOSE :

if(IDOK != MessageBox(hwnd, "OK to close window?", "Hello",

MB_ICONQUESTION | MB_OKCANCEL))

return 0;

break;

case WM_DESTROY :

return 0;

}

return DefMDIChildProc(hwnd, iMsg, wParam, lParam);

}

// Оконная процедура второго дочернего окна

LRESULT CALLBACK RectWndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam)

{

static HWND hwndClient, hwndFrame;

HBRUSH hBrush;

HDC hdc;

LPRECTDATA lpRectData;

PAINTSTRUCT ps;

int xLeft, xRight, yTop, yBottom;

short nRed, nGreen, nBlue;

switch(iMsg)

{

case WM_CREATE :

// Save some window handles

hwndClient = GetParent(hwnd);

hwndFrame = GetParent(hwndClient);

return 0;

case WM_PAINT : // Рисование

hdc = BeginPaint(hwnd, &ps);

Rectangle(hdc,10,10,200,200);

EndPaint(hwnd, &ps);

return 0;

case WM_MDIACTIVATE : // Установка меню.

if(lParam ==(LPARAM) hwnd)

SendMessage(hwndClient, WM_MDISETMENU,(WPARAM) hMenuRect,

(LPARAM) hMenuRectWindow);

else

SendMessage(hwndClient, WM_MDISETMENU,(WPARAM) hMenuInit,

(LPARAM) hMenuInitWindow);

DrawMenuBar(hwndFrame);

return 0;

case WM_DESTROY :

return 0;

}

// Пересылка необработанных сообщений в DefMDIChildProc

return DefMDIChildProc(hwnd, iMsg, wParam, lParam);

}

Рис . 11.2 Текст программы MDIDEMO

Программа MDIDEMO поддерживает два типа предельно простых окон документов: в одном в центре рабочей области выводится фраза "Hello, World!", а во втором отображается прямоугольник. С каждым из этих двух типов окон документов связано свое меню.