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), получил практические навыки по составлению, написанию и отладке программ, позволяющих работать с несколькими документами (форматированными файлами) в одном приложении.


 

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

58533. Задачі на рух по річці 60 KB
  Мета: вивести формули звязку власної швидкості обєкта швидкості течії річки швидкості обєкта за течією та проти течії; формувати в учнів уміння застосовувати виведені формули до розвязання задач; розвивати память логічне мислення...
58534. Повторення. Пропорції. (Застосування “Золотого перерізу”) 98.5 KB
  Мета: Повторення і узагальнення матеріалу з теми Пропорції. Познайомити учнів із застосуванням відношення золотого перерізу. Сьогодні на уроці ми будемо розвязувати вправи та задачі на відношення та пропорції а також познайомимося із застосуванням...
58535. Міри довжини Кілометр. Порівняння величин 56 KB
  Мета: ознайомити учнів з кілометром та співвідношення між метром і кілометром, формувати уміння перетворювати іменовані числа; розвивати память, логічне мислення; виховувати почуття відповідальності, охайності, старанності.
58536. Узагальнення і систематизація знань учнів вміння додавання і віднімання чисел в межах 20. Розвязування задач 57.5 KB
  Щоб дізнатись про що і про кого піде мова на сьогоднішньому уроці треба виконати наступні завдання. Ми птахи хочемо знати як ви вмієте рахувати і кожний з нас приніс завдання яке є на листівках. Що впораєтесь ви із завданням чи ні Тоді поспішаймо...
58538. УРОК МАТЕМАТИКИ В НАЧАЛЬНЫХ КЛАССАХ 33 KB
  В зависимости от основной дидактической цели урока выделяются следующие типы уроков: Урок изучения нового материала Урок закрепления знаний умений навыков. Наиболее распространённым типом урока математики являются комбинированные уроки. Направленность курса математики на развитие ребёнка вносит существенные изменения во внутреннюю структуру урока. Этап закрепления не ограничивается рамками одного урока.
58539. Повторение таблицы деления на 9 36 KB
  Цель: повторение навыка умножения на 9, закрепление навыка деления на 9. Задачи: Образовательные: повторить и отработать навык деления на 9. Коррекционные: корректировать логическое мышление на основе упражнений в течении урока, развивать память, внимание, умение сравнивать.
58540. Сценка «Урок математики» 26.5 KB
  Что никто не сделал Все: Мы не поняли Учитель: Да что тут понимать Каждое частное решение дифференциального уравнения является некоторой функцией одной переменной которой в системе координат соответствует некоторая линия называемая интегральной кривой данного дифференциального уравнения. Понятно Все: с готовностью Ага Учитель: Так теперь вопрос на засыпку: Как возвести число в квадрат Ученица 1 выпаливает: Чтобы возвести число в квадрат...
58541. Читання, запис, порівняння чисел. Одноцифрові та двоцифрові числа. Попереднє і наступне число до даного числа. Додавання і віднімання одиниці 55.5 KB
  Мета: продовжувати ознайомлювати учнів з одноцифровим та двоцифровими числами, їх записом, утворенням і читанням; формувати вміння утворювати числа шляхом додавання одиниці до наступного числа і віднімання одиниці від наступного; формувати вміння правильно називати попереднє та наступне число до даного...