69994

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

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

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

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

Русский

2014-10-13

82 KB

20 чел.

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

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

Кафедра ЭВМ

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


 

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

61414. Джанни Родари «Сакала – пакала» 25.68 KB
  Цель: Ознакомить детей с творчеством Джанни Родари. Задачи: 1. Ознакомить детей с содержанием произведения и обеспечить полноценное восприятие и понимание текста Джанни Родари «Сакала - пакала». 2. Продолжить совершенствование навыков полноценного чтения.
61415. Единый урок истории «История освоения Кузнецкого края в XII – XIX веков» 277.62 KB
  Русская экспансия в Южной Сибири Сибирь необъятный белозеленый континент за Уральским хребтом поле для героических подвигов русских переселенцев. Но как эта страна населенная весьма воинственными аборигенами оказалась в составе...
61417. Проблема выбора в экономике. Виды экономических ресурсов 89.38 KB
  Виды экономических ресурсов Экономика это выбор предпочтительного из возможного. Тот факт что отдельная вещь встречается редко или малодоступна для экономиста не определяется как ограниченность ресурсов.
61419. МАЛЫЕ ЖАНРЫ ФОЛЬКЛОРА 65.37 KB
  Фольклор — коллективное устное народное творчество. Малые жанры фольклора. Колыбельные песни, пестушки, приговорки, скороговорки, загадки, считалки, небылицы-перевертыши. Вариативная природа фольклора