69994

МНОГООКОННЫЙ ИНТЕРФЕЙС

Лабораторная работа

Информатика, кибернетика и программирование

Цель: Ознакомление с технологией создания многооконного интерфейса (Multiple Document Interface, MDI), получение практических навыков по составлению, написанию и отладке программ, позволяющих работать с несколькими документами (форматированными файлами) в одном приложении.

Русский

2014-10-13

82 KB

23 чел.

Министерство образования и науки Украины

Харьковский Национальный Университет Радиоэлектроники

Кафедра ЭВМ

Лабораторная работа №6

Тема: «МНОГООКОННЫЙ ИНТЕРФЕЙС»

Выполнил:                                                                      Проверил:

ст. гр. КИ-08-4                                                                Бугрий А. Н.

Кравец Артём Валерьевич                                            Остроушко А. П.

2009

Лабораторная работа №6

Цель: Ознакомление с технологией создания многооконного интерфейса (Multiple Document Interface, MDI), получение практических навыков по составлению, написанию и отладке программ, позволяющих работать с несколькими документами (форматированными файлами) в одном приложении.

Задание:

Вариант 6

Написать простой многооконный графический редактор, позволяющий при помощи мыши рисовать линии и прямоугольники. Редактор должен иметь возможность записи и чтения изображения в метафайл.

Листинг:

#include "stdafx.h"

#include "resource.h"

#define INIT_MENU_POS    0

#define HELLO_MENU_POS   2

#define IDM_FIRSTCHILD   50000

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

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

BOOL    CALLBACK CloseEnumProc (HWND, LPARAM) ;

HDC             hdc, meta ;

bool flag = true;

TCHAR     szAppName[]    = TEXT ("MDI") ;

TCHAR     szFrameClass[] = TEXT ("MdiFrame") ;

TCHAR     szHelloClass[] = TEXT ("MdiDocument") ;

HINSTANCE hInst ;

HMENU     hMenuInit, hMenuHello ;

HMENU     hMenuInitWindow, hMenuHelloWindow ;

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,

    PSTR szCmdLine, int iCmdShow)

{

HACCEL   hAccel ;

HWND     hwndFrame, hwndClient ;

MSG      msg ;

WNDCLASS wndclass ;

hInst = hInstance ;

 // Register the frame window class

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 ;

 if (!RegisterClass (&wndclass))

{

 MessageBox (NULL, TEXT ("This program requires Windows NT!"),

  szAppName, MB_ICONERROR) ;

 return 0 ;

}

 // Register the Hello child window class

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 ;

RegisterClass (&wndclass) ;

 // Obtain handles to three possible menus & submenus

hMenuInit  = LoadMenu (hInstance, TEXT ("MdiMenuInit")) ;

hMenuHello = LoadMenu (hInstance, TEXT ("MdiMenuDraw")) ;

hMenuInitWindow  = GetSubMenu (hMenuInit,   INIT_MENU_POS) ;

hMenuHelloWindow = GetSubMenu (hMenuHello, HELLO_MENU_POS) ;

 // Load accelerator table

hAccel = LoadAccelerators (hInstance, szAppName) ;

 // Create the frame window

hwndFrame = CreateWindow (szFrameClass, TEXT ("Лабораторная №6 - MDI"),

 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) ;

 // Enter the modified message loop

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

{

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

  !TranslateAccelerator (hwndFrame, hAccel, &msg))

 {

  TranslateMessage (&msg) ;

  DispatchMessage (&msg) ;

 }

}

 // Clean up by deleting unattached menus

DestroyMenu (hMenuHello) ;    

 return msg.wParam ;

}

LRESULT CALLBACK FrameWndProc (HWND hwnd, UINT message,

         WPARAM wParam, LPARAM lParam)

