69994

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

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

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

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

Русский

2014-10-13

82 KB

22 чел.

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

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

Кафедра ЭВМ

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


 

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

67475. КРИЗИС СЕРЕДИНЫ ЖИЗНИ 205.5 KB
  Проблема возраста всегда актуальна, как для каждого отдельного человека, так и для всего общества в целом. Переход из одного возрастного периода в другой является судьбоносным и определяет всю дальнейшую жизнь.
67476. Становление личностного новообразования периода кризиса трех лет 125.5 KB
  Кризисов, которые будет преодолевать ребенок несколько: это кризис новорожденности, кризис одного года, трех лет, семи лет, кризис подросткового возраста. Время их возникновения зависит от конкретного ребенка и условий его жизни. Общим для всех кризисов развития являются несколько основных критериев: острый период, трудновоспитуемость, впечатление регресса.
67477. Суперкомпьютер SuperMUC 600 KB
  Производительность суперкомпьютеров чаще всего оценивается и выражается в количестве операций с плавающей точкой в секунду (FLOPS). Это связано с тем, что задачи численного моделирования, под которые и создаются суперкомпьютеры, чаще всего требуют вычислений, связанных с вещественными числами с высокой степенью точности
67478. ОСНОВЫ КВАЗИРЕЛЯТИВИСТСКОЙ КВАНТОВОЙ ТЕОРИИ. УРАВНЕНИЕ ДИРАКА 147.5 KB
  Первое слагаемое - вероятность найти частицу с положительной энергией, второе - с отрицательной энергией. Видим, что сохраняется только сумма этих вероятностей. Поэтому состояния с отрицательными энергиями нельзя просто выбросить - сразу нарушится вероятностная интерпретация.
67479. ВЗАИМОДЕЙСТВИЕ ЧАСТИЦ С ВНЕШНИМ ЭЛЕКТРОМАГНИТНЫМ ПОЛЕМ. УРАВНЕНИЕ ПАУЛИ 250 KB
  Вернемся к уравнению Клейна-Гордона - релятивистскому уравнению второго порядка, которому должна подчиняться любая волновая функция. Из него было ранее получено уравнение непрерывности
67480. ЭЛЕКТРОН В ЭЛЕКТРОСТАТИЧЕСКОМ ПОЛЕ 550.5 KB
  Имея полный гамильтониан, легко убедиться, что он коммутирует с При этом не входит в уравнение, а потому по проекции полного момента будет вырождение. Энергетические уровни будут характеризоваться собственными значениями трех первых операторов...
67481. НАУКА “РОБОТОТЕХНІКА”, ІСТОРІЯ РОЗВИТКУ ТА ОСТАННІ ДОСЯГНЕННЯ 236 KB
  Робототехніка і гнучкі виробничі системи є найважливішою технічною основою інтенсифікації виробництва. Це, з одного боку, дітище науково-технічного прогресу, а з іншою — його рушійна сила в розвитку сучасного промислового виробництва.
67482. Завдання, організація та актуальні питання медичної служби Збройних Сил України на воєнний час 148 KB
  Навчальна та виховна мета: розкрити найбільш складні та актуальні питання щодо ролі та місця у військовій медицині наукової дисципліни організації медичного забезпечення військ; ознайомити з організаційною структурою медичної служби ЗС України та її завданнями на воєнний час...
67483. ПОНЯТТЯ ТА СИСТЕМА ПРИРОДНОРЕСУРСОВОГО ПРАВА 145 KB
  Наукове значення природи полягає в безкінечній різноманітності об’єктів та процесів, які її складають і потребують вивчення. Іншими словами, природа є важливим джерелом наукових знань, основою для розвитку різноманітних галузей науки.