69994

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

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

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

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

Русский

2014-10-13

82 KB

26 чел.

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

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

Кафедра ЭВМ

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


 

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

32498. УЧЕБНЫЕ И МЕТОДИЧЕСКИЕ ПОСОБИЯ ПО ИНФОРМАТИКЕ 90.5 KB
  Теория и методика обучения информатики УЧЕБНЫЕ И МЕТОДИЧЕСКИЕ ПОСОБИЯ ПО ИНФОРМАТИКЕ. Некомпьютерные средства обучения информатике Понятие и дидактические функции технических средств обучения Еще основоположник классноурочной системы обучения Ян Амос Коменский отмечал: . Наиболее высокое качество усвоения достигается при непосредственном сочетании слова учителя и предъявляемого учащимся с помощью технических средств обучения ТСО изображения в процессе передачи учебной информации. Техническими средствами обучения называют проекционную...
32499. ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ ПО КУРСУ ИНФОРМАТИКИ 49.5 KB
  В систему средств обучения наряду с учебниками учебными и методическими материалами и программным обеспечением для компьютеров входят и сами компьютеры образующие единую комплексную среду которая и позволяет учителю достигать поставленных целей обучения. Вот перечень основных компонентов рекомендуемой системы средств обучения информатике в школе: программнометодическое обеспечение курса информатики включающее как программные средства для поддержки преподавания так и инструментальные программные средства ИПС обеспечивающие учителю...
32500. ОСНОВНЫЕ ФОРМЫ ОРГАНИЗАЦИИ ОБУЧЕНИЯ ИНФОРМАТИКЕ В СРЕДНЕЙ ШКОЛЕ 68 KB
  Все это приемлемо и на уроках по информатике. Применение ИКТ может существенно изменять характер школьного урока что делает еще более актуальным поиск новых организационных форм обучения которые должны наилучшим образом обеспечивать образовательный и воспитательный процесс. Главный признак урока это его дидактическая цель показывающая к чему должен стремиться учитель. Цель  тип урока  содержание урока  методы  форму познавательной деятельности учащихся  результат Основные типы уроков: урок формирования знаний; урок закрепления...
32501. МЕТОДЫ И ПРИЕМЫ ФОРМИРОВАНИЯ СИСТЕМНО-НАУЧНЫХ ПОНЯТИЙ НА УРОКАХ ИНФОРМАТИКИ И ВО ВНЕУРОЧНОЕ ВРЕМЯ 48 KB
  Теория и методика обучения информатики МЕТОДЫ И ПРИЕМЫ ФОРМИРОВАНИЯ СИСТЕМНОНАУЧНЫХ ПОНЯТИЙ НА УРОКАХ ИНФОРМАТИКИ И ВО ВНЕУРОЧНОЕ ВРЕМЯ. Методы и приемы формирования системноинформационных понятий на уроках информатики и во внеурочной работе со школьниками Философские аспекты современного школьного курса информатики Проблема существования и бытия человека в полностью технизированном и информатизированном мире не могла не занимать философов что вызвало к жизни концепцию информационного общества. Пропедевтика методов системного анализа...
32502. ОБЩИЕ МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПРИ ИЗУЧЕНИИ ИНФОРМАТИКИ, МЕТОДЫ ОБУЧЕНИЯ С ИСПОЛЬЗОВАНИЕМ ИНФОРМАЦИОННО-КОММУНИКАЦИОННЫХ ТЕХНОЛОГИЙ 84.5 KB
  Теория и методика обучения информатики ОБЩИЕ МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ ПРИ ИЗУЧЕНИИ ИНФОРМАТИКИ МЕТОДЫ ОБУЧЕНИЯ С ИСПОЛЬЗОВАНИЕМ ИНФОРМАЦИОННО-КОММУНИКАЦИОННЫХ ТЕХНОЛОГИЙ. Общие методические рекомендации и принципы обучения информатике. Принцип освоения методики самообучения. Методы обучения с использованием ИКТ Методы обучения система взаимодействия преподавателя и обучаемого с использованием ИКТ обеспечивающая усвоение образовательной программы.
32503. ОРГАНИЗАЦИЯ ПРОВЕРКИ И ОЦЕНКИ РЕЗУЛЬТАТОВ ОБУЧЕНИЯ. ПРИНЦИПЫ ПОСТРОЕНИЯ СИСТЕМЫ И ХАРАКТЕРИСТИКА МЕТОДОВ КОНТРОЛЯ. ОСНОВНЫЕ ФОРМЫ КОНТРОЛЯ. МОДЕЛЬ НЕПРЕРЫВНОГО КОНТРОЛЯ. ШКАЛЫ ОЦЕНОК 92.5 KB
  ПРИНЦИПЫ ПОСТРОЕНИЯ СИСТЕМЫ И ХАРАКТЕРИСТИКА МЕТОДОВ КОНТРОЛЯ. ОСНОВНЫЕ ФОРМЫ КОНТРОЛЯ. МОДЕЛЬ НЕПРЕРЫВНОГО КОНТРОЛЯ. В ходе контроля оценивается степень и уровень обученности.
32504. ПРЕПОДАВАНИЕ ПРОПЕДЕВТИЧЕСКОГО КУРСА ИНФОРМАТИКИ В НАЧАЛЬНЫХ КЛАССАХ СРЕДНИХ УЧЕБНЫХ ЗАВЕДЕНИЙ 58 KB
  Целью курса информатики в начальной школе является формирование первоначальных базовых понятий информатики что обеспечит дальнейшее создание информационной картины мира представлений о свойствах информации способах работы с ней формирование представления о компьютере как универсальной информационной машине развитие информационной культуры ребенка и интеллектуальных способностей учащихся. В соответствии с целями обучения информатике в начальной школе выделяется ряд задач на которые нужно опираться при проведении уроков информатики в...
32505. ПРЕПОДАВАНИЕ БАЗОВОГО КУРСА ИНФОРМАТИКИ В СРЕДНИХ УЧЕБНЫХ ЗАВЕДЕНИЯХ 47 KB
  Среди них: теория информации теория алгоритмов теоретическая кибернетика математическое и информационное моделирование дискретная математика искусственный интеллект и др. К аппаратным средствам относятся компьютеры технические средства хранения и отображения информации передачи данных по сетям. Она заключается в формировании представлений об информации информационных процессах как одного из трех основополагающих понятий: вещества энергии информации на основе которых строится современная научная картина мира. В этом отношении...
32506. МЕТОДИКА ИЗУЧЕНИЯ СОДЕРЖАТЕЛЬНОЙ ЛИНИИ: «ИНФОРМАЦИЯ И ИНФОРМАЦИОННЫЕ ПРОЦЕССЫ». 83 KB
  Ключевыми вопросами данной содержательной линии являются: определение информации; измерение информации; хранение информации; передача информации; обработка информации. Проблемы определения и измерения информации Нельзя дать единого универсального определения информации. Но в науке и в практике известны различные подходы к информации и в рамках каждого из них дается определение этого понятия Субъективный подход. При раскрытии понятия информация с точки зрения субъективного бытового человеческого подхода следует отталкиваться...