{

 static HWND        hwndClient ;

HWND               hwndChild ;

CLIENTCREATESTRUCT clientcreate ;

MDICREATESTRUCT    mdicreate ;

 switch (message)

{

 case WM_CREATE:           // Create the client window

 clientcreate.hWindowMenu  = hMenuInitWindow ;

 clientcreate.idFirstChild = IDM_FIRSTCHILD ;

 hwndClient = CreateWindow (TEXT ("MDICLIENT"), NULL,

  WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,   

  0, 0, 0, 0, hwnd, (HMENU) 1, hInst,

  (PSTR) &clientcreate) ;

 return 0 ;

 case WM_COMMAND:

 switch (LOWORD (wParam))

 {

  case IDM_FILE_NEWDOCUMENT:       // Create a Hello child window       

   mdicreate.szClass = szHelloClass ;

   mdicreate.szTitle = TEXT ("Новый документ") ;

   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_FILE_CLOSE:          // Close the active window

   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_APP_EXIT:            // Exit the program    

   SendMessage (hwnd, WM_CLOSE, 0, 0) ;

   return 0 ;

  case IDM_WINDOW_CLOSEALL:     // Attempt to close all children

   EnumChildWindows (hwndClient, CloseEnumProc, 0) ;

   return 0 ;

  default:             // Pass to active child...

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

   if (IsWindow (hwndChild))

    SendMessage (hwndChild, WM_COMMAND, wParam, lParam) ;

   break ;      

  }

  break ;

 case WM_QUERYENDSESSION:

 case WM_CLOSE:                      

 SendMessage (hwnd, WM_COMMAND, IDM_WINDOW_CLOSEALL, 0) ;

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

  return 0 ;

 break ;

 case WM_DESTROY:

 PostQuitMessage (0) ;

 return 0 ;

}

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

}

BOOL CALLBACK CloseEnumProc (HWND hwnd, LPARAM lParam)

{

 if (GetWindow (hwnd, GW_OWNER))         // Check for icon title

 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 ;

}

LRESULT CALLBACK HelloWndProc (HWND hwnd, UINT message,

         WPARAM wParam, LPARAM lParam)

{

 static HWND     hwndClient, hwndFrame ;

 //HDC             hdc, meta ;

PAINTSTRUCT     ps ;

 static int x1, y1, x2, y2, tmp;

 static HMETAFILE hmf;

 switch (message)

{

 case WM_CREATE:

  hwndClient = GetParent (hwnd) ;

  hwndFrame  = GetParent (hwndClient) ;

  meta = CreateMetaFile(L"picture.wmf");

  int a = 0;

  return 0 ;

 case WM_PAINT:  

  hdc = BeginPaint (hwnd, &ps);

  if(flag)

  {

   if(tmp == 1)

   {

    MoveToEx(hdc, x1,y1, NULL);

    LineTo(hdc, x2, y2);

   }

   if(tmp == 2)

    Rectangle(hdc,x1, y1, x2, y2);

  }

  else PlayMetaFile(hdc,hmf);

  EndPaint (hwnd, &ps);

  return 0 ;

 case WM_LBUTTONDOWN:

  x1 = LOWORD(lParam);

  y1 = HIWORD(lParam);

  break;

 case WM_MOUSEMOVE:

  flag = true;

  if(wParam & MK_LBUTTON)

  {

   x2 = LOWORD(lParam);

   y2 = HIWORD(lParam);

  }

  InvalidateRect(hwnd, NULL, TRUE);

  break;

 case WM_LBUTTONUP:

   flag = false;

  

   x2 = LOWORD(lParam);

   y2 = HIWORD(lParam);

   if(tmp == 1)

   {

    MoveToEx(meta, x1,y1, NULL);

    LineTo(meta, x2, y2);

   }

   if(tmp == 2)

    Rectangle(meta,x1, y1, x2, y2);

   InvalidateRect(hwnd, NULL, TRUE);

  break;

 case WM_KEYDOWN:

  hmf = CloseMetaFile(meta);

  InvalidateRect(hwnd, NULL, TRUE);

  break;

 case WM_COMMAND:

  switch(LOWORD(wParam))

  {

   case IDM_DRAW_LINE:

    tmp = 1;

    break;

   case IDM_DRAW_RECT:

    tmp = 2;

    break;

   default:

    return DefWindowProc(hwnd, message, wParam, lParam);

  }

  break;

 case WM_MDIACTIVATE:           

  if (lParam == (LPARAM) hwnd)

   SendMessage (hwndClient, WM_MDISETMENU,

   (WPARAM) hMenuHello, (LPARAM) hMenuHelloWindow) ;      

           

  if (lParam != (LPARAM) hwnd)

   SendMessage (hwndClient, WM_MDISETMENU, (WPARAM) hMenuInit,

   (LPARAM) hMenuInitWindow) ;       

  DrawMenuBar (hwndFrame) ;

  return 0 ;

 case WM_QUERYENDSESSION:

 case WM_CLOSE:

  DeleteMetaFile(hmf);

  if (IDOK != MessageBox (hwnd, TEXT ("Закрыть окно?"),

   TEXT ("Документ"),

   MB_ICONQUESTION | MB_OKCANCEL))

   return 0 ;

  break ;

 }

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

}

Результат:

Выводы: В этой лабораторной работе я ознакомился с технологией создания многооконного интерфейса (Multiple Document Interface, MDI), получил практические навыки по составлению, написанию и отладке программ, позволяющих работать с несколькими документами (форматированными файлами) в одном приложении.


 

А также другие работы, которые могут Вас заинтересовать

35309. Основи господарського права України 89 KB
  Господарське право – це галузь права, система правових норм, що регулюють відносини з приводу безпосереднього здійснення господарської діяльності, використання результатів господарської діяльності та керівництво господарською діяльністю органами державної влади та місцевого самоврядування
35310. Основи кримінального права України. оняття злочину та його ознаки 134 KB
  Кримінальне право як галузь права — це сукупність юридичних норм (кримінальних законів), встановлених найвищим органом законодавчої влади (Верховною Радою України) або всеукраїнським референдумом, що визначають, які суспільно небезпечні діяння є злочинами та які покарання підлягають застосуванню до осіб, що їх вчинили.
35311. Основи теорії держави та права. Правові відносини 94 KB
  Найхарактернішою ознакою соціальних норм є нормативність: по-перше, вони є правилами поведінки, тобто вказують, як варто себе вести у тій чи іншій конкретній ситуації; по-друге, вони є правилами загального характеру, для них характерна багаторазовість застосування, тривалість дії, невизначеність адресата (адресуються всім, хто може опинитись у визначених соціальними нормами умовах).
35312. Основи конституційного права України. Загальна характеристика органів державної влади в Україні 92 KB
  Верховна Рада є загальнонаціональним представницьким органом державної влади. Український парламент складається з 450 народних депутатів, які обираються на основі загального, рівного і прямого виборчого права шляхом таємного голосування строком на 5 років.
35313. Тема: Використовування програми Провідник Мета: придбати уміння і навик роботи з програмою Провідник.. 303.5 KB
  1 відкрити вікно теки диска D: і створити в ній скажімо теку Petrenko букви латинські; 2 перейменувати теку Petrenko в теку Петренко букви кирилиці; з теки диска D: скопіювати в теку Петренко якийнебудь файл або теку; 4 з теки диска D: перемістити в теку Петренко якийнебудь файл або теку; 5 видалити з теки Петренко переміщений туди файл або теку; відновити в теці Петренко видалений раніше об'єкт; 7 виділити в теці диска D: декілька суміжних об'єктів і скопіювати їх в теку Петренко; 8 виділити в теці...
35314. Тема: Створення зміна та видалення локальних облікових записів користувачів за допомогою MMC. 1.4 MB
  Індивідуальне завдання Зараз ви створите новий локальний обліковий запис користувача й призначите для неї пароль за допомогою категорії Облікові записи користувачів User ccounts. І нарешті ви видалите локальний обліковий запис користувача за допомогою категорії Облікові записи користувачів User ccounts. Клацніть Пуск Strt Панель керування Control pnel і Облікові записи користувачів User ccounts. У вікні Облікові записи користувачів User ccounts у розділі Виберіть завдання Pіck А Tsk клацніть Створення облікового запису...
35315. Резервування і ініціалізація памяті на асемблері 56 KB
  Одержати виконуваний файл програми з прикладу. Вивести на екран вікно регістрів процесора. Описати всі вхідні в це вікно регістри і прапори, а також їх призначення (письмово).
35316. Основи трудового права України. Підстави розірвання трудового договору 83 KB
  Трудовий договір укладається у письмовій або усній формах прийняття на роботу оформлюється наказом (розпорядженням) роботодавця.
35317. Основи цивільного та сімейного права України. Особисті немайнові права та обов’язки подружжя 96.5 KB
  Сімейне право - це галузь права, що врегульовує сімейно-шлюбні та прирівняні до них відносини. Сімейні відносини регулюються Сімейним кодексом (СКУ) та іншими нормативно-правовими актами